ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzMGNiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzM2U1NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZTMzYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNNb24gTWFyIDA5IDIwOjM2OjQ1IEdNVCAyMDA5Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmFiYmVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC41LjEucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1FY2xpcHNlLUJ1ZGR5UG9saWN5OiByZWdpc3RlcmVkCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IsCi0gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZVBsdWdpbgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2YTAzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+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+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YTgyY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciAKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCAKLSAqIHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgCi0gKiB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1JFU1RSSUNURURfVE8gPSAicmVzdHJpY3RlZFRvIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNUUklDVEVEX1RPX0NMQVNTX09OTFkgPSAiQ0xBU1NfT05MWSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1RSSUNURURfVE9fSU5URVJGQUNFX09OTFkgPSAiSU5URVJGQUNFX09OTFkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNUUklDVEVEX1RPX0VOVU1fT05MWSA9ICJFTlVNX09OTFkiOwotICAgIAotICAgIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50OwotICAgIHByaXZhdGUgU3RyaW5nIGNhdGVnb3J5OwotICAgIHByaXZhdGUgU3RyaW5nIGFubm90YXRpb25DbGFzc05hbWU7Ci0gICAgcHJpdmF0ZSBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzOwotICAgIHByaXZhdGUgTGlzdDxFbGVtZW50VHlwZT4gdGFyZ2V0czsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciBhbm5vdGF0aW9uSW5pdGlhbGl6ZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcmVzdGljdGVkVG87Ci0gICAgcHJpdmF0ZSBib29sZWFuIGludGVyZmFjZU9ubHk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGNsYXNzT25seTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZW51bU9ubHk7Ci0gICAgCi0gICAgcHVibGljIEFubm90YXRpb25EZWZpbml0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCwgU3RyaW5nIGNhdGVnb3J5KSB7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbkVsZW1lbnQgPSBjb25maWd1cmF0aW9uRWxlbWVudDsKLSAgICAgICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OwotICAgICAgICAKLSAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2xhc3NOYW1lID0gQW5ub3RhdGlvbnNNYW5hZ2VyLmdldEF0dHJpYnV0ZVZhbHVlKGNvbmZpZ3VyYXRpb25FbGVtZW50LCBBVFRfQ0xBU1MpOwotICAgICAgICB0aGlzLm5hbWUgPSBBbm5vdGF0aW9uc01hbmFnZXIuZ2V0QXR0cmlidXRlVmFsdWUoY29uZmlndXJhdGlvbkVsZW1lbnQsIEFUVF9OQU1FKTsKLSAgICAgICAgdGhpcy5yZXN0aWN0ZWRUbyA9IEFubm90YXRpb25zTWFuYWdlci5nZXRBdHRyaWJ1dGVWYWx1ZShjb25maWd1cmF0aW9uRWxlbWVudCwgCi0gICAgICAgICAgICAgICAgQVRUX1JFU1RSSUNURURfVE8pOwotICAgICAgICB0aGlzLmNsYXNzT25seSA9IHJlc3RpY3RlZFRvLmVxdWFscyhSRVNUUklDVEVEX1RPX0NMQVNTX09OTFkpOwotICAgICAgICB0aGlzLmludGVyZmFjZU9ubHkgPSByZXN0aWN0ZWRUby5lcXVhbHMoUkVTVFJJQ1RFRF9UT19JTlRFUkZBQ0VfT05MWSk7Ci0gICAgICAgIHRoaXMuZW51bU9ubHkgPSByZXN0aWN0ZWRUby5lcXVhbHMoUkVTVFJJQ1RFRF9UT19FTlVNX09OTFkpOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLSAgICAgICAgcmV0dXJuIGNhdGVnb3J5OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25DbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uQ2xhc3NOYW1lOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NsYXNzT25seSgpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzT25seTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2VPbmx5KCkgewotICAgICAgICByZXR1cm4gaW50ZXJmYWNlT25seTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbnVtT25seSgpIHsKLSAgICAgICAgcmV0dXJuIGVudW1Pbmx5OwotICAgIH0KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGdldEFubm90YXRpb25DbGFzcygpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25DbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENsYXNzPD8+IGFDbGFzcyA9IENsYXNzLmZvck5hbWUoYW5ub3RhdGlvbkNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGFDbGFzcy5pc0Fubm90YXRpb24oKSkgewotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uQ2xhc3MgPSAoQ2xhc3M8amF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4pQ2xhc3MuZm9yTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uQ2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgewotICAgICAgICAgICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5sb2coY25mZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25DbGFzczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3Q8RWxlbWVudFR5cGU+IGdldFRhcmdldHMoKSB7Ci0gICAgICAgIGlmICh0YXJnZXRzID09IG51bGwpIHsKLSAgICAgICAgCXRhcmdldHMgPSBuZXcgTGlua2VkTGlzdDxFbGVtZW50VHlwZT4oKTsKLSAgICAgICAgCQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uQ2xhc3MoKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIAlUYXJnZXQgdGFyZ2V0ID0gYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uKFRhcmdldC5jbGFzcyk7Ci0gICAgICAgICAgICAJaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAJICAgIHRhcmdldHMuYWRkQWxsKEFycmF5cy5hc0xpc3QodGFyZ2V0LnZhbHVlKCkpKTsKLSAgICAgICAgICAgIAkgICAgCi0gICAgICAgICAgICAgICAgICAgIExpc3Q8RWxlbWVudFR5cGU+IGZpbHRlcmVkVGFyZ2V0cyA9IEFubm90YXRpb25zTWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWx0ZXJlZFRhcmdldHMoY29uZmlndXJhdGlvbkVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0cy5jb250YWluc0FsbChmaWx0ZXJlZFRhcmdldHMpICYmIGZpbHRlcmVkVGFyZ2V0cy5zaXplKCkgPCB0YXJnZXRzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cy5yZW1vdmVBbGwoZmlsdGVyZWRUYXJnZXRzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgCX0gCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRhcmdldHM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIGdldEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcigpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25Jbml0aWFsaXplciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCA9IAotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uc01hbmFnZXIuZ2V0QW5ub3RhdGlvbkluaXRpYWxpemVyQ2FjaGUoKS5nZXQoZ2V0QW5ub3RhdGlvbkNsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbkVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uSW5pdGlhbGl6ZXIgPSAoSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciljb25maWd1cmF0aW9uRWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0NMQVNTKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25Jbml0aWFsaXplcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzgyZThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvb2xlYW5MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bWJlckxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlF1YWxpZmllZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsOwotLyoqCi0gKiAKLSAqIDxwPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciAKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCAKLSAqIHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgCi0gKiB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbm5vdGF0aW9uc0NvcmUgewotCi0gICAgcHJpdmF0ZSBBbm5vdGF0aW9uc0NvcmUoKSB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbiBjcmVhdGVBbm5vdGF0aW9uKEFTVCBhc3QsCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzLAotICAgICAgICAgICAgU3RyaW5nIGFubm90YXRpb25OYW1lLAotICAgICAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMpIHsKLQotICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhc3QubmV3Tm9ybWFsQW5ub3RhdGlvbigpOwotICAgICAgICAKLSAgICAgICAgTmFtZSBhbm5vdGF0aW9uVHlwZU5hbWUgPSBhc3QubmV3TmFtZShhbm5vdGF0aW9uTmFtZSk7Ci0gICAgICAgIAotICAgICAgICBhbm5vdGF0aW9uLnNldFR5cGVOYW1lKGFubm90YXRpb25UeXBlTmFtZSk7Ci0KLSAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyIDogbWVtYmVyVmFsdWVQYWlycykgewotICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBhbm5vdGF0aW9uVmFsdWVzID0gYW5ub3RhdGlvbi52YWx1ZXMoKTsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVmFsdWVzLmFkZChtZW1iZXJWYWx1ZVBhaXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWVtYmVyVmFsdWVQYWlyIGNyZWF0ZU1lbWJlclZhbHVlUGFpcihBU1QgYXN0LCBTdHJpbmcgbmFtZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0gICAgICAgIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgPSBhc3QubmV3TWVtYmVyVmFsdWVQYWlyKCk7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpci5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKG5hbWUpKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlyLnNldFZhbHVlKGV4cHJlc3Npb24pOwotICAgICAgICByZXR1cm4gbWVtYmVyVmFsdWVQYWlyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWVtYmVyVmFsdWVQYWlyIGNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihBU1QgYXN0LCBTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzdHJpbmdNZW1iZXJWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTWVtYmVyVmFsdWVQYWlyKGFzdCwgbmFtZSwKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTGl0ZXJhbChhc3QsIHZhbHVlLnRvU3RyaW5nKCkpKTsKLQotICAgICAgICByZXR1cm4gc3RyaW5nTWVtYmVyVmFsdWVQYWlyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWVtYmVyVmFsdWVQYWlyIGNyZWF0ZUJvb2xlYW5NZW1iZXJWYWx1ZVBhaXIoQVNUIGFzdCwgU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgYm9vbGVhblZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVNZW1iZXJWYWx1ZVBhaXIoYXN0LCBuYW1lLCBBbm5vdGF0aW9uc0NvcmUKLSAgICAgICAgICAgICAgICAuY3JlYXRlQm9vbGVhbkxpdGVyYWwoYXN0LCAoKEJvb2xlYW4pdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKSk7Ci0KLSAgICAgICAgcmV0dXJuIGJvb2xlYW5WYWx1ZVBhaXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgTWVtYmVyVmFsdWVQYWlyIGNyZWF0ZU51bWJlck1lbWJlclZhbHVlUGFpcihBU1QgYXN0LCBTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIE1lbWJlclZhbHVlUGFpciBwcmltaXRpdmVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTWVtYmVyVmFsdWVQYWlyKGFzdCwgbmFtZSwgCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU51bWJlckxpdGVyYWwoYXN0LCB2YWx1ZS50b1N0cmluZygpKSk7Ci0gICAgICAgIHJldHVybiBwcmltaXRpdmVWYWx1ZVBhaXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgTWVtYmVyVmFsdWVQYWlyIGNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoQVNUIGFzdCwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG5hbWUsIAotICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU1lbWJlclZhbHVlUGFpcihhc3QsIG5hbWUsIGNyZWF0ZUVudW1MaXRlcmFsKGFzdCwgY2xhc3NOYW1lLCB2YWx1ZSkpOyAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgTWVtYmVyVmFsdWVQYWlyIGNyZWF0ZVR5cGVNZW1iZXJWYWx1ZVBhaXIoQVNUIGFzdCwgU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU1lbWJlclZhbHVlUGFpcihhc3QsIG5hbWUsCi0gICAgICAgICAgICAgICAgY3JlYXRlVHlwZUxpdGVyYWwoYXN0LCB2YWx1ZSkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIE1lbWJlclZhbHVlUGFpciBjcmVhdGVBcnJheU1lbWJlclZhbHVlUGFpcihBU1QgYXN0LCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSB2YWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVNZW1iZXJWYWx1ZVBhaXIoYXN0LCBtZXRob2QuZ2V0TmFtZSgpLCBjcmVhdGVBcnJheVZhbHVlTGl0ZXJhbChhc3QsIAotICAgICAgICAgICAgICAgIG1ldGhvZCwgdmFsdWVzKSk7Ci0gICAgIH0KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIEFycmF5SW5pdGlhbGl6ZXIgY3JlYXRlQXJyYXlWYWx1ZUxpdGVyYWwoQVNUIGFzdCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gdmFsdWVzKSB7Ci0gICAgICAgIEFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplciA9IGFzdC5uZXdBcnJheUluaXRpYWxpemVyKCk7Ci0gICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgLy9UT0RPIEhhbmRsZSB0aGlzIHNpdHVhdGlvbi4gQXJpc2VzIHdoZW4gYW5ub3RhdGlvbnMgYXJlIHNwZWNpZmllZCBhcyBkZWZhdWx0cyBpbiBhcnJheSBpbml0aWFsaXplcnMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzID0gCi0gICAgICAgICAgICAgICAgIChDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4pIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpOwotCi0gICAgICAgICAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICAgICAgICAgIExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzTGlzdCA9IChMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+KSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvcjxNYXA8U3RyaW5nLCBPYmplY3Q+PiB2YWx1ZXNJdGVyYXRvciA9IHZhbHVlc0xpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAodmFsdWVzSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gYW5ub3RhdGlvbk1hcCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSB2YWx1ZXNJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFNldDxFbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJ5U2V0ID0gYW5ub3RhdGlvbk1hcC5lbnRyeVNldCgpOwotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+PiBpdGVyYXRvciA9IGVudHJ5U2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxqYXZhLmxhbmcuU3RyaW5nLCBPYmplY3Q+IGVudHJ5ID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lbWJlck5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIGFubm90YXRpb25NZXRob2QgPSBhbm5vdGF0aW9uQ2xhc3MuZ2V0TWV0aG9kKG1lbWJlck5hbWUsIG5ldyBDbGFzc1swXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb25NZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbWVtYmVyVmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiByZXR1cm5UeXBlID0gYW5ub3RhdGlvbk1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChjcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCBtZW1iZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhCb29sZWFuLlRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChjcmVhdGVCb29sZWFuTWVtYmVyVmFsdWVQYWlyKGFzdCwgbWVtYmVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQ2xhc3MuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gbWVtYmVyVmFsdWUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc05hbWUuZW5kc1dpdGgoIi5jbGFzcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTWVtYmVyVmFsdWVQYWlyKGFzdCwgbWVtYmVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlVHlwZUxpdGVyYWwoYXN0LCBjbGFzc05hbWUpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKGdldE51bWJlck1lbWJlclZhbHVlUGFpcihhc3QsIG1lbWJlck5hbWUsIG1lbWJlclZhbHVlKSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmxvZyhzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5sb2cobnNtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXJyYXlJbml0aWFsaXplci5leHByZXNzaW9ucygpLmFkZChjcmVhdGVBbm5vdGF0aW9uKGFzdCwgYW5ub3RhdGlvbkNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZhbHVlLmVxdWFscyhDbGFzcy5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICBhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCkuYWRkKGNyZWF0ZVR5cGVMaXRlcmFsKGFzdCwgdmFsdWUudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RyaW5nVmFsdWUuZW5kc1dpdGgoIi5jbGFzcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFycmF5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMoKS5hZGQoY3JlYXRlVHlwZUxpdGVyYWwoYXN0LCBzdHJpbmdWYWx1ZS5zdWJzdHJpbmcoMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdWYWx1ZS5sYXN0SW5kZXhPZigiLiIpKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFycmF5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMoKS5hZGQoY3JlYXRlU3RyaW5nTGl0ZXJhbChhc3QsIHN0cmluZ1ZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhcnJheUluaXRpYWxpemVyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIE5hbWUgY3JlYXRlRW51bUxpdGVyYWwoQVNUIGFzdCwgU3RyaW5nIGNsYXNzTmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIFF1YWxpZmllZE5hbWUgZW51bU5hbWUgPSBudWxsOwotICAgICAgICBTaW1wbGVOYW1lIGVudW1DbGFzc05hbWUgPSBhc3QubmV3U2ltcGxlTmFtZSh2YWx1ZS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0gICAgICAgIFNpbXBsZU5hbWUgZW51bUxpdGVyYWwgPSBhc3QubmV3U2ltcGxlTmFtZSh2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgaWYgKHZhbHVlLmdldENsYXNzKCkuaXNNZW1iZXJDbGFzcygpKSB7Ci0gICAgICAgICAgICBOYW1lIGVudW1FbmNsb3NpbmdDbGFzc05hbWUgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIGVuY2xvc2luZ0NsYXNzTmFtZSA9IHZhbHVlLmdldENsYXNzKCkuZ2V0RW5jbG9zaW5nQ2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoZW5jbG9zaW5nQ2xhc3NOYW1lLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZW51bUVuY2xvc2luZ0NsYXNzTmFtZSA9IGFzdC5uZXdTaW1wbGVOYW1lKHZhbHVlLmdldENsYXNzKCkuZ2V0RW5jbG9zaW5nQ2xhc3MoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNpbXBsZU5hbWUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVudW1FbmNsb3NpbmdDbGFzc05hbWUgPSBhc3QubmV3TmFtZShlbmNsb3NpbmdDbGFzc05hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gYXN0Lm5ld1F1YWxpZmllZE5hbWUoZW51bUVuY2xvc2luZ0NsYXNzTmFtZSwgZW51bUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBlbnVtTmFtZSA9IGFzdC5uZXdRdWFsaWZpZWROYW1lKHF1YWxpZmllZE5hbWUsIGVudW1MaXRlcmFsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE5hbWUgcXVhbGlmaWVkTmFtZSA9IGFzdC5uZXdOYW1lKHZhbHVlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLSAgICAgICAgICAgIGVudW1OYW1lID0gYXN0Lm5ld1F1YWxpZmllZE5hbWUocXVhbGlmaWVkTmFtZSwgZW51bUxpdGVyYWwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbnVtTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFR5cGVMaXRlcmFsIGNyZWF0ZVR5cGVMaXRlcmFsKEFTVCBhc3QsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBUeXBlTGl0ZXJhbCB0eXBlTGl0ZXJhbCA9IG51bGw7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENsYXNzKSB7Ci0gICAgICAgICAgICB0eXBlTGl0ZXJhbCA9IGNyZWF0ZVR5cGVMaXRlcmFsKGFzdCwgKENsYXNzPD8+KSB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICB0eXBlTGl0ZXJhbCA9IGNyZWF0ZVR5cGVMaXRlcmFsKGFzdCwgKFN0cmluZykgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0eXBlTGl0ZXJhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFR5cGVMaXRlcmFsIGNyZWF0ZVR5cGVMaXRlcmFsKEFTVCBhc3QsIENsYXNzPD8+IHZhbHVlKSB7Ci0gICAgICAgIFR5cGVMaXRlcmFsIHR5cGVMaXRlcmFsID0gYXN0Lm5ld1R5cGVMaXRlcmFsKCk7Ci0KLSAgICAgICAgQ2xhc3M8Pz4gYUNsYXNzID0gKENsYXNzPD8+KXZhbHVlOwotICAgICAgICBTaW1wbGVOYW1lIGNsYXNzTmFtZSA9IGFzdC5uZXdTaW1wbGVOYW1lKGFDbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwotCi0gICAgICAgIGlmIChhQ2xhc3MuaXNNZW1iZXJDbGFzcygpKSB7Ci0gICAgICAgICAgICBOYW1lIGVuY2xvc2luZ0NsYXNzTmFtZSA9IGFzdC5uZXdOYW1lKGFDbGFzcy5nZXRFbmNsb3NpbmdDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7Ci0gICAgICAgICAgICBRdWFsaWZpZWRUeXBlIHF1YWxpZmllZFR5cGUgPSBhc3QubmV3UXVhbGlmaWVkVHlwZShhc3QubmV3U2ltcGxlVHlwZShlbmNsb3NpbmdDbGFzc05hbWUpLCBjbGFzc05hbWUpOwotICAgICAgICAgICAgdHlwZUxpdGVyYWwuc2V0VHlwZShxdWFsaWZpZWRUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiB0eXBlTGl0ZXJhbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlVHlwZUxpdGVyYWwoYXN0LCB2YWx1ZS5nZXRDYW5vbmljYWxOYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVHlwZUxpdGVyYWwgY3JlYXRlVHlwZUxpdGVyYWwoQVNUIGFzdCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIFR5cGVMaXRlcmFsIHR5cGVMaXRlcmFsID0gYXN0Lm5ld1R5cGVMaXRlcmFsKCk7Ci0KLSAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoIi4iKSA9PSAtMSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB0eXBlTGl0ZXJhbC5zZXRUeXBlKGFzdC5uZXdTaW1wbGVUeXBlKGFzdC5uZXdTaW1wbGVOYW1lKHZhbHVlKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHF1YWxpZmllciA9IHZhbHVlLnN1YnN0cmluZygwLCB2YWx1ZS5sYXN0SW5kZXhPZigiLiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgU3RyaW5nIGlkZW50aWZpZXIgPSB2YWx1ZS5zdWJzdHJpbmcodmFsdWUubGFzdEluZGV4T2YoIi4iKSArIDEpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAocXVhbGlmaWVyLmVxdWFscygiamF2YS5sYW5nIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHR5cGVMaXRlcmFsLnNldFR5cGUoYXN0Lm5ld1NpbXBsZVR5cGUoYXN0Lm5ld1NpbXBsZU5hbWUoaWRlbnRpZmllcikpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHlwZUxpdGVyYWwuc2V0VHlwZShhc3QubmV3UXVhbGlmaWVkVHlwZShhc3QubmV3U2ltcGxlVHlwZShhc3QubmV3TmFtZShxdWFsaWZpZXIpKSwgYXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmV3U2ltcGxlTmFtZShpZGVudGlmaWVyKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0eXBlTGl0ZXJhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ0xpdGVyYWwgY3JlYXRlU3RyaW5nTGl0ZXJhbChBU1QgYXN0LCBTdHJpbmcgbGl0ZXJhbFZhbHVlKSB7Ci0gICAgICAgIFN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0gICAgICAgIHN0cmluZ0xpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKGxpdGVyYWxWYWx1ZSk7Ci0gICAgICAgIHJldHVybiBzdHJpbmdMaXRlcmFsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQm9vbGVhbkxpdGVyYWwgY3JlYXRlQm9vbGVhbkxpdGVyYWwoQVNUIGFzdCwgYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBCb29sZWFuTGl0ZXJhbCBib29sZWFuTGl0ZXJhbCA9IGFzdC5uZXdCb29sZWFuTGl0ZXJhbCh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBib29sZWFuTGl0ZXJhbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBOdW1iZXJMaXRlcmFsIGNyZWF0ZU51bWJlckxpdGVyYWwoQVNUIGFzdCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIE51bWJlckxpdGVyYWwgcHJpbWl0aXZlTGl0ZXJhbCA9IGFzdC5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0gICAgICAgIHByaW1pdGl2ZUxpdGVyYWwuc2V0VG9rZW4odmFsdWUpOwotICAgICAgICByZXR1cm4gcHJpbWl0aXZlTGl0ZXJhbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDA0Njc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIAotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IAotICogdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyAKLSAqIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc0NvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbnNDb3JlUGx1Z2luIHBsdWdpbjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEFubm90YXRpb25zQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgcmV0dXJuIHBsdWdpbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIHBsdWdpbiA9IHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwbHVnaW4gPSBudWxsOwotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFubm90YXRpb25zQ29yZVBsdWdpbi5QTFVHSU5fSUQsIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhM2E5ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciAKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCAKLSAqIHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgCi0gKiB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbm5vdGF0aW9uc01hbmFnZXIgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT05fREVGSU5JVElPTiA9ICJhbm5vdGF0aW9uRGVmaW5pdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX0NBVEVHT1JZID0gImFubm90YXRpb25DYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX0lOSVRJQUxJWkVSID0gImFubm90YXRpb25Jbml0aWFsaXplciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX1BST0NFU1NPUiA9ICJhbm5vdGF0aW9uUHJvY2Vzc29yIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT04gPSAiYW5ub3RhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25DYWNoZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBhbm5vdGF0aW9uQ2F0ZWdvcnlDYWNoZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgSUNvbmZpZ3VyYXRpb25FbGVtZW50PiBhbm5vdGF0aW9uSW5pdGlhbGl6ZXJDYWNoZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+PiBhbm5vdGF0aW9uUHJvY2Vzc29yQ2FjaGUgPSBudWxsOwotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+PiBhbm5vdGF0aW9uc0J5Q2F0ZWdvcnlNYXAgPSBudWxsOwotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uQ2xhc3NOYW1lVG9EZWZpbml0aW9uTWFwOwotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uU2ltcGxlTmFtZVRvRGVmaW5pdGlvbk1hcDsKLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvblF1YWxpZmllZE5hbWVUb0RlZmluaXRpb25NYXA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0FURUdPUlkgPSAiY2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fVEFSR0VUX0ZJTFRFUiA9ICJ0YXJnZXRGaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UQVJHRVQgPSAidGFyZ2V0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBBbm5vdGF0aW9uc01hbmFnZXIoKSB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGdldEFubm90YXRpb25zKCkgewotICAgICAgICBpZiAoYW5ub3RhdGlvbkNhY2hlID09IG51bGwpIHsKLSAgICAgICAgICAgIGFubm90YXRpb25DYWNoZSA9IG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIElFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5QTFVHSU5fSUQsIEFOTk9UQVRJT05fREVGSU5JVElPTik7Ci0gICAgICAgICAgICBpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gZXh0ZW5zaW9uUG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEFOTk9UQVRJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA9IG5ldyBBbm5vdGF0aW9uRGVmaW5pdGlvbihlbGVtZW50LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbkNhdGVnb3J5KGdldEF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIEFUVF9DQVRFR09SWSkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25DYWNoZS5hZGQoYW5ub3RhdGlvbkRlZmluaXRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uQ2FjaGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3RbXSBnZXRBbm5vdGF0aW9ucyhPYmplY3QgZWxlbWVudCkgewotICAgICAgICBMaXN0PENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gYW5ub3RhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4oKTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uRGVmaW5pdGlvbnMgPSBnZXRBbGxBbm5vdGF0aW9uc0ZvckVsZW1lbnQoZWxlbWVudCk7Ci0gICAgICAgIAotICAgICAgICAgICAgZmlsdGVyQW5ub3RhdGlvbnNMaXN0KGVsZW1lbnQsIGFubm90YXRpb25EZWZpbml0aW9ucyk7Ci0gICAgICAgIAotICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA6IGFubm90YXRpb25EZWZpbml0aW9ucykgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXRBbm5vdGF0aW9uQ2xhc3MoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfSAgCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9ucy50b0FycmF5KCk7ICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIE1hcDxTdHJpbmcsIEFubm90YXRpb25EZWZpbml0aW9uPiAKLSAgICAgICAgICAgIGdldEFubm90YXRpb25Ub0NsYXNzTmFtZURlZmluaXRpb25NYXAoKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgaWYgKGFubm90YXRpb25DbGFzc05hbWVUb0RlZmluaXRpb25NYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvbkRlZmluaXRpb25zID0gZ2V0QW5ub3RhdGlvbnMoKTsKLQotICAgICAgICAgICAgYW5ub3RhdGlvbkNsYXNzTmFtZVRvRGVmaW5pdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlZmluaXRpb24+KCk7Ci0KLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gOiBhbm5vdGF0aW9uRGVmaW5pdGlvbnMpIHsKLSAgICAgICAgICAgIAlhbm5vdGF0aW9uQ2xhc3NOYW1lVG9EZWZpbml0aW9uTWFwLnB1dChhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXRBbm5vdGF0aW9uQ2xhc3MoKQotCQkJCQkJLmdldENhbm9uaWNhbE5hbWUoKSwgYW5ub3RhdGlvbkRlZmluaXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uQ2xhc3NOYW1lVG9EZWZpbml0aW9uTWFwOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlZmluaXRpb24+IGdldFNpbXBsZU5hbWVUb0RlZmluaXRpb25NYXAoKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uU2ltcGxlTmFtZVRvRGVmaW5pdGlvbk1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uRGVmaW5pdGlvbnMgPSBnZXRBbm5vdGF0aW9ucygpOwotCi0gICAgICAgICAgICBhbm5vdGF0aW9uU2ltcGxlTmFtZVRvRGVmaW5pdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlZmluaXRpb24+KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gOiBhbm5vdGF0aW9uRGVmaW5pdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uU2ltcGxlTmFtZVRvRGVmaW5pdGlvbk1hcC5wdXQoYW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0TmFtZSgpLCBhbm5vdGF0aW9uRGVmaW5pdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25TaW1wbGVOYW1lVG9EZWZpbml0aW9uTWFwOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlZmluaXRpb24+IGdldFF1YWxpZmllZE5hbWVUb0RlZmluaXRpb25NYXAoKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uUXVhbGlmaWVkTmFtZVRvRGVmaW5pdGlvbk1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uRGVmaW5pdGlvbnMgPSBnZXRBbm5vdGF0aW9ucygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhbm5vdGF0aW9uUXVhbGlmaWVkTmFtZVRvRGVmaW5pdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlZmluaXRpb24+KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gOiBhbm5vdGF0aW9uRGVmaW5pdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUXVhbGlmaWVkTmFtZVRvRGVmaW5pdGlvbk1hcC5wdXQoYW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0QW5ub3RhdGlvbkNsYXNzTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlZmluaXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uUXVhbGlmaWVkTmFtZVRvRGVmaW5pdGlvbk1hcDsKLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBnZXRBbm5vdGF0aW9uRGVmaW5pdGlvbkZvckNsYXNzKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3MgJiYgKChDbGFzczw/PillbGVtZW50KS5pc0Fubm90YXRpb24oKSkgewotCQkJcmV0dXJuIGdldEFubm90YXRpb25Ub0NsYXNzTmFtZURlZmluaXRpb25NYXAoKS5nZXQoCi0JCQkJCSgoQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+KSBlbGVtZW50KS5nZXRDYW5vbmljYWxOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgZ2V0QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyRm9yTmFtZShOYW1lIG5hbWUpIHsKLSAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG5hbWUuaXNTaW1wbGVOYW1lKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U2ltcGxlTmFtZVRvRGVmaW5pdGlvbk1hcCgpLmdldCgoKFNpbXBsZU5hbWUpbmFtZSkuZ2V0SWRlbnRpZmllcigpKQotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuaXNRdWFsaWZpZWROYW1lKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UXVhbGlmaWVkTmFtZVRvRGVmaW5pdGlvbk1hcCgpLmdldChuYW1lLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25Gb3JDbGFzcyhDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gCi0gICAgICAgICAgICBhbm5vdGF0aW9uQ2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25Ub0NsYXNzTmFtZURlZmluaXRpb25NYXAoKS5nZXQoYW5ub3RhdGlvbkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGdldEFubm90YXRpb25zQnlDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnlOYW1lKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uc0J5Q2F0ZWdvcnlNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgYW5ub3RhdGlvbnNCeUNhdGVnb3J5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPj4oKTsKLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gOiBnZXRBbm5vdGF0aW9ucygpKSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvbkRlZmluaXRpb25MaXN0ID0gYW5ub3RhdGlvbnNCeUNhdGVnb3J5TWFwLmdldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25EZWZpbml0aW9uLmdldENhdGVnb3J5KCkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uRGVmaW5pdGlvbkxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRGVmaW5pdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPigpOwotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRGVmaW5pdGlvbkxpc3QuYWRkKGFubm90YXRpb25EZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnNCeUNhdGVnb3J5TWFwLnB1dChhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXRDYXRlZ29yeSgpLCAKLSAgICAgICAgICAgICAgICAgICAgCQlhbm5vdGF0aW9uRGVmaW5pdGlvbkxpc3QpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlZmluaXRpb25MaXN0LmFkZChhbm5vdGF0aW9uRGVmaW5pdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25zQnlDYXRlZ29yeU1hcC5nZXQoY2F0ZWdvcnlOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRBbm5vdGF0aW9uQ2F0ZWdvcmllcygpIHsKLSAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoZ2V0QW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGUoKS52YWx1ZXMoKS50b0FycmF5KAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbZ2V0QW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGUoKS5zaXplKCldKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeUlkKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vdGF0aW9uQ2F0ZWdvcnlDYWNoZSgpLmdldChjYXRlZ29yeUlkKTsgICAgICAgIAotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEFubm90YXRpb25DYXRlZ29yeUNhY2hlKCkgewotICAgICAgICBpZiAoYW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25DYXRlZ29yeUNhY2hlOwotICAgICAgICB9Ci0KLSAgICAgICAgYW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgCi0gICAgICAgIElFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLlBMVUdJTl9JRCwgQU5OT1RBVElPTl9DQVRFR09SWSk7Ci0gICAgICAgIGlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvblBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGUucHV0KGdldEF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIEFUVF9JRCksIAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QXR0cmlidXRlVmFsdWUoZWxlbWVudCwgQVRUX05BTUUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIE1hcDxTdHJpbmcsIElDb25maWd1cmF0aW9uRWxlbWVudD4gZ2V0QW5ub3RhdGlvbkluaXRpYWxpemVyQ2FjaGUoKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uSW5pdGlhbGl6ZXJDYWNoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkluaXRpYWxpemVyQ2FjaGU7Ci0gICAgICAgIH0KLQotICAgICAgICBhbm5vdGF0aW9uSW5pdGlhbGl6ZXJDYWNoZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgSUNvbmZpZ3VyYXRpb25FbGVtZW50PigpOwotICAgICAgICAKLSAgICAgICAgSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludCgKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uc0NvcmVQbHVnaW4uUExVR0lOX0lELCBBTk5PVEFUSU9OX0lOSVRJQUxJWkVSKTsKLSAgICAgICAgaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gZXh0ZW5zaW9uUG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uSW5pdGlhbGl6ZXJDYWNoZS5wdXQoZ2V0QXR0cmlidXRlVmFsdWUoZWxlbWVudCwgQU5OT1RBVElPTiksIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25Jbml0aWFsaXplckNhY2hlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBNYXA8U3RyaW5nLCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4+IGdldEFubm90YXRpb25Qcm9jZXNzb3JzQ2FjaGUoKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uUHJvY2Vzc29yQ2FjaGUgPT0gbnVsbCkgewotICAgICAgICAgICAgYW5ub3RhdGlvblByb2Nlc3NvckNhY2hlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4+KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIElFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5QTFVHSU5fSUQsIEFOTk9UQVRJT05fUFJPQ0VTU09SKTsKLSAgICAgICAgICAgIGlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb25Qb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJwcm9jZXNzb3IiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFubm90YXRpb25LZXkgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBBTk5PVEFUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBjb25maWd1cmF0aW9uRWxlbWVudHMgPSBhbm5vdGF0aW9uUHJvY2Vzc29yQ2FjaGUuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgCQlhbm5vdGF0aW9uS2V5KTsgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbkVsZW1lbnRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9jZXNzb3JDYWNoZS5wdXQoYW5ub3RhdGlvbktleSwgY29uZmlndXJhdGlvbkVsZW1lbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25FbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25Qcm9jZXNzb3JDYWNoZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0gICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBjb25maWd1cmF0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PEVsZW1lbnRUeXBlPiBnZXRGaWx0ZXJlZFRhcmdldHMoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50KSB7Ci0gICAgICAgIExpc3Q8RWxlbWVudFR5cGU+IHRhcmdldHMgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnRUeXBlPig3KTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGRlcHJlY2F0ZWRUYXJnZXRzID0gY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0Q2hpbGRyZW4oRUxFTV9UQVJHRVRfRklMVEVSKTsKLSAgICAgICAgICAgIGZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGRlcHJlY2F0ZWRUYXJnZXRFbGVtZW50IDogZGVwcmVjYXRlZFRhcmdldHMpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0ID0gQW5ub3RhdGlvbnNNYW5hZ2VyLmdldEF0dHJpYnV0ZVZhbHVlKGRlcHJlY2F0ZWRUYXJnZXRFbGVtZW50LCBBVFRfVEFSR0VUKTsKLSAgICAgICAgICAgICAgICB0YXJnZXRzLmFkZChFbGVtZW50VHlwZS52YWx1ZU9mKHRhcmdldCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uc0NvcmVQbHVnaW4ubG9nKGlhZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRhcmdldHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZ2V0QWxsQW5ub3RhdGlvbnNGb3JFbGVtZW50KE9iamVjdCBlbGVtZW50KSAKLSAgICAgICAgICAgIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbnNGb3JFbGVtZW50VHlwZShFbGVtZW50VHlwZS5QQUNLQUdFKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgewotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSkgZWxlbWVudDsKLSAgICAgICAgICAgIGlmICh0eXBlLmlzQW5ub3RhdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25zRm9yRWxlbWVudFR5cGUoRWxlbWVudFR5cGUuQU5OT1RBVElPTl9UWVBFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBnZXRBbm5vdGF0aW9uc0ZvckVsZW1lbnRUeXBlKEVsZW1lbnRUeXBlLlRZUEUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWVsZCkgewotICAgICAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25zRm9yRWxlbWVudFR5cGUoRWxlbWVudFR5cGUuRklFTEQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRBbm5vdGF0aW9uc0ZvckVsZW1lbnRUeXBlKEVsZW1lbnRUeXBlLk1FVEhPRCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25zRm9yRWxlbWVudFR5cGUoRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9jYWxWYXJpYWJsZSkgewotICAgICAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25zRm9yRWxlbWVudFR5cGUoRWxlbWVudFR5cGUuTE9DQUxfVkFSSUFCTEUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbnNGb3JFbGVtZW50VHlwZShFbGVtZW50VHlwZS5BTk5PVEFUSU9OX1RZUEUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGdldEFubm90YXRpb25zRm9yRWxlbWVudFR5cGUoRWxlbWVudFR5cGUgZWxlbWVudFR5cGUpIHsKLSAgICAgICAgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvbkRlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4oKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChhbm5vdGF0aW9uQ2FjaGUgPT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbnMoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA6IGFubm90YXRpb25DYWNoZSkgewotICAgICAgICAgICAgaWYgKGFubm90YXRpb25EZWZpbml0aW9uLmdldFRhcmdldHMoKS5jb250YWlucyhlbGVtZW50VHlwZSkgJiYgCi0gICAgICAgICAgICAgICAgICAgICFpc0RlcHJlY2F0ZWQoYW5ub3RhdGlvbkRlZmluaXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlZmluaXRpb25zLmFkZChhbm5vdGF0aW9uRGVmaW5pdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25EZWZpbml0aW9uczsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWx0ZXJBbm5vdGF0aW9uc0xpc3QoT2JqZWN0IGVsZW1lbnQsIAotICAgICAgICBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uRGVmaW5pdGlvbnMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBJdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvbkl0ZXIgPSBhbm5vdGF0aW9uRGVmaW5pdGlvbnMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGFubm90YXRpb25JdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gPSBhbm5vdGF0aW9uSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKLSAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKSBlbGVtZW50OwotICAgICAgICAgICAgICAgIGlmIChpc0NsYXNzUmVzdHJpY3RlZCh0eXBlLCBhbm5vdGF0aW9uRGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlzSW50ZXJmYWNlUmVzdHJpY3RlZCh0eXBlLCBhbm5vdGF0aW9uRGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlzRW51bVJlc3RyaWN0ZWQodHlwZSwgYW5ub3RhdGlvbkRlZmluaXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25JdGVyLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkgewotICAgICAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5pc01haW5NZXRob2QoKSkgewotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uSXRlci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICFhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXRUYXJnZXRzKCkuY29udGFpbnMoRWxlbWVudFR5cGUuQ09OU1RSVUNUT1IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25JdGVyLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc0NsYXNzUmVzdHJpY3RlZChtZXRob2QsIGFubm90YXRpb25EZWZpbml0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNJbnRlcmZhY2VSZXN0cmljdGVkKG1ldGhvZCwgYW5ub3RhdGlvbkRlZmluaXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBpc0VudW1SZXN0cmljdGVkKG1ldGhvZCwgYW5ub3RhdGlvbkRlZmluaXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25JdGVyLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmllbGQpIHsKLSAgICAgICAgICAgICAgICBpZihpc0NsYXNzUmVzdHJpY3RlZCgoSUZpZWxkKSBlbGVtZW50LCBhbm5vdGF0aW9uRGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlzSW50ZXJmYWNlUmVzdHJpY3RlZCgoSUZpZWxkKSBlbGVtZW50LCBhbm5vdGF0aW9uRGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8aXNFbnVtUmVzdHJpY3RlZCgoSUZpZWxkKSBlbGVtZW50LCBhbm5vdGF0aW9uRGVmaW5pdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkl0ZXIucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDbGFzc1Jlc3RyaWN0ZWQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LAotICAgIAkJQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgewotICAgICAgICAgICAgcmV0dXJuICEoKElUeXBlKWphdmFFbGVtZW50KS5pc0NsYXNzKCkgJiYgYW5ub3RhdGlvbkRlZmluaXRpb24uaXNDbGFzc09ubHkoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKSB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKWphdmFFbGVtZW50LmdldFBhcmVudCgpOwotICAgICAgICAgICAgcmV0dXJuICF0eXBlLmlzQ2xhc3MoKSAmJiBhbm5vdGF0aW9uRGVmaW5pdGlvbi5pc0NsYXNzT25seSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5GSUVMRCkgewotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSlqYXZhRWxlbWVudC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIHJldHVybiAhdHlwZS5pc0NsYXNzKCkgJiYgYW5ub3RhdGlvbkRlZmluaXRpb24uaXNDbGFzc09ubHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbnRlcmZhY2VSZXN0cmljdGVkKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwKLSAgICAJCUFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUpIHsKLSAgICAgICAgICAgIHJldHVybiAhKChJVHlwZSlqYXZhRWxlbWVudCkuaXNJbnRlcmZhY2UoKSAmJiBhbm5vdGF0aW9uRGVmaW5pdGlvbi5pc0ludGVyZmFjZU9ubHkoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKSB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKWphdmFFbGVtZW50LmdldFBhcmVudCgpOwotICAgICAgICAgICAgcmV0dXJuICF0eXBlLmlzSW50ZXJmYWNlKCkgICYmIGFubm90YXRpb25EZWZpbml0aW9uLmlzSW50ZXJmYWNlT25seSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5GSUVMRCkgewotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSlqYXZhRWxlbWVudC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIHJldHVybiAhdHlwZS5pc0ludGVyZmFjZSgpICYmIGFubm90YXRpb25EZWZpbml0aW9uLmlzSW50ZXJmYWNlT25seSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VudW1SZXN0cmljdGVkKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwKLSAgICAJCUFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUpIHsKLSAgICAgICAgICAgIHJldHVybiAhKChJVHlwZSlqYXZhRWxlbWVudCkuaXNFbnVtKCkgJiYgYW5ub3RhdGlvbkRlZmluaXRpb24uaXNFbnVtT25seSgpOyAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpIHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpamF2YUVsZW1lbnQuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICByZXR1cm4gIXR5cGUuaXNFbnVtKCkgJiYgYW5ub3RhdGlvbkRlZmluaXRpb24uaXNFbnVtT25seSgpOyAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5GSUVMRCkgewotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSlqYXZhRWxlbWVudC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIHJldHVybiAhdHlwZS5pc0VudW0oKSAmJiBhbm5vdGF0aW9uRGVmaW5pdGlvbi5pc0VudW1Pbmx5KCk7ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvL1RPRE8gTW92ZSB0aGUgRGVwcmVjYXRlZCBvcHRpb24gdG8gcHJlZmVyZW5jZXMKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGVwcmVjYXRlZChBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbikgewotICAgICAgICBDbGFzczw/PiBhbm5vdGF0aW9uQ2xhc3MgPSBhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXRBbm5vdGF0aW9uQ2xhc3MoKTsKLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25DbGFzcy5nZXRBbm5vdGF0aW9uKGphdmEubGFuZy5EZXByZWNhdGVkLmNsYXNzKSAhPSBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMzljOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBpbml0aWFsaXplcnMgY29udHJpYnV0ZWQgdG8gdGhlCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uSW5pdGlhbGl6ZXI8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIDxwPgotICogUHJvdmlkZXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgZm9yIGFsbCBtZXRob2RzLgotICogPC9wPgotICogPHA+Ci0gKiA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCAKLSAqIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgCi0gKiB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIAotICogYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIAotKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfSURFTlRJRkVSID0gIiRtaXNzaW5nJCI7Ci0JIAotICAgIHB1YmxpYyBMaXN0PE1lbWJlclZhbHVlUGFpcj4gZ2V0TWVtYmVyVmFsdWVQYWlycyhJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIEFTVCBhc3QsCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IGdldE1lbWJlclZhbHVlUGFpcnMoQVNUTm9kZSBhc3ROb2RlLCBBU1QgYXN0LAotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yTWVtYmVyVmFsdWVQYWlyKEFTVE5vZGUgYXN0Tm9kZSwKLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIpIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgIH0KLQotCXByb3RlY3RlZCBDb21wbGV0aW9uUHJvcG9zYWwgY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKFN0cmluZyBwcm9wb3NhbCwgRXhwcmVzc2lvbiB2YWx1ZSkgewotICAgICAgICBJbWFnZSBpbWFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2Uob3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZJTEUpOwotICAgICAgICByZXR1cm4gY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2FsLCB2YWx1ZSwgaW1hZ2UsIHByb3Bvc2FsKTsKLQl9Ci0KLSAgICBwcm90ZWN0ZWQgQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChTdHJpbmcgcHJvcG9zYWwsIEV4cHJlc3Npb24gdmFsdWUsIEltYWdlIGltYWdlLCAKLSAgICAgICAgICAgIFN0cmluZyBkaXNwbGF5U3RyaW5nKSB7Ci0gICAgICAgIGludCByZXBsYWNlbWVudE9mZnNldCA9IHZhbHVlLmdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICAgICAgaW50IHJlcGxhY2VtZW50TGVuZ3RoID0gMDsKLSAgICAgICAgaWYgKHZhbHVlLnRvU3RyaW5nKCkuZXF1YWxzKE1JU1NJTkdfSURFTlRJRkVSKSkgewotICAgICAgICAgICAgaWYgKHByb3Bvc2FsLmNoYXJBdCgwKSAhPSAnXCInKSB7Ci0gICAgICAgICAgICAgICAgcHJvcG9zYWwgPSAiXCIiICsgcHJvcG9zYWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHJvcG9zYWwuY2hhckF0KHByb3Bvc2FsLmxlbmd0aCgpIC0gMSkgIT0gJ1wiJykgewotICAgICAgICAgICAgICAgIHByb3Bvc2FsID0gcHJvcG9zYWwgKyAiXCIiOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVwbGFjZW1lbnRPZmZzZXQgKz0gMTsKLSAgICAgICAgICAgIHJlcGxhY2VtZW50TGVuZ3RoID0gdmFsdWUuZ2V0TGVuZ3RoKCkgLSAyOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV0aW9uUHJvcG9zYWwocHJvcG9zYWwsIHJlcGxhY2VtZW50T2Zmc2V0LCByZXBsYWNlbWVudExlbmd0aCwgcHJvcG9zYWwubGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIG51bGwsIG51bGwpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0RlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmUyOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIDxjb2RlPk1lbWJlclZhbHVlUGFpcjwvY29kZT4gZnJvbSB0aGUgZGVmYXVsdHMgZm91bmQgaW4gdGhlIHBhc3NlZCBpbiA8Y29kZT5Bbm5vdGF0aW9uPC9jb2RlPi4KLSAqIDxwPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciAKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCAKLSAqIHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgCi0gKiB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciBleHRlbmRzIEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciB7Ci0gICAgCi0gICAgcHVibGljIERlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyKCkgewotICAgICAgICAKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IGdldE1lbWJlclZhbHVlUGFpcnMoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBBU1QgYXN0LAotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgewotICAgICAgICByZXR1cm4gZ2V0TWVtYmVyVmFsdWVQYWlycyhhc3QsIGFubm90YXRpb25DbGFzcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBnZXRNZW1iZXJWYWx1ZVBhaXJzKEFTVE5vZGUgYXN0Tm9kZSwgQVNUIGFzdCwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIGdldE1lbWJlclZhbHVlUGFpcnMoYXN0LCBhbm5vdGF0aW9uQ2xhc3MpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBnZXRNZW1iZXJWYWx1ZVBhaXJzKEFTVCBhc3QsCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0gICAgICAgIAotICAgICAgICBNZXRob2RbXSBkZWNsYXJlZE1ldGhvZHMgPSBhbm5vdGF0aW9uQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0gICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IGRlY2xhcmVkTWV0aG9kcykgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotICAgICAgICAgICAgQ2xhc3M8Pz4gcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgICBPYmplY3QgZGVmYXVsdFZhbHVlID0gbWV0aG9kLmdldERlZmF1bHRWYWx1ZSgpOwotCi0gICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoU3RyaW5nLmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBkZWZhdWx0VmFsdWUudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQm9vbGVhbi5UWVBFKSkgewotICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChBbm5vdGF0aW9uc0NvcmUuY3JlYXRlQm9vbGVhbk1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgQm9vbGVhbi5wYXJzZUJvb2xlYW4oZGVmYXVsdFZhbHVlLnRvU3RyaW5nKCkpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmlzUHJpbWl0aXZlKCkgJiYgKHJldHVyblR5cGUuZXF1YWxzKEJ5dGUuVFlQRSkgfHwgcmV0dXJuVHlwZS5lcXVhbHMoU2hvcnQuVFlQRSkgCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCByZXR1cm5UeXBlLmVxdWFscyhJbnRlZ2VyLlRZUEUpIHx8IHJldHVyblR5cGUuZXF1YWxzKExvbmcuVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJldHVyblR5cGUuZXF1YWxzKEZsb2F0LlRZUEUpIHx8IHJldHVyblR5cGUuZXF1YWxzKERvdWJsZS5UWVBFKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU51bWJlck1lbWJlclZhbHVlUGFpcihhc3QsIG5hbWUsIGRlZmF1bHRWYWx1ZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUFycmF5TWVtYmVyVmFsdWVQYWlyKGFzdCwgbWV0aG9kLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT2JqZWN0W10pZGVmYXVsdFZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmlzRW51bSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpLCBuYW1lLCBkZWZhdWx0VmFsdWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKENsYXNzLmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChBbm5vdGF0aW9uc0NvcmUuY3JlYXRlVHlwZU1lbWJlclZhbHVlUGFpcihhc3QsIG5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgIAotICAgICAgICByZXR1cm4gbWVtYmVyVmFsdWVQYWlyczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjODc3N2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotCi0vKioKLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIAotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IAotICogdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyAKLSAqIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIHsgIAotICAgIHB1YmxpYyBMaXN0PE1lbWJlclZhbHVlUGFpcj4gZ2V0TWVtYmVyVmFsdWVQYWlycyhJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIEFTVCBhc3QsCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKTsKLSAgICAKLSAgICBwdWJsaWMgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IGdldE1lbWJlclZhbHVlUGFpcnMoQVNUTm9kZSBhc3ROb2RlLCBBU1QgYXN0LAotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb25DbGFzcyk7Ci0gICAgCi0gICAgcHVibGljIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKTsKLSAgICAKLSAgICBwdWJsaWMgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yTWVtYmVyVmFsdWVQYWlyKEFTVE5vZGUgYXN0Tm9kZSwKLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTMwNGY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmUudXRpbC5FY2xpcHNlTWVzc2FnZXI7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50OwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci51dGlsLlNvdXJjZVBvc2l0aW9uOwotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHByb2Nlc3NvcnMgY29udHJpYnV0ZWQgdG8gdGhlCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uUHJvY2Vzc29yPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKgotICogPHA+Ci0gKiA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIAotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IAotICogdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyAKLSAqIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIGltcGxlbWVudHMgQW5ub3RhdGlvblByb2Nlc3NvciB7Ci0gICAgcHJvdGVjdGVkIEFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudCBlbnZpcm9ubWVudDsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQoQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50IGVudmlyb25tZW50KSB7Ci0gICAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgcHJvY2VzcygpOwotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHByaW50RXJyb3IoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gLAotICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKLQotICAgICAgICBDb2xsZWN0aW9uPEFubm90YXRpb25NaXJyb3I+IGFubm90YXRpb25NaXJyb3JzID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk1pcnJvcnMoKTsKLSAgICAgICAgZm9yIChBbm5vdGF0aW9uTWlycm9yIG1pcnJvciA6IGFubm90YXRpb25NaXJyb3JzKSB7Ci0gICAgICAgICAgICBpZiAobWlycm9yLmdldEFubm90YXRpb25UeXBlKCkudG9TdHJpbmcoKS5lcXVhbHMoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpLnByaW50RXJyb3IobWlycm9yLmdldFBvc2l0aW9uKCksIGVycm9yTWVzc2FnZSk7IAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHByaW50RXJyb3IoU291cmNlUG9zaXRpb24gcG9zaXRpb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCkucHJpbnRFcnJvcihwb3NpdGlvbiwgbWVzc2FnZSk7ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRFcnJvcihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpLnByaW50RXJyb3IobWVzc2FnZSk7ICAgICAgICAKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludFdhcm5pbmcoU291cmNlUG9zaXRpb24gcG9zaXRpb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCkucHJpbnRXYXJuaW5nKHBvc2l0aW9uLCBtZXNzYWdlKTsgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludFdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKS5wcmludFdhcm5pbmcobWVzc2FnZSk7ICAgICAgICAKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludE5vdGljZShTb3VyY2VQb3NpdGlvbiBwb3NpdGlvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKS5wcmludE5vdGljZShwb3NpdGlvbiwgbWVzc2FnZSk7ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnROb3RpY2UoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKS5wcmludE5vdGljZShtZXNzYWdlKTsgICAgICAgIAotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByaW50Rml4YWJsZUVycm9yKFNvdXJjZVBvc2l0aW9uIHBvc2l0aW9uLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBFY2xpcHNlTWVzc2FnZXIgbWVzc2FnZXIgPSAoRWNsaXBzZU1lc3NhZ2VyKSBlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpOwotICAgICAgICBtZXNzYWdlci5wcmludEZpeGFibGVFcnJvcihwb3NpdGlvbiwgbWVzc2FnZSwgIiIsIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByaW50Rml4YWJsZUVycm9yKFNvdXJjZVBvc2l0aW9uIHBvc2l0aW9uLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXJyb3JJZCkgewotICAgICAgICBFY2xpcHNlTWVzc2FnZXIgbWVzc2FnZXIgPSAoRWNsaXBzZU1lc3NhZ2VyKSBlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpOwotICAgICAgICBtZXNzYWdlci5wcmludEZpeGFibGVFcnJvcihwb3NpdGlvbiwgbWVzc2FnZSwgcGx1Z2luSWQsIGVycm9ySWQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByaW50Rml4YWJsZUVycm9yKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBlcnJvcklkKSB7Ci0gICAgICAgIEVjbGlwc2VNZXNzYWdlciBtZXNzYWdlciA9IChFY2xpcHNlTWVzc2FnZXIpIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCk7Ci0gICAgICAgIG1lc3NhZ2VyLnByaW50Rml4YWJsZUVycm9yKG1lc3NhZ2UsIHBsdWdpbklkLCBlcnJvcklkKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludEZpeGFibGVXYXJuaW5nKFNvdXJjZVBvc2l0aW9uIHBvc2l0aW9uLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHBsdWdpbklkLAotICAgICAgICAgICAgU3RyaW5nIGVycm9ySWQpIHsKLSAgICAgICAgRWNsaXBzZU1lc3NhZ2VyIG1lc3NhZ2VyID0gKEVjbGlwc2VNZXNzYWdlcikgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKTsKLSAgICAgICAgbWVzc2FnZXIucHJpbnRGaXhhYmxlV2FybmluZyhwb3NpdGlvbiwgbWVzc2FnZSwgcGx1Z2luSWQsIGVycm9ySWQpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludEZpeGFibGVXYXJuaW5nKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBlcnJvcklkKSB7Ci0gICAgICAgIEVjbGlwc2VNZXNzYWdlciBtZXNzYWdlciA9IChFY2xpcHNlTWVzc2FnZXIpIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCk7Ci0gICAgICAgIG1lc3NhZ2VyLnByaW50Rml4YWJsZVdhcm5pbmcobWVzc2FnZSwgcGx1Z2luSWQsIGVycm9ySWQpOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRGaXhhYmxlTm90aWNlKFNvdXJjZVBvc2l0aW9uIHBvc2l0aW9uLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXJyb3JJZCkgewotICAgICAgICBFY2xpcHNlTWVzc2FnZXIgbWVzc2FnZXIgPSAoRWNsaXBzZU1lc3NhZ2VyKSBlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpOwotICAgICAgICBtZXNzYWdlci5wcmludEZpeGFibGVOb3RpY2UocG9zaXRpb24sIG1lc3NhZ2UsIHBsdWdpbklkLCBlcnJvcklkKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRGaXhhYmxlTm90aWNlKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBlcnJvcklkKSB7Ci0gICAgICAgIEVjbGlwc2VNZXNzYWdlciBtZXNzYWdlciA9IChFY2xpcHNlTWVzc2FnZXIpIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCk7Ci0gICAgICAgIG1lc3NhZ2VyLnByaW50Rml4YWJsZU5vdGljZShtZXNzYWdlLCBwbHVnaW5JZCwgZXJyb3JJZCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjVjNWMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuTG9jYXRpb25LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb2R5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvb2xlYW5MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5DaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JRXh0ZW5kZWRNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUGFja2FnZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5BU1RSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkltcG9ydFJld3JpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuTGlzdFJld3JpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkNvZGVTdHlsZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdEdyb3VwOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVmFsdWU7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uUGFyYW1ldGVyRGVjbGFyYXRpb247Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgYWRkaW5nLCByZW1vdmluZyBhbmQgdXBkYXRpbmcgYW5ub3RhdGlvbnMgYW5kIG1lbWJlciB2YWx1ZSBwYWlycy4KLSAqIDxwPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciAKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCAKLSAqIHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgCi0gKiB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbm5vdGF0aW9uVXRpbHMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfSU5TRVJUX1NQQUNFX0JFRk9SRV9BU1NJR05NRU5UX09QRVJBVE9SIAotICAgICAgICAgICAgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9BRlRFUl9BU1NJR05NRU5UX09QRVJBVE9SIAotICAgICAgICAgICAgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yIjsgLy8kTk9OLU5MUy0xJCAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9fTk9UX0lOU0VSVCAKLSAgICAgICAgICAgID0gImRvIG5vdCBpbnNlcnQiOyAvLyROT04tTkxTLTEkCi0KLQotICAgIHByaXZhdGUgQW5ub3RhdGlvblV0aWxzKCkgewotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRJbXBvcnRFZGl0KENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsIAotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb24sIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlLCAKLSAgICAgICAgICAgIGJvb2xlYW4gYW5ub3RhdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHF1YWxpZmllZE5hbWUgPSBhbm5vdGF0aW9uLmdldENhbm9uaWNhbE5hbWUoKTsKLSAgICAgICAgSW1wb3J0UmV3cml0ZSBpbXBvcnRSZXdyaXRlID0gQ29kZVN0eWxlQ29uZmlndXJhdGlvbi5jcmVhdGVJbXBvcnRSZXdyaXRlKGNvbXBpbGF0aW9uVW5pdCwgdHJ1ZSk7Ci0KLSAgICAgICAgaWYgKGFubm90YXRlKSB7Ci0gICAgICAgICAgICBpbXBvcnRSZXdyaXRlLmFkZEltcG9ydChxdWFsaWZpZWROYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uU2ltcGxlTmFtZSA9IGFubm90YXRpb24uZ2V0U2ltcGxlTmFtZSgpOwotICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IG9jY3VyZW5jZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIFRhcmdldCB0YXJnZXQgPSBhbm5vdGF0aW9uLmdldEFubm90YXRpb24oVGFyZ2V0LmNsYXNzKTsKLSAgICAgICAgICAgIExpc3Q8RWxlbWVudFR5cGU+IGVsZW1lbnRUeXBlcyA9IEFycmF5cy5hc0xpc3QodGFyZ2V0LnZhbHVlKCkpOwotICAgICAgICAgICAgZm9yIChFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA6IGVsZW1lbnRUeXBlcykgewotICAgICAgICAgICAgICAgIC8vIFRPRE8gSGFuZGxlIHBhY2thZ2UgYW5ub3RhdGlvbiBpbXBvcnRzCi0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRUeXBlID09IEVsZW1lbnRUeXBlLlRZUEUpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcGlsYXRpb25Vbml0LmFjY2VwdChuZXcgQVNUVmlzaXRvcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QW5ub3RhdGlvbk9jY3VycmVuY2VzKHR5cGVEZWNsYXJhdGlvbi5tb2RpZmllcnMoKSwgYW5ub3RhdGlvblNpbXBsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cmVuY2VzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIudmlzaXQodHlwZURlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50VHlwZSA9PSBFbGVtZW50VHlwZS5GSUVMRCkgewotICAgICAgICAgICAgICAgICAgICBjb21waWxhdGlvblVuaXQuYWNjZXB0KG5ldyBBU1RWaXNpdG9yKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEFubm90YXRpb25PY2N1cnJlbmNlcyhmaWVsZERlY2xhcmF0aW9uLm1vZGlmaWVycygpLCBhbm5vdGF0aW9uU2ltcGxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VyZW5jZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci52aXNpdChmaWVsZERlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50VHlwZSA9PSBFbGVtZW50VHlwZS5NRVRIT0QpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcGlsYXRpb25Vbml0LmFjY2VwdChuZXcgQVNUVmlzaXRvcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEFubm90YXRpb25PY2N1cnJlbmNlcyhtZXRob2REZWNsYXJhdGlvbi5tb2RpZmllcnMoKSwgYW5ub3RhdGlvblNpbXBsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cmVuY2VzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIudmlzaXQobWV0aG9kRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRUeXBlID09IEVsZW1lbnRUeXBlLlBBUkFNRVRFUikgewotICAgICAgICAgICAgICAgICAgICBjb21waWxhdGlvblVuaXQuYWNjZXB0KG5ldyBBU1RWaXNpdG9yKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEFubm90YXRpb25PY2N1cnJlbmNlcyhzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLm1vZGlmaWVycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblNpbXBsZU5hbWUsIG9jY3VyZW5jZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci52aXNpdChzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG9jY3VyZW5jZXMuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgICAgICBpbXBvcnRSZXdyaXRlLnJlbW92ZUltcG9ydChxdWFsaWZpZWROYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaW1wb3J0UmV3cml0ZS5oYXNSZWNvcmRlZENoYW5nZXMoKSkgewotICAgICAgICAgICAgLy8gVE9ETyBDbGVhbnVwIGltcG9ydHMuIFJlcGVhdGVkbHkgYWRkaW5nIGFuZCByZW1vdmluZyBhbiBpbXBvcnQgd2hlcmUgbm9uZSBleGlzdGVkIGJlZm9yZSB3aWxsCi0gICAgICAgICAgICAvL2luc2VydCBhIG5ldyBsaW5lIG9uIGVhY2ggaW5zZXJ0LgotICAgICAgICAgICAgVGV4dEVkaXQgaW1wb3J0VGV4dEVkaXQgPSBpbXBvcnRSZXdyaXRlLnJld3JpdGVJbXBvcnRzKG51bGwpOwotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChpbXBvcnRUZXh0RWRpdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb3VudEFubm90YXRpb25PY2N1cnJlbmNlcyhMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBtb2RpZmllcnMsIFN0cmluZyBhbm5vdGF0aW9uU2ltcGxlTmFtZSwgCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gb2NjdXJlbmNlcykgewotICAgICAgICBmb3IgKElFeHRlbmRlZE1vZGlmaWVyIGV4dGVuZGVkTW9kaWZpZXIgOiBtb2RpZmllcnMpIHsKLSAgICAgICAgICAgIGlmIChleHRlbmRlZE1vZGlmaWVyIGluc3RhbmNlb2YgQW5ub3RhdGlvbikgewotICAgICAgICAgICAgICAgIEFubm90YXRpb24gZXhpc3RpbmdBbm5vdGF0aW9uID0gKEFubm90YXRpb24pIGV4dGVuZGVkTW9kaWZpZXI7Ci0gICAgICAgICAgICAgICAgaWYgKEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShleGlzdGluZ0Fubm90YXRpb24pLmVxdWFscyhhbm5vdGF0aW9uU2ltcGxlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgb2NjdXJlbmNlcy5hZGQoYW5ub3RhdGlvblNpbXBsZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRBbm5vdGF0aW9uVG9QYWNrYWdlRGVjbGFyYXRpb24oSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UsIAotICAgICAgICAgICAgUGFja2FnZURlY2xhcmF0aW9uIHBhY2thZ2VEZWNsYXJhdGlvbiwgQVNUUmV3cml0ZSByZXdyaXRlciwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCAKLSAgICAgICAgICAgIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0gICAgICAgIElQYXRoIHBhdGggPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpOwotICAgICAgICBib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOwotICAgICAgICBJVGV4dEZpbGVCdWZmZXJNYW5hZ2VyIGJ1ZmZlck1hbmFnZXIgPSBGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChwYWNrYWdlRGVjbGFyYXRpb24gIT0gbnVsbCAmJiAhaXNBbm5vdGF0aW9uUHJlc2VudChwYWNrYWdlRGVjbGFyYXRpb24sIGFubm90YXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyTWFuYWdlci5jb25uZWN0KHBhdGgsIExvY2F0aW9uS2luZC5JRklMRSwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgY29ubmVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBJRG9jdW1lbnQgZG9jdW1lbnQgPSBidWZmZXJNYW5hZ2VyLmdldFRleHRGaWxlQnVmZmVyKHBhdGgsIExvY2F0aW9uS2luZC5JRklMRSkuZ2V0RG9jdW1lbnQoKTsKLQotICAgICAgICAgICAgICAgIExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUocGFja2FnZURlY2xhcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZURlY2xhcmF0aW9uLkFOTk9UQVRJT05TX1BST1BFUlRZKTsKLQotICAgICAgICAgICAgICAgIGxpc3RSZXdyaXRlLmluc2VydEZpcnN0KGFubm90YXRpb24sIG51bGwpOwotCi0gICAgICAgICAgICAgICAgVGV4dEVkaXQgYW5ub3RhdGlvblRleHRFZGl0ID0gcmV3cml0ZXIucmV3cml0ZUFTVChkb2N1bWVudCwgZ2V0T3B0aW9ucyhzb3VyY2UpKTsKLQotICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoYW5ub3RhdGlvblRleHRFZGl0KTsKLQotICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZFRleHRFZGl0R3JvdXAobmV3IFRleHRFZGl0R3JvdXAoIkFBIiwgbmV3IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIFRleHRFZGl0W10geyBhbm5vdGF0aW9uVGV4dEVkaXQgfSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGNvbm5lY3RlZCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlck1hbmFnZXIuZGlzY29ubmVjdChwYXRoLCBMb2NhdGlvbktpbmQuSUZJTEUsIG1vbml0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uRnJvbVBhY2thZ2VEZWNsYXJhdGlvbihJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSwKLSAgICAgICAgICAgIFBhY2thZ2VEZWNsYXJhdGlvbiBwYWNrYWdlRGVjbGFyYXRpb24sIEFTVFJld3JpdGUgcmV3cml0ZXIsIEFubm90YXRpb24gYW5ub3RhdGlvbiwKLSAgICAgICAgICAgIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElUZXh0RmlsZUJ1ZmZlck1hbmFnZXIgYnVmZmVyTWFuYWdlciA9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpOwotICAgICAgICBJUGF0aCBwYXRoID0gc291cmNlLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChwYWNrYWdlRGVjbGFyYXRpb24gIT0gbnVsbCAmJiBpc0Fubm90YXRpb25QcmVzZW50KHBhY2thZ2VEZWNsYXJhdGlvbiwgYW5ub3RhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBidWZmZXJNYW5hZ2VyLmNvbm5lY3QocGF0aCwgTG9jYXRpb25LaW5kLklGSUxFLCBudWxsKTsKLSAgICAgICAgICAgICAgICBjb25uZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIElEb2N1bWVudCBkb2N1bWVudCA9IGJ1ZmZlck1hbmFnZXIuZ2V0VGV4dEZpbGVCdWZmZXIocGF0aCwgTG9jYXRpb25LaW5kLklGSUxFKS5nZXREb2N1bWVudCgpOwotCi0gICAgICAgICAgICAgICAgTGlzdFJld3JpdGUgbGlzdFJld3JpdGUgPSByZXdyaXRlci5nZXRMaXN0UmV3cml0ZShwYWNrYWdlRGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlRGVjbGFyYXRpb24uQU5OT1RBVElPTlNfUFJPUEVSVFkpOwotCi0gICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICAgICAgTGlzdCBvcmlnaW5hbExpc3QgPSBsaXN0UmV3cml0ZS5nZXRPcmlnaW5hbExpc3QoKTsKLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvYmplY3QgOiBvcmlnaW5hbExpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFubm90YXRpb24gJiYgY29tcGFyZUFubm90YXRpb25OYW1lcygoQW5ub3RhdGlvbikgb2JqZWN0LCBhbm5vdGF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFJld3JpdGUucmVtb3ZlKChBbm5vdGF0aW9uKSBvYmplY3QsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgVGV4dEVkaXQgYW5ub3RhdGlvblRleHRFZGl0ID0gcmV3cml0ZXIucmV3cml0ZUFTVChkb2N1bWVudCwgZ2V0T3B0aW9ucyhzb3VyY2UpKTsKLQotICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoYW5ub3RhdGlvblRleHRFZGl0KTsKLQotICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZFRleHRFZGl0R3JvdXAobmV3IFRleHRFZGl0R3JvdXAoIkFBIiwgbmV3IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIFRleHRFZGl0W10geyBhbm5vdGF0aW9uVGV4dEVkaXQgfSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGNvbm5lY3RlZCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlck1hbmFnZXIuZGlzY29ubmVjdChwYXRoLCBMb2NhdGlvbktpbmQuSUZJTEUsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRBbm5vdGF0aW9uVG9UeXBlKElDb21waWxhdGlvblVuaXQgc291cmNlLCBDb21waWxhdGlvblVuaXQgCi0gICAgICAgICAgICBjb21waWxhdGlvblVuaXQsIEFTVFJld3JpdGUgcmV3cml0ZXIsIElUeXBlIHR5cGUsIEFubm90YXRpb24gYW5ub3RhdGlvbiwgCi0gICAgICAgICAgICBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJVGV4dEZpbGVCdWZmZXJNYW5hZ2VyIGJ1ZmZlck1hbmFnZXIgPSBGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKTsKLSAgICAgICAgSVBhdGggcGF0aCA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgIGJvb2xlYW4gY29ubmVjdGVkID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgIExpc3Q8VHlwZURlY2xhcmF0aW9uPiB0eXBlcyA9IGNvbXBpbGF0aW9uVW5pdC50eXBlcygpOwotICAgICAgICAgICAgZm9yIChBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiA6IHR5cGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVUeXBlTmFtZXMoYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24sIHR5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAhaXNBbm5vdGF0aW9uUHJlc2VudChhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiwgYW5ub3RhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyTWFuYWdlci5jb25uZWN0KHBhdGgsIExvY2F0aW9uS2luZC5JRklMRSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIElEb2N1bWVudCBkb2N1bWVudCA9IGJ1ZmZlck1hbmFnZXIuZ2V0VGV4dEZpbGVCdWZmZXIocGF0aCwgTG9jYXRpb25LaW5kLklGSUxFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREb2N1bWVudCgpOwotCi0gICAgICAgICAgICAgICAgICAgIExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUoYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yRm9yVHlwZShhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbikpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbGlzdFJld3JpdGUuaW5zZXJ0Rmlyc3QoYW5ub3RhdGlvbiwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgVGV4dEVkaXQgYW5ub3RhdGlvblRleHRFZGl0ID0gcmV3cml0ZXIucmV3cml0ZUFTVChkb2N1bWVudCwgZ2V0T3B0aW9ucyhzb3VyY2UpKTsKLQotICAgICAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KGFubm90YXRpb25UZXh0RWRpdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkVGV4dEVkaXRHcm91cChuZXcgVGV4dEVkaXRHcm91cCgiQUEiLCBuZXcgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRFZGl0W10geyBhbm5vdGF0aW9uVGV4dEVkaXQgfSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChjb25uZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBidWZmZXJNYW5hZ2VyLmRpc2Nvbm5lY3QocGF0aCwgTG9jYXRpb25LaW5kLklGSUxFLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uRnJvbVR5cGUoSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UsIENvbXBpbGF0aW9uVW5pdCAKLSAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdCwgQVNUUmV3cml0ZSByZXdyaXRlciwgSVR5cGUgdHlwZSwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCAKLSAgICAgICAgICAgIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElUZXh0RmlsZUJ1ZmZlck1hbmFnZXIgYnVmZmVyTWFuYWdlciA9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpOwotICAgICAgICBJUGF0aCBwYXRoID0gc291cmNlLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgTGlzdDxUeXBlRGVjbGFyYXRpb24+IHR5cGVzID0gY29tcGlsYXRpb25Vbml0LnR5cGVzKCk7Ci0gICAgICAgICAgICBmb3IgKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGFic3RyYWN0VHlwZURlY2xhcmF0aW9uIDogdHlwZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29tcGFyZVR5cGVOYW1lcyhhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiwgdHlwZSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBpc0Fubm90YXRpb25QcmVzZW50KGFic3RyYWN0VHlwZURlY2xhcmF0aW9uLCBhbm5vdGF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICBidWZmZXJNYW5hZ2VyLmNvbm5lY3QocGF0aCwgTG9jYXRpb25LaW5kLklGSUxFLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICBJRG9jdW1lbnQgZG9jdW1lbnQgPSBidWZmZXJNYW5hZ2VyLmdldFRleHRGaWxlQnVmZmVyKHBhdGgsIExvY2F0aW9uS2luZC5JRklMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RG9jdW1lbnQoKTsKLQotICAgICAgICAgICAgICAgICAgICBMaXN0UmV3cml0ZSBsaXN0UmV3cml0ZSA9IHJld3JpdGVyLmdldExpc3RSZXdyaXRlKGFic3RyYWN0VHlwZURlY2xhcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvckZvclR5cGUoYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24pKTsKLQotICAgICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgICAgICAgICAgTGlzdCBvcmlnaW5hbExpc3QgPSBsaXN0UmV3cml0ZS5nZXRPcmlnaW5hbExpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqZWN0IDogb3JpZ2luYWxMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQW5ub3RhdGlvbiAmJiBjb21wYXJlQW5ub3RhdGlvbk5hbWVzKChBbm5vdGF0aW9uKW9iamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFJld3JpdGUucmVtb3ZlKChBbm5vdGF0aW9uKW9iamVjdCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIFRleHRFZGl0IGFubm90YXRpb25UZXh0RWRpdCA9IHJld3JpdGVyLnJld3JpdGVBU1QoZG9jdW1lbnQsIGdldE9wdGlvbnMoc291cmNlKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChhbm5vdGF0aW9uVGV4dEVkaXQpOwotCi0gICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZFRleHRFZGl0R3JvdXAobmV3IFRleHRFZGl0R3JvdXAoIkFBIiwgbmV3ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRFZGl0W10ge2Fubm90YXRpb25UZXh0RWRpdH0pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoY29ubmVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyTWFuYWdlci5kaXNjb25uZWN0KHBhdGgsIExvY2F0aW9uS2luZC5JRklMRSwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEFubm90YXRpb25Ub01ldGhvZChJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSwgQ29tcGlsYXRpb25Vbml0IAotICAgICAgICAgICAgY29tcGlsYXRpb25Vbml0LCBBU1RSZXdyaXRlIHJld3JpdGVyLCBJTWV0aG9kIG1ldGhvZCwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCAKLSAgICAgICAgICAgIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElUZXh0RmlsZUJ1ZmZlck1hbmFnZXIgYnVmZmVyTWFuYWdlciA9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpOwotICAgICAgICBJUGF0aCBwYXRoID0gc291cmNlLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpOwotICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICBMaXN0PEFic3RyYWN0VHlwZURlY2xhcmF0aW9uPiB0eXBlcyA9IGNvbXBpbGF0aW9uVW5pdC50eXBlcygpOwotICAgICAgICAgICAgZm9yIChBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiA6IHR5cGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVUeXBlTmFtZXMoYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24sIHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8Qm9keURlY2xhcmF0aW9uPiBib2R5RGVjbGFyYXRpb25zID0gZ2V0Qm9keURlY2xhcmF0aW9uc0ZvclR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBCb2R5RGVjbGFyYXRpb24gYm9keURlY2xhcmF0aW9uID0gZ2V0TWV0aG9kRGVjbGFyYXRpb24oYm9keURlY2xhcmF0aW9ucywgbWV0aG9kKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Fubm90YXRpb25QcmVzZW50KGJvZHlEZWNsYXJhdGlvbiwgYW5ub3RhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck1hbmFnZXIuY29ubmVjdChwYXRoLCBMb2NhdGlvbktpbmQuSUZJTEUsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgSURvY3VtZW50IGRvY3VtZW50ID0gYnVmZmVyTWFuYWdlci5nZXRUZXh0RmlsZUJ1ZmZlcihwYXRoLCBMb2NhdGlvbktpbmQuSUZJTEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREb2N1bWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0UmV3cml0ZSBsaXN0UmV3cml0ZSA9IHJld3JpdGVyLmdldExpc3RSZXdyaXRlKGJvZHlEZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yRm9yTWV0aG9kKGJvZHlEZWNsYXJhdGlvbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFJld3JpdGUuaW5zZXJ0QXQoYW5ub3RhdGlvbiwgMCwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRleHRFZGl0IGFubm90YXRpb25UZXh0RWRpdCA9IHJld3JpdGVyLnJld3JpdGVBU1QoZG9jdW1lbnQsIGdldE9wdGlvbnMoc291cmNlKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoYW5ub3RhdGlvblRleHRFZGl0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZFRleHRFZGl0R3JvdXAobmV3IFRleHRFZGl0R3JvdXAoIkFBIiwgbmV3IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEVkaXRbXSB7IGFubm90YXRpb25UZXh0RWRpdCB9KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoY29ubmVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyTWFuYWdlci5kaXNjb25uZWN0KHBhdGgsIExvY2F0aW9uS2luZC5JRklMRSwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kKElDb21waWxhdGlvblVuaXQgc291cmNlLCBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotICAgICAgICAgICAgQVNUUmV3cml0ZSByZXdyaXRlciwgSU1ldGhvZCBtZXRob2QsIEFubm90YXRpb24gYW5ub3RhdGlvbiwgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSVRleHRGaWxlQnVmZmVyTWFuYWdlciBidWZmZXJNYW5hZ2VyID0gRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCk7Ci0gICAgICAgIElQYXRoIHBhdGggPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpOwotICAgICAgICBib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCk7Ci0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlRGVjbGFyYXRpb24+IHR5cGVzID0gY29tcGlsYXRpb25Vbml0LnR5cGVzKCk7Ci0gICAgICAgICAgICBmb3IgKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGFic3RyYWN0VHlwZURlY2xhcmF0aW9uIDogdHlwZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29tcGFyZVR5cGVOYW1lcyhhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiwgdHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxCb2R5RGVjbGFyYXRpb24+IGJvZHlEZWNsYXJhdGlvbnMgPSBnZXRCb2R5RGVjbGFyYXRpb25zRm9yVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIEJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24gPSBnZXRNZXRob2REZWNsYXJhdGlvbihib2R5RGVjbGFyYXRpb25zLCBtZXRob2QpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNBbm5vdGF0aW9uUHJlc2VudChib2R5RGVjbGFyYXRpb24sIGFubm90YXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJNYW5hZ2VyLmNvbm5lY3QocGF0aCwgTG9jYXRpb25LaW5kLklGSUxFLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIElEb2N1bWVudCBkb2N1bWVudCA9IGJ1ZmZlck1hbmFnZXIuZ2V0VGV4dEZpbGVCdWZmZXIocGF0aCwgTG9jYXRpb25LaW5kLklGSUxFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RG9jdW1lbnQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFJld3JpdGUgbGlzdFJld3JpdGUgPSByZXdyaXRlci5nZXRMaXN0UmV3cml0ZShib2R5RGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvckZvck1ldGhvZChib2R5RGVjbGFyYXRpb24pKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0IG9yaWdpbmFsTGlzdCA9IGxpc3RSZXdyaXRlLmdldE9yaWdpbmFsTGlzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqZWN0IDogb3JpZ2luYWxMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFubm90YXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbXBhcmVBbm5vdGF0aW9uTmFtZXMoKEFubm90YXRpb24pIG9iamVjdCwgYW5ub3RhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFJld3JpdGUucmVtb3ZlKChBbm5vdGF0aW9uKSBvYmplY3QsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEVkaXQgYW5ub3RhdGlvblRleHRFZGl0ID0gcmV3cml0ZXIucmV3cml0ZUFTVChkb2N1bWVudCwgZ2V0T3B0aW9ucyhzb3VyY2UpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChhbm5vdGF0aW9uVGV4dEVkaXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkVGV4dEVkaXRHcm91cChuZXcgVGV4dEVkaXRHcm91cCgiQUEiLCBuZXcgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0RWRpdFtdIHsgYW5ub3RhdGlvblRleHRFZGl0IH0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChjb25uZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBidWZmZXJNYW5hZ2VyLmRpc2Nvbm5lY3QocGF0aCwgTG9jYXRpb25LaW5kLklGSUxFLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRBbm5vdGF0aW9uVG9GaWVsZChJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSwgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLSAgICAgICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIsIElGaWVsZCBmaWVsZCwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJVGV4dEZpbGVCdWZmZXJNYW5hZ2VyIGJ1ZmZlck1hbmFnZXIgPSBGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKTsKLSAgICAgICAgSVBhdGggcGF0aCA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgIGJvb2xlYW4gY29ubmVjdGVkID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gZmllbGQuZ2V0RGVjbGFyaW5nVHlwZSgpOwotICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICBMaXN0PEFic3RyYWN0VHlwZURlY2xhcmF0aW9uPiB0eXBlcyA9IGNvbXBpbGF0aW9uVW5pdC50eXBlcygpOwotICAgICAgICAgICAgZm9yIChBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiA6IHR5cGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVUeXBlTmFtZXMoYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24sIHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8Qm9keURlY2xhcmF0aW9uPiBib2R5RGVjbGFyYXRpb25zID0gZ2V0Qm9keURlY2xhcmF0aW9uc0ZvclR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSAoRmllbGREZWNsYXJhdGlvbikgZ2V0RmllbGREZWNsYXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5RGVjbGFyYXRpb25zLCBmaWVsZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXNBbm5vdGF0aW9uUHJlc2VudChmaWVsZERlY2xhcmF0aW9uLCBhbm5vdGF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTWFuYWdlci5jb25uZWN0KHBhdGgsIExvY2F0aW9uS2luZC5JRklMRSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBJRG9jdW1lbnQgZG9jdW1lbnQgPSBidWZmZXJNYW5hZ2VyLmdldFRleHRGaWxlQnVmZmVyKHBhdGgsIExvY2F0aW9uS2luZC5JRklMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERvY3VtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUoZmllbGREZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZWNsYXJhdGlvbi5NT0RJRklFUlMyX1BST1BFUlRZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RSZXdyaXRlLmluc2VydEF0KGFubm90YXRpb24sIDAsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXh0RWRpdCBhbm5vdGF0aW9uVGV4dEVkaXQgPSByZXdyaXRlci5yZXdyaXRlQVNUKGRvY3VtZW50LCBnZXRPcHRpb25zKHNvdXJjZSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KGFubm90YXRpb25UZXh0RWRpdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRUZXh0RWRpdEdyb3VwKG5ldyBUZXh0RWRpdEdyb3VwKCJBQSIsIG5ldyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRFZGl0W10geyBhbm5vdGF0aW9uVGV4dEVkaXQgfSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGNvbm5lY3RlZCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlck1hbmFnZXIuZGlzY29ubmVjdChwYXRoLCBMb2NhdGlvbktpbmQuSUZJTEUsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uRnJvbUZpZWxkKElDb21waWxhdGlvblVuaXQgc291cmNlLCBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotICAgICAgICAgICAgQVNUUmV3cml0ZSByZXdyaXRlciwgSUZpZWxkIGZpZWxkLCBBbm5vdGF0aW9uIGFubm90YXRpb24sIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElUZXh0RmlsZUJ1ZmZlck1hbmFnZXIgYnVmZmVyTWFuYWdlciA9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpOwotICAgICAgICBJUGF0aCBwYXRoID0gc291cmNlLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSBmaWVsZC5nZXREZWNsYXJpbmdUeXBlKCk7Ci0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlRGVjbGFyYXRpb24+IHR5cGVzID0gY29tcGlsYXRpb25Vbml0LnR5cGVzKCk7Ci0gICAgICAgICAgICBmb3IgKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGFic3RyYWN0VHlwZURlY2xhcmF0aW9uIDogdHlwZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29tcGFyZVR5cGVOYW1lcyhhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiwgdHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxCb2R5RGVjbGFyYXRpb24+IGJvZHlEZWNsYXJhdGlvbnMgPSBnZXRCb2R5RGVjbGFyYXRpb25zRm9yVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChGaWVsZERlY2xhcmF0aW9uKSBnZXRGaWVsZERlY2xhcmF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlEZWNsYXJhdGlvbnMsIGZpZWxkKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNBbm5vdGF0aW9uUHJlc2VudChmaWVsZERlY2xhcmF0aW9uLCBhbm5vdGF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTWFuYWdlci5jb25uZWN0KHBhdGgsIExvY2F0aW9uS2luZC5JRklMRSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBJRG9jdW1lbnQgZG9jdW1lbnQgPSBidWZmZXJNYW5hZ2VyLmdldFRleHRGaWxlQnVmZmVyKHBhdGgsIExvY2F0aW9uS2luZC5JRklMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERvY3VtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUoZmllbGREZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZWNsYXJhdGlvbi5NT0RJRklFUlMyX1BST1BFUlRZKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0IG9yaWdpbmFsTGlzdCA9IGxpc3RSZXdyaXRlLmdldE9yaWdpbmFsTGlzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqZWN0IDogb3JpZ2luYWxMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFubm90YXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbXBhcmVBbm5vdGF0aW9uTmFtZXMoKEFubm90YXRpb24pIG9iamVjdCwgYW5ub3RhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFJld3JpdGUucmVtb3ZlKChBbm5vdGF0aW9uKSBvYmplY3QsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEVkaXQgYW5ub3RhdGlvblRleHRFZGl0ID0gcmV3cml0ZXIucmV3cml0ZUFTVChkb2N1bWVudCwgZ2V0T3B0aW9ucyhzb3VyY2UpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChhbm5vdGF0aW9uVGV4dEVkaXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkVGV4dEVkaXRHcm91cChuZXcgVGV4dEVkaXRHcm91cCgiQUEiLCBuZXcgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0RWRpdFtdIHsgYW5ub3RhdGlvblRleHRFZGl0IH0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChjb25uZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBidWZmZXJNYW5hZ2VyLmRpc2Nvbm5lY3QocGF0aCwgTG9jYXRpb25LaW5kLklGSUxFLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRBbm5vdGF0aW9uVG9NZXRob2RQYXJhbWV0ZXIoSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UsIENvbXBpbGF0aW9uVW5pdCAKLSAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdCwgQVNUUmV3cml0ZSByZXdyaXRlciwgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBtZXRob2RQYXJhbWV0ZXIsIAotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QsIEFubm90YXRpb24gYW5ub3RhdGlvbiwgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotICAgICAgICBJVGV4dEZpbGVCdWZmZXJNYW5hZ2VyIGJ1ZmZlck1hbmFnZXIgPSBGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKTsKLSAgICAgICAgSVBhdGggcGF0aCA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgIGJvb2xlYW4gY29ubmVjdGVkID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gbWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKTsKLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbj4gdHlwZXMgPSBjb21waWxhdGlvblVuaXQudHlwZXMoKTsKLSAgICAgICAgICAgIGZvciAoQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gOiB0eXBlcykgewotICAgICAgICAgICAgICAgIGlmIChjb21wYXJlVHlwZU5hbWVzKGFic3RyYWN0VHlwZURlY2xhcmF0aW9uLCB0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICBMaXN0PEJvZHlEZWNsYXJhdGlvbj4gYm9keURlY2xhcmF0aW9ucyA9IGdldEJvZHlEZWNsYXJhdGlvbnNGb3JUeXBlKGFic3RyYWN0VHlwZURlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIGdldE1ldGhvZERlY2xhcmF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlEZWNsYXJhdGlvbnMsIG1ldGhvZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICAgICAgICAgIExpc3Q8U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLnBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wYXJlTWV0aG9kUGFyYW1ldGVycyhwYXJhbWV0ZXIsIG1ldGhvZFBhcmFtZXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWlzQW5ub3RhdGlvblByZXNlbnQocGFyYW1ldGVyLCBhbm5vdGF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck1hbmFnZXIuY29ubmVjdChwYXRoLCBMb2NhdGlvbktpbmQuSUZJTEUsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRG9jdW1lbnQgZG9jdW1lbnQgPSBidWZmZXJNYW5hZ2VyLmdldFRleHRGaWxlQnVmZmVyKHBhdGgsIExvY2F0aW9uS2luZC5JRklMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREb2N1bWVudCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFJld3JpdGUgbGlzdFJld3JpdGUgPSByZXdyaXRlci5nZXRMaXN0UmV3cml0ZShwYXJhbWV0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLk1PRElGSUVSUzJfUFJPUEVSVFkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFJld3JpdGUuaW5zZXJ0QXQoYW5ub3RhdGlvbiwgLTEsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEVkaXQgYW5ub3RhdGlvblRleHRFZGl0ID0gcmV3cml0ZXIucmV3cml0ZUFTVChkb2N1bWVudCwgZ2V0T3B0aW9ucyhzb3VyY2UpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoYW5ub3RhdGlvblRleHRFZGl0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZFRleHRFZGl0R3JvdXAobmV3IFRleHRFZGl0R3JvdXAoIkFBIiwgbmV3IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRFZGl0W10geyBhbm5vdGF0aW9uVGV4dEVkaXQgfSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGNvbm5lY3RlZCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlck1hbmFnZXIuZGlzY29ubmVjdChwYXRoLCBMb2NhdGlvbktpbmQuSUZJTEUsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEFubm90YXRpb25Ub01ldGhvZFBhcmFtZXRlcihJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSwgQVNUUmV3cml0ZSByZXdyaXRlciwKLSAgICAgICAgICAgIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gbWV0aG9kUGFyYW1ldGVyLCBBbm5vdGF0aW9uIGFubm90YXRpb24sCi0gICAgICAgICAgICBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJVGV4dEZpbGVCdWZmZXJNYW5hZ2VyIGJ1ZmZlck1hbmFnZXIgPSBGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKTsKLSAgICAgICAgSVBhdGggcGF0aCA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgIGJvb2xlYW4gY29ubmVjdGVkID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoIWlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kUGFyYW1ldGVyLCBhbm5vdGF0aW9uKSkgewotICAgICAgICAgICAgICAgIGJ1ZmZlck1hbmFnZXIuY29ubmVjdChwYXRoLCBMb2NhdGlvbktpbmQuSUZJTEUsIG51bGwpOwotICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICBJRG9jdW1lbnQgZG9jdW1lbnQgPSBidWZmZXJNYW5hZ2VyLmdldFRleHRGaWxlQnVmZmVyKHBhdGgsIExvY2F0aW9uS2luZC5JRklMRSkuZ2V0RG9jdW1lbnQoKTsKLQotICAgICAgICAgICAgICAgIExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUobWV0aG9kUGFyYW1ldGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5NT0RJRklFUlMyX1BST1BFUlRZKTsKLQotICAgICAgICAgICAgICAgIGxpc3RSZXdyaXRlLmluc2VydEF0KGFubm90YXRpb24sIC0xLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIFRleHRFZGl0IGFubm90YXRpb25UZXh0RWRpdCA9IHJld3JpdGVyLnJld3JpdGVBU1QoZG9jdW1lbnQsIGdldE9wdGlvbnMoc291cmNlKSk7Ci0KLSAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KGFubm90YXRpb25UZXh0RWRpdCk7Ci0KLSAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRUZXh0RWRpdEdyb3VwKG5ldyBUZXh0RWRpdEdyb3VwKCJBQSIsIG5ldyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXh0RWRpdFtdIHsgYW5ub3RhdGlvblRleHRFZGl0IH0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChjb25uZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBidWZmZXJNYW5hZ2VyLmRpc2Nvbm5lY3QocGF0aCwgTG9jYXRpb25LaW5kLklGSUxFLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2RQYXJhbWV0ZXIoSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UsIEFTVFJld3JpdGUgcmV3cml0ZXIsCi0gICAgICAgICAgICBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIG1ldGhvZFBhcmFtZXRlciwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uLAotICAgICAgICAgICAgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSVRleHRGaWxlQnVmZmVyTWFuYWdlciBidWZmZXJNYW5hZ2VyID0gRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCk7Ci0gICAgICAgIElQYXRoIHBhdGggPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpOwotICAgICAgICBib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kUGFyYW1ldGVyLCBhbm5vdGF0aW9uKSkgewotICAgICAgICAgICAgICAgIGJ1ZmZlck1hbmFnZXIuY29ubmVjdChwYXRoLCBMb2NhdGlvbktpbmQuSUZJTEUsIG51bGwpOwotICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICBJRG9jdW1lbnQgZG9jdW1lbnQgPSBidWZmZXJNYW5hZ2VyLmdldFRleHRGaWxlQnVmZmVyKHBhdGgsIExvY2F0aW9uS2luZC5JRklMRSkuZ2V0RG9jdW1lbnQoKTsKLQotICAgICAgICAgICAgICAgIExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUobWV0aG9kUGFyYW1ldGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5NT0RJRklFUlMyX1BST1BFUlRZKTsKLQotICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgICAgIExpc3Qgb3JpZ2luYWxMaXN0ID0gbGlzdFJld3JpdGUuZ2V0T3JpZ2luYWxMaXN0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqZWN0IDogb3JpZ2luYWxMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBbm5vdGF0aW9uICYmIGNvbXBhcmVBbm5vdGF0aW9uTmFtZXMoKEFubm90YXRpb24pb2JqZWN0LCBhbm5vdGF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFJld3JpdGUucmVtb3ZlKChBbm5vdGF0aW9uKW9iamVjdCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBUZXh0RWRpdCBhbm5vdGF0aW9uVGV4dEVkaXQgPSByZXdyaXRlci5yZXdyaXRlQVNUKGRvY3VtZW50LCBnZXRPcHRpb25zKHNvdXJjZSkpOwotCi0gICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChhbm5vdGF0aW9uVGV4dEVkaXQpOwotCi0gICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkVGV4dEVkaXRHcm91cChuZXcgVGV4dEVkaXRHcm91cCgiQUEiLCBuZXcgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEVkaXRbXSB7IGFubm90YXRpb25UZXh0RWRpdCB9KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoY29ubmVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyTWFuYWdlci5kaXNjb25uZWN0KHBhdGgsIExvY2F0aW9uS2luZC5JRklMRSwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTWVtYmVyVmFsdWVQYWlyVG9Bbm5vdGF0aW9uKElDb21waWxhdGlvblVuaXQgc291cmNlLCBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotICAgICAgICAgICAgQVNUUmV3cml0ZSByZXdyaXRlciwgSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBJQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBBU1ROb2RlIG1lbWJlclZhbHVlUGFpciwKLSAgICAgICAgICAgIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElUZXh0RmlsZUJ1ZmZlck1hbmFnZXIgYnVmZmVyTWFuYWdlciA9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpOwotICAgICAgICBJUGF0aCBwYXRoID0gc291cmNlLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCWlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OKSB7Ci0gICAgICAgIAkJTGlzdCBhbm5vdGF0aW9uTm9kZXMgPSBjb21waWxhdGlvblVuaXQuZ2V0UGFja2FnZSgpLmFubm90YXRpb25zKCk7Ci0gICAgICAgIAkJZm9yIChPYmplY3QgYW5ub3RhdGlvbk5vZGUgOiBhbm5vdGF0aW9uTm9kZXMpIHsKLSAgICAgICAgCQkJaWYgKGFubm90YXRpb25Ob2RlIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbikgewotICAgICAgICAJCQkJTm9ybWFsQW5ub3RhdGlvbiBleGlzdGluZ0Fubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbilhbm5vdGF0aW9uTm9kZTsKLQkgICAgICAgIAkJCWlmIChBbm5vdGF0aW9uVXRpbHMuY29tcGFyZUFubm90YXRpb25OYW1lcyhhbm5vdGF0aW9uLCBleGlzdGluZ0Fubm90YXRpb24pKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkID0gcmV3cml0ZUFubm90YXRpb25XaXRoTWVtYmVyVmFsdWVQYWlyKAotCQkJCQkJCQkJc291cmNlLCByZXdyaXRlciwgbWVtYmVyVmFsdWVQYWlyLAotCQkJCQkJCQkJdGV4dEZpbGVDaGFuZ2UsIGJ1ZmZlck1hbmFnZXIsIHBhdGgsCi0JCQkJCQkJCQlleGlzdGluZ0Fubm90YXRpb24pOwotCSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAJCQl9Ci0gICAgICAgIAkJfQotICAgICAgICAJfSBlbHNlIHsKLQkgICAgICAgICAgICBMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBtb2RpZmllcnMgPSBnZXRFeHRlbmRlZE1vZGlmaWVycyhjb21waWxhdGlvblVuaXQsIGphdmFFbGVtZW50KTsKLQkgICAgICAgICAgICBmb3IgKElFeHRlbmRlZE1vZGlmaWVyIGV4dGVuZGVkTW9kaWZpZXIgOiBtb2RpZmllcnMpIHsKLQkgICAgICAgICAgICAgICAgaWYgKGV4dGVuZGVkTW9kaWZpZXIgaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKSB7Ci0JICAgICAgICAgICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIGV4aXN0aW5nQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBleHRlbmRlZE1vZGlmaWVyOwotCSAgICAgICAgICAgICAgICAgICAgaWYgKEFubm90YXRpb25VdGlscy5jb21wYXJlQW5ub3RhdGlvbk5hbWVzKGFubm90YXRpb24sIGV4aXN0aW5nQW5ub3RhdGlvbikpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgPSByZXdyaXRlQW5ub3RhdGlvbldpdGhNZW1iZXJWYWx1ZVBhaXIoCi0JCQkJCQkJCQlzb3VyY2UsIHJld3JpdGVyLCBtZW1iZXJWYWx1ZVBhaXIsCi0JCQkJCQkJCQl0ZXh0RmlsZUNoYW5nZSwgYnVmZmVyTWFuYWdlciwgcGF0aCwKLQkJCQkJCQkJCWV4aXN0aW5nQW5ub3RhdGlvbik7Ci0JICAgICAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0gICAgICAgIAl9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoY29ubmVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyTWFuYWdlci5kaXNjb25uZWN0KHBhdGgsIExvY2F0aW9uS2luZC5JRklMRSwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHJld3JpdGVBbm5vdGF0aW9uV2l0aE1lbWJlclZhbHVlUGFpcigKLQkJCUlDb21waWxhdGlvblVuaXQgc291cmNlLCBBU1RSZXdyaXRlIHJld3JpdGVyLAotCQkJQVNUTm9kZSBtZW1iZXJWYWx1ZVBhaXIsIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlLAotCQkJSVRleHRGaWxlQnVmZmVyTWFuYWdlciBidWZmZXJNYW5hZ2VyLCBJUGF0aCBwYXRoLAotCQkJTm9ybWFsQW5ub3RhdGlvbiBleGlzdGluZ0Fubm90YXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBjb25uZWN0ZWQ7Ci0JCWJ1ZmZlck1hbmFnZXIuY29ubmVjdChwYXRoLCBMb2NhdGlvbktpbmQuSUZJTEUsIG51bGwpOwotCQljb25uZWN0ZWQgPSB0cnVlOwotCi0JCUlEb2N1bWVudCBkb2N1bWVudCA9IGJ1ZmZlck1hbmFnZXIuZ2V0VGV4dEZpbGVCdWZmZXIocGF0aCwgTG9jYXRpb25LaW5kLklGSUxFKQotCQkgICAgICAgIC5nZXREb2N1bWVudCgpOwotCi0JCUxpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUoZXhpc3RpbmdBbm5vdGF0aW9uLAotCQkgICAgICAgIE5vcm1hbEFubm90YXRpb24uVkFMVUVTX1BST1BFUlRZKTsKLQotCQlsaXN0UmV3cml0ZS5pbnNlcnRMYXN0KG1lbWJlclZhbHVlUGFpciwgbnVsbCk7Ci0KLQkJVGV4dEVkaXQgYW5ub3RhdGlvblRleHRFZGl0ID0gcmV3cml0ZXIucmV3cml0ZUFTVChkb2N1bWVudCwgZ2V0T3B0aW9ucyhzb3VyY2UpKTsKLQotCQl0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KGFubm90YXRpb25UZXh0RWRpdCk7Ci0KLQkJdGV4dEZpbGVDaGFuZ2UuYWRkVGV4dEVkaXRHcm91cChuZXcgVGV4dEVkaXRHcm91cCgiQUEiLCBuZXcgLy8kTk9OLU5MUy0xJAotCQkgICAgICAgIFRleHRFZGl0W10geyBhbm5vdGF0aW9uVGV4dEVkaXQgfSkpOwotCQlyZXR1cm4gY29ubmVjdGVkOwotCX0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTWVtYmVyVmFsdWVQYWlyVG9Bbm5vdGF0aW9uKElDb21waWxhdGlvblVuaXQgc291cmNlLCBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotICAgICAgICAgICAgQVNUUmV3cml0ZSByZXdyaXRlciwgTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBBU1ROb2RlIG1lbWJlclZhbHVlUGFpciwKLSAgICAgICAgICAgIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElUZXh0RmlsZUJ1ZmZlck1hbmFnZXIgYnVmZmVyTWFuYWdlciA9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpOwotICAgICAgICBJUGF0aCBwYXRoID0gc291cmNlLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbm5lY3RlZCA9IHJld3JpdGVBbm5vdGF0aW9uV2l0aE1lbWJlclZhbHVlUGFpcihzb3VyY2UsIHJld3JpdGVyLAotCQkJCQltZW1iZXJWYWx1ZVBhaXIsIHRleHRGaWxlQ2hhbmdlLCBidWZmZXJNYW5hZ2VyLCBwYXRoLAotCQkJCQlhbm5vdGF0aW9uKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChjb25uZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBidWZmZXJNYW5hZ2VyLmRpc2Nvbm5lY3QocGF0aCwgTG9jYXRpb25LaW5kLklGSUxFLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVNZW1iZXJWYWx1ZVBhaXJWYWx1ZShJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSwgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLSAgICAgICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIsIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgSUFubm90YXRpb24gYW5ub3RhdGlvbiwgSU1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIsCi0gICAgICAgICAgICBBU1ROb2RlIHZhbHVlLCBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJVGV4dEZpbGVCdWZmZXJNYW5hZ2VyIGJ1ZmZlck1hbmFnZXIgPSBGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKTsKLSAgICAgICAgSVBhdGggcGF0aCA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgIGJvb2xlYW4gY29ubmVjdGVkID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBtb2RpZmllcnMgPSBnZXRFeHRlbmRlZE1vZGlmaWVycyhjb21waWxhdGlvblVuaXQsIGphdmFFbGVtZW50KTsKLSAgICAgICAgICAgIGZvciAoSUV4dGVuZGVkTW9kaWZpZXIgZXh0ZW5kZWRNb2RpZmllciA6IG1vZGlmaWVycykgewotICAgICAgICAgICAgICAgIGlmIChleHRlbmRlZE1vZGlmaWVyIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIGV4aXN0aW5nQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBleHRlbmRlZE1vZGlmaWVyOwotICAgICAgICAgICAgICAgICAgICBpZiAoQW5ub3RhdGlvblV0aWxzLmNvbXBhcmVBbm5vdGF0aW9uTmFtZXMoYW5ub3RhdGlvbiwgZXhpc3RpbmdBbm5vdGF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IGV4aXN0aW5nQW5ub3RhdGlvbi52YWx1ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpckRPTSA6IG1lbWJlclZhbHVlUGFpcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyRE9NLmdldE5hbWUoKS50b1N0cmluZygpLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpci5nZXRNZW1iZXJOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck1hbmFnZXIuY29ubmVjdChwYXRoLCBMb2NhdGlvbktpbmQuSUZJTEUsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEb2N1bWVudCBkb2N1bWVudCA9IGJ1ZmZlck1hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VGV4dEZpbGVCdWZmZXIocGF0aCwgTG9jYXRpb25LaW5kLklGSUxFKS5nZXREb2N1bWVudCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJld3JpdGVyLnNldChtZW1iZXJWYWx1ZVBhaXJET00sIE1lbWJlclZhbHVlUGFpci5WQUxVRV9QUk9QRVJUWSwgdmFsdWUsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRFZGl0IGFubm90YXRpb25UZXh0RWRpdCA9IHJld3JpdGVyLnJld3JpdGVBU1QoZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3B0aW9ucyhzb3VyY2UpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KGFubm90YXRpb25UZXh0RWRpdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkVGV4dEVkaXRHcm91cChuZXcgVGV4dEVkaXRHcm91cCgiQUEiLCBuZXcgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRFZGl0W10geyBhbm5vdGF0aW9uVGV4dEVkaXQgfSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChjb25uZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBidWZmZXJNYW5hZ2VyLmRpc2Nvbm5lY3QocGF0aCwgTG9jYXRpb25LaW5kLklGSUxFLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVNZW1iZXJWYWx1ZVBhaXJWYWx1ZShJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSwgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLSAgICAgICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIsIE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciwKLSAgICAgICAgICAgIEFTVE5vZGUgdmFsdWUsIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElUZXh0RmlsZUJ1ZmZlck1hbmFnZXIgYnVmZmVyTWFuYWdlciA9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpOwotICAgICAgICBJUGF0aCBwYXRoID0gc291cmNlLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1ZmZlck1hbmFnZXIuY29ubmVjdChwYXRoLCBMb2NhdGlvbktpbmQuSUZJTEUsIG51bGwpOwotICAgICAgICAgICAgY29ubmVjdGVkID0gdHJ1ZTsKLQotICAgICAgICAgICAgSURvY3VtZW50IGRvY3VtZW50ID0gYnVmZmVyTWFuYWdlci5nZXRUZXh0RmlsZUJ1ZmZlcihwYXRoLCBMb2NhdGlvbktpbmQuSUZJTEUpLmdldERvY3VtZW50KCk7Ci0KLSAgICAgICAgICAgIHJld3JpdGVyLnNldChtZW1iZXJWYWx1ZVBhaXIsIE1lbWJlclZhbHVlUGFpci5WQUxVRV9QUk9QRVJUWSwgdmFsdWUsIG51bGwpOwotCi0gICAgICAgICAgICBUZXh0RWRpdCBhbm5vdGF0aW9uVGV4dEVkaXQgPSByZXdyaXRlci5yZXdyaXRlQVNUKGRvY3VtZW50LCBnZXRPcHRpb25zKHNvdXJjZSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KGFubm90YXRpb25UZXh0RWRpdCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZFRleHRFZGl0R3JvdXAobmV3IFRleHRFZGl0R3JvdXAoIkFBIiwgbmV3IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgVGV4dEVkaXRbXSB7IGFubm90YXRpb25UZXh0RWRpdCB9KSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoY29ubmVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyTWFuYWdlci5kaXNjb25uZWN0KHBhdGgsIExvY2F0aW9uS2luZC5JRklMRSwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGdldE9wdGlvbnMoSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UpIHsKLSAgICAgICAgTWFwIG9wdGlvbnMgPSBzb3VyY2UuZ2V0SmF2YVByb2plY3QoKS5nZXRPcHRpb25zKHRydWUpOwotICAgICAgICBvcHRpb25zLnB1dChGT1JNQVRURVJfSU5TRVJUX1NQQUNFX0JFRk9SRV9BU1NJR05NRU5UX09QRVJBVE9SLCBET19OT1RfSU5TRVJUKTsKLSAgICAgICAgb3B0aW9ucy5wdXQoRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9BRlRFUl9BU1NJR05NRU5UX09QRVJBVE9SLCBET19OT1RfSU5TRVJUKTsKLSAgICAgICAgcmV0dXJuIG9wdGlvbnM7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBnZXRDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3JGb3JUeXBlKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIAotICAgICAgICAgICAgYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIGNoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciA9IG51bGw7Ci0gICAgICAgIGlmIChhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgY2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yID0gVHlwZURlY2xhcmF0aW9uLk1PRElGSUVSUzJfUFJPUEVSVFk7IAotICAgICAgICB9Ci0gICAgICAgIGlmIChhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEVudW1EZWNsYXJhdGlvbikgewotICAgICAgICAgICAgY2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yID0gRW51bURlY2xhcmF0aW9uLk1PRElGSUVSUzJfUFJPUEVSVFk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgY2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yID0gQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5NT0RJRklFUlMyX1BST1BFUlRZOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIGdldENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvckZvck1ldGhvZCgKLSAgICAgICAgICAgIEJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24pIHsKLSAgICAgICAgaWYgKGJvZHlEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWV0aG9kRGVjbGFyYXRpb24uTU9ESUZJRVJTMl9QUk9QRVJUWTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYm9keURlY2xhcmF0aW9uIGluc3RhbmNlb2YgQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIEFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24uTU9ESUZJRVJTMl9QUk9QRVJUWTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBnZXRBU1RQYXJzZXIoSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UsIGJvb2xlYW4gcmVzb2x2ZUJpbmRpbmdzKSB7Ci0gICAgICAgIEFTVFBhcnNlciBwYXJzZXIgPSBBU1RQYXJzZXIubmV3UGFyc2VyKEFTVC5KTFMzKTsKLSAgICAgICAgcGFyc2VyLnNldFNvdXJjZShzb3VyY2UpOwotICAgICAgICBwYXJzZXIuc2V0UmVzb2x2ZUJpbmRpbmdzKHJlc29sdmVCaW5kaW5ncyk7Ci0gICAgICAgIHBhcnNlci5zZXRCaW5kaW5nc1JlY292ZXJ5KHJlc29sdmVCaW5kaW5ncyk7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBwYXJzZXIuY3JlYXRlQVNUKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICBjb21waWxhdGlvblVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOwotICAgICAgICByZXR1cm4gY29tcGlsYXRpb25Vbml0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGV4dEZpbGVDaGFuZ2UgY3JlYXRlVGV4dEZpbGVDaGFuZ2UoU3RyaW5nIHRleHRGaWxlQ2hhbmdlTmFtZSwgSUZpbGUgZmlsZSkgewotICAgICAgICBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSh0ZXh0RmlsZUNoYW5nZU5hbWUsIGZpbGUpOwotICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICB0ZXh0RmlsZUNoYW5nZS5zZXRFZGl0KG11bHRpVGV4dEVkaXQpOwotICAgICAgICByZXR1cm4gdGV4dEZpbGVDaGFuZ2U7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IGdldE1ldGhvZFBhcmFtZXRlcnMoSVR5cGUgdHlwZSwgZmluYWwgSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UgPSB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOwotICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gZ2V0QVNUUGFyc2VyKHNvdXJjZSwgZmFsc2UpOwotICAgICAgICBmaW5hbCBMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGNvbXBpbGF0aW9uVW5pdC5hY2NlcHQobmV3IEFTVFZpc2l0b3IoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVNZXRob2RzKG1ldGhvZERlY2xhcmF0aW9uLCBtZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuYWRkQWxsKG1ldGhvZERlY2xhcmF0aW9uLnBhcmFtZXRlcnMoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci52aXNpdChtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOyAgICAgCi0gICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICBOYW1lIGFubm90YXRpb25UeXBlTmFtZSA9IGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKTsKLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25UeXBlTmFtZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBhcmVUeXBlTmFtZXMoQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24sIElUeXBlIHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIGFic3RyYWN0VHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKHR5cGUuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgfQotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21wYXJlTWV0aG9kcyhNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgSU1ldGhvZCBtZXRob2QpIHsKLSAgICAJaWYgKG1ldGhvZERlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpKSkgewotCSAgICAJU3RyaW5nW10gcGFyYW1ldGV0VHlwZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkgICAgCUxpc3Q8U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbj4gbWV0aG9kRGVjbGFyYXRpb25QYXJhbWV0ZXJzID0gbWV0aG9kRGVjbGFyYXRpb24ucGFyYW1ldGVycygpOwotCSAgICAJaWYgKHBhcmFtZXRldFR5cGVzLmxlbmd0aCA9PSBtZXRob2REZWNsYXJhdGlvblBhcmFtZXRlcnMuc2l6ZSgpKSB7Ci0JCSAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXRUeXBlcy5sZW5ndGg7IGkrKykgewotCSAgICAgICAgICAgICAgICBTdHJpbmcgc2ltcGxlTmFtZTEgPSBTaWduYXR1cmUudG9TdHJpbmcocGFyYW1ldGV0VHlwZXNbaV0pOwotCQkJCQlTdHJpbmcgc2ltcGxlTmFtZTIgPSBtZXRob2REZWNsYXJhdGlvblBhcmFtZXRlcnMuZ2V0KGkpLmdldFR5cGUoKS50b1N0cmluZygpOwotCQkJCQlpZiAoIXNpbXBsZU5hbWUxLmVxdWFscyhzaW1wbGVOYW1lMikpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJICAgIAlyZXR1cm4gdHJ1ZTsKLQkgICAgCX0KLSAgICAJfQotICAgIAlyZXR1cm4gZmFsc2U7Ci0JfQotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21wYXJlTWV0aG9kcyhNZXRob2REZWNsYXJhdGlvbiBtZXRob2RPbmUsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZFR3bykgewotICAgIAlpZiAobWV0aG9kT25lLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKG1ldGhvZFR3by5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpKSkgewotCSAgICAJTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBtZXRob2RQYXJhbWV0ZXJzT25lID0gbWV0aG9kT25lLnBhcmFtZXRlcnMoKTsKLQkgICAgCUxpc3Q8U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbj4gbWV0aG9kUGFyYW1ldGVyc1R3byA9IG1ldGhvZFR3by5wYXJhbWV0ZXJzKCk7Ci0JICAgIAlpZiAobWV0aG9kUGFyYW1ldGVyc09uZS5zaXplKCkgPT0gbWV0aG9kUGFyYW1ldGVyc1R3by5zaXplKCkpIHsKLQkJICAgIAlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZFBhcmFtZXRlcnNPbmUuc2l6ZSgpOyBpKyspIHsKLQkJICAgIAkJU3RyaW5nIHNpbXBsZU5hbWUxID0gbWV0aG9kUGFyYW1ldGVyc09uZS5nZXQoaSkuZ2V0VHlwZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBzaW1wbGVOYW1lMiA9IG1ldGhvZFBhcmFtZXRlcnNUd28uZ2V0KGkpLmdldFR5cGUoKS50b1N0cmluZygpOwotCQkJCQlpZiAoIXNpbXBsZU5hbWUxLmVxdWFscyhzaW1wbGVOYW1lMikpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJICAgIAlyZXR1cm4gdHJ1ZTsKLQkgICAgCX0KLSAgICAJfQotICAgIAlyZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBhcmVNZXRob2RzKGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZE9uZSwKLSAgICAgICAgICAgIGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZFR3bykgewotICAgICAgICByZXR1cm4gY29tcGFyZU1ldGhvZE5hbWVzKG1ldGhvZE9uZSwgbWV0aG9kVHdvKQotICAgICAgICAgICAgICAgICYmIGNvbXBhcmVNZXRob2RQYXJhbWV0ZXJUeXBlcyhtZXRob2RPbmUsIG1ldGhvZFR3byk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb21wYXJlTWV0aG9kTmFtZXMoY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kT25lLAotICAgICAgICAgICAgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kVHdvKSB7Ci0gICAgICAgIHJldHVybiBtZXRob2RPbmUuZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyhtZXRob2RUd28uZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICB9Ci0KLS8vICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29tcGFyZU1ldGhvZFJldHVyblR5cGVzKGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZE9uZSwKLS8vICAgICAgICAgICAgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kVHdvKSB7Ci0vLyAgICAgICAgcmV0dXJuIG1ldGhvZE9uZS5nZXRSZXR1cm5UeXBlKCkuZXF1YWxzKG1ldGhvZFR3by5nZXRSZXR1cm5UeXBlKCkpOwotLy8gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb21wYXJlTWV0aG9kUGFyYW1ldGVyVHlwZXMoY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kT25lLAotICAgICAgICAgICAgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kVHdvKSB7Ci0gICAgICAgIGludCBudW1iZXJPZlBhcmFtZXRlcnNPbmUgPSBtZXRob2RPbmUuZ2V0UGFyYW1ldGVycygpLnNpemUoKTsKLSAgICAgICAgaW50IG51bWJlck9mUGFyYW1ldGVyc1R3byA9IG1ldGhvZFR3by5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpOwotCi0gICAgICAgIGlmIChudW1iZXJPZlBhcmFtZXRlcnNPbmUgPT0gbnVtYmVyT2ZQYXJhbWV0ZXJzVHdvKSB7Ci0gICAgICAgICAgICBMaXN0PFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzT25lID0gKExpc3Q8UGFyYW1ldGVyRGVjbGFyYXRpb24+KSBtZXRob2RPbmUuZ2V0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVyc1R3byA9IChMaXN0PFBhcmFtZXRlckRlY2xhcmF0aW9uPikgbWV0aG9kVHdvLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyc09uZS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICghcGFyYW1ldGVyc09uZS5nZXQoaSkuZ2V0VHlwZSgpLmVxdWFscyhwYXJhbWV0ZXJzVHdvLmdldChpKS5nZXRUeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21wYXJlTWV0aG9kTmFtZXMoQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbiBtZW1tYmVyRGVjbGFyYXRpb24sIElNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIGlmIChtZW1tYmVyRGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHMobWV0aG9kLmdldEVsZW1lbnROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZUZpZWxkTmFtZXMoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uLCBJRmllbGQgZmllbGQpIHsKLSAgICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ+IGZyYWdtZW50cyA9IGZpZWxkRGVjbGFyYXRpb24uZnJhZ21lbnRzKCk7Ci0gICAgICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA6IGZyYWdtZW50cykgewotICAgICAgICAgICBpZiAodmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKGZpZWxkLmdldEVsZW1lbnROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBhY2NvdW50Rm9yT3ZlcmxvYWRlZE1ldGhvZHMoSVR5cGUgdHlwZSwgSU1ldGhvZCBtZXRob2QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgIAlMaXN0PElNZXRob2Q+IG1ldGhvZHMgPSAgQXJyYXlzLmFzTGlzdCh0eXBlLmdldE1ldGhvZHMoKSk7Ci0gICAgCUxpc3Q8SU1ldGhvZD4gc2ltaWxhck1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PElNZXRob2Q+KCk7Ci0gICAgCWZvciAoSU1ldGhvZCBtZXRob2RUb1Rlc3QgOiBtZXRob2RzKSB7Ci0gICAgCQlpZiAoIW1ldGhvZC5lcXVhbHMobWV0aG9kVG9UZXN0KSAmJiBtZXRob2QuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKAotICAgIAkJCQltZXRob2RUb1Rlc3QuZ2V0RWxlbWVudE5hbWUoKSkgJiYgbWV0aG9kVG9UZXN0LmdldFNvdXJjZVJhbmdlKCkuZ2V0T2Zmc2V0KCkgPCAKLSAgICAJCQkJbWV0aG9kLmdldFNvdXJjZVJhbmdlKCkuZ2V0T2Zmc2V0KCkpIHsKLSAgICAJCQlzaW1pbGFyTWV0aG9kcy5hZGQobWV0aG9kVG9UZXN0KTsKLQkJCX0KLQkJfQotICAgIAlyZXR1cm4gc2ltaWxhck1ldGhvZHMuc2l6ZSgpID4gMCA/IEludGVnZXIudG9TdHJpbmcoc2ltaWxhck1ldGhvZHMuc2l6ZSgpKSA6ICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29tcGFyZUFubm90YXRpb25OYW1lcyhBbm5vdGF0aW9uIG5ld0Fubm90YXRpb24sIEFubm90YXRpb24gZXhpc3RpbmdBbm5vdGF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoZXhpc3RpbmdBbm5vdGF0aW9uKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKG5ld0Fubm90YXRpb24pKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb21wYXJlQW5ub3RhdGlvbk5hbWVzKElBbm5vdGF0aW9uIG5ld0Fubm90YXRpb24sIEFubm90YXRpb24gZXhpc3RpbmdBbm5vdGF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoZXhpc3RpbmdBbm5vdGF0aW9uKS5lcXVhbHMobmV3QW5ub3RhdGlvbi5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQW5ub3RhdGlvblByZXNlbnQoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotICAgICAgICBMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBtb2RpZmllcnMgPSBwYXJhbWV0ZXIubW9kaWZpZXJzKCk7Ci0gICAgICAgIGZvciAoSUV4dGVuZGVkTW9kaWZpZXIgZXh0ZW5kZWRNb2RpZmllciA6IG1vZGlmaWVycykgewotICAgICAgICAgICAgaWYgKGV4dGVuZGVkTW9kaWZpZXIgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBleGlzdGluZ0Fubm90YXRpb24gPSAoQW5ub3RhdGlvbikgZXh0ZW5kZWRNb2RpZmllcjsKLSAgICAgICAgICAgICAgICBpZiAoQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGV4aXN0aW5nQW5ub3RhdGlvbikuZXF1YWxzKGFubm90YXRpb25OYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fubm90YXRpb25QcmVzZW50KFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyLAotICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5hdG90YXRpb25Ub0FkZCkgewotICAgICAgICBib29sZWFuIGV4aXN0cyA9IGZhbHNlOwotICAgICAgICBMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBtb2RpZmllcnMgPSBwYXJhbWV0ZXIubW9kaWZpZXJzKCk7Ci0gICAgICAgIGZvciAoSUV4dGVuZGVkTW9kaWZpZXIgZXh0ZW5kZWRNb2RpZmllciA6IG1vZGlmaWVycykgewotICAgICAgICAgICAgaWYgKGV4dGVuZGVkTW9kaWZpZXIgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBleGlzdGluZ0Fubm90YXRpb24gPSAoQW5ub3RhdGlvbikgZXh0ZW5kZWRNb2RpZmllcjsKLSAgICAgICAgICAgICAgICBpZiAoY29tcGFyZUFubm90YXRpb25OYW1lcyhhbm5hdG90YXRpb25Ub0FkZCwgZXhpc3RpbmdBbm5vdGF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGV4aXN0czsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQW5ub3RhdGlvblByZXNlbnQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiBpc0Fubm90YXRpb25QcmVzZW50KCgoSUNvbXBpbGF0aW9uVW5pdClqYXZhRWxlbWVudCkuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb25OYW1lKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT04pIHsKLSAgICAgICAgCUlQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2xhcmF0aW9uID0gKElQYWNrYWdlRGVjbGFyYXRpb24pamF2YUVsZW1lbnQ7Ci0gICAgICAgIAlzb3VyY2UgPSAoSUNvbXBpbGF0aW9uVW5pdClwYWNrYWdlRGVjbGFyYXRpb24uZ2V0UGFyZW50KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlzb3VyY2UgPSAoKElNZW1iZXIpamF2YUVsZW1lbnQpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbnQgZWxlbWVudFR5cGUgPSBqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpOwotICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gZ2V0QVNUUGFyc2VyKHNvdXJjZSwgZmFsc2UpOwotICAgICAgICBpZiAoZWxlbWVudFR5cGUgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT04pIHsKLSAgICAgICAgICAgIHJldHVybiBpc0Fubm90YXRpb25QcmVzZW50KGNvbXBpbGF0aW9uVW5pdC5nZXRQYWNrYWdlKCksIGFubm90YXRpb25OYW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZWxlbWVudFR5cGUgPT0gSUphdmFFbGVtZW50LlRZUEUgfHwgZWxlbWVudFR5cGUgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCB8fCAKLSAgICAgICAgICAgICAgICBlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuRklFTEQpIHsKLSAgICAgICAgICAgIHJldHVybiBpc0Fubm90YXRpb25QcmVzZW50KGNvbXBpbGF0aW9uVW5pdCwgamF2YUVsZW1lbnQsIGFubm90YXRpb25OYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQW5ub3RhdGlvblByZXNlbnQoUGFja2FnZURlY2xhcmF0aW9uIHBhY2thZ2VEZWNsYXJhdGlvbiwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0gICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMgPSBwYWNrYWdlRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMoKTsKLSAgICAgICAgZm9yIChBbm5vdGF0aW9uIGV4aXN0aW5nQW5ub3RhdGlvbiA6IGFubm90YXRpb25zKSB7Ci0gICAgICAgICAgICBpZiAoQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGV4aXN0aW5nQW5ub3RhdGlvbikuZXF1YWxzKGFubm90YXRpb25OYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQW5ub3RhdGlvblByZXNlbnQoUGFja2FnZURlY2xhcmF0aW9uIHBhY2thZ2VEZWNsYXJhdGlvbiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMgPSBwYWNrYWdlRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMoKTsKLSAgICAgICAgZm9yIChBbm5vdGF0aW9uIGV4aXN0aW5nQW5ub3RhdGlvbiA6IGFubm90YXRpb25zKSB7Ci0gICAgICAgICAgICBpZiAoY29tcGFyZUFubm90YXRpb25OYW1lcyhhbm5vdGF0aW9uLCBleGlzdGluZ0Fubm90YXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQW5ub3RhdGlvblByZXNlbnQoQm9keURlY2xhcmF0aW9uIGJvZHlEZWNsYXJhdGlvbiwgQW5ub3RhdGlvbiBhbm5hdG90YXRpb25Ub0FkZCkgewotICAgICAgICBib29sZWFuIGV4aXN0cyA9IGZhbHNlOwotICAgICAgICBMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBtb2RpZmllcnMgPSBib2R5RGVjbGFyYXRpb24ubW9kaWZpZXJzKCk7Ci0gICAgICAgIGZvciAoSUV4dGVuZGVkTW9kaWZpZXIgZXh0ZW5kZWRNb2RpZmllciA6IG1vZGlmaWVycykgewotICAgICAgICAgICAgaWYgKGV4dGVuZGVkTW9kaWZpZXIgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBleGlzdGluZ0Fubm90YXRpb24gPSAoQW5ub3RhdGlvbikgZXh0ZW5kZWRNb2RpZmllcjsKLSAgICAgICAgICAgICAgICBpZiAoY29tcGFyZUFubm90YXRpb25OYW1lcyhhbm5hdG90YXRpb25Ub0FkZCwgZXhpc3RpbmdBbm5vdGF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGV4aXN0czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQW5ub3RhdGlvblByZXNlbnQoQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwgSUphdmFFbGVtZW50IGphdmFFbGVtZW50LAotICAgICAgICAgICAgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0gICAgICAgIExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IG1vZGlmaWVycyA9IGdldEV4dGVuZGVkTW9kaWZpZXJzKGNvbXBpbGF0aW9uVW5pdCwgamF2YUVsZW1lbnQpOwotICAgICAgICBmb3IgKElFeHRlbmRlZE1vZGlmaWVyIGV4dGVuZGVkTW9kaWZpZXIgOiBtb2RpZmllcnMpIHsKLSAgICAgICAgICAgIGlmIChleHRlbmRlZE1vZGlmaWVyLmlzQW5ub3RhdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBleGlzdGluZ0Fubm90YXRpb24gPSAoQW5ub3RhdGlvbikgZXh0ZW5kZWRNb2RpZmllcjsKLSAgICAgICAgICAgICAgICBpZiAoQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGV4aXN0aW5nQW5ub3RhdGlvbikuZXF1YWxzKGFubm90YXRpb25OYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gZ2V0RXh0ZW5kZWRNb2RpZmllcnMoQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwgCi0gICAgICAgICAgICBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQpIHsKLSAgICAgICAgSVR5cGUgdHlwZSA9IGNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlUm9vdCgpLmZpbmRQcmltYXJ5VHlwZSgpOwotICAgICAgICBMaXN0PEFic3RyYWN0VHlwZURlY2xhcmF0aW9uPiB0eXBlcyA9IGNvbXBpbGF0aW9uVW5pdC50eXBlcygpOwotICAgICAgICBmb3IgKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGFic3RyYWN0VHlwZURlY2xhcmF0aW9uIDogdHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChjb21wYXJlVHlwZU5hbWVzKGFic3RyYWN0VHlwZURlY2xhcmF0aW9uLCB0eXBlKSkgewotICAgICAgICAgICAgICAgIExpc3Q8Qm9keURlY2xhcmF0aW9uPiBib2R5RGVjbGFyYXRpb25zID0gZ2V0Qm9keURlY2xhcmF0aW9uc0ZvclR5cGUoYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24gPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvZHlEZWNsYXJhdGlvbiA9IGFic3RyYWN0VHlwZURlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvZHlEZWNsYXJhdGlvbiA9IGdldE1ldGhvZERlY2xhcmF0aW9uKGJvZHlEZWNsYXJhdGlvbnMsIChJTWV0aG9kKSBqYXZhRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5GSUVMRCkgewotICAgICAgICAgICAgICAgICAgICBib2R5RGVjbGFyYXRpb24gPSBnZXRGaWVsZERlY2xhcmF0aW9uKGJvZHlEZWNsYXJhdGlvbnMsIChJRmllbGQpIGphdmFFbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gYm9keURlY2xhcmF0aW9uICE9IG51bGwgPyBib2R5RGVjbGFyYXRpb24ubW9kaWZpZXJzKCkgOiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgfQotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxCb2R5RGVjbGFyYXRpb24+IGdldEJvZHlEZWNsYXJhdGlvbnNGb3JUeXBlKAotICAgICAgICAgICAgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgaWYgKGFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgYWJzdHJhY3RUeXBlRGVjbGFyYXRpb247Ci0gICAgICAgICAgICByZXR1cm4gdHlwZURlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBFbnVtRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgIEVudW1EZWNsYXJhdGlvbiBlbnVtRGVjbGFyYXRpb24gPSAoRW51bURlY2xhcmF0aW9uKSBhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKLSAgICAgICAgICAgIHJldHVybiBlbnVtRGVjbGFyYXRpb24uYm9keURlY2xhcmF0aW9ucygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiA9IAotICAgICAgICAgICAgICAgIChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEJvZHlEZWNsYXJhdGlvbiBnZXRNZXRob2REZWNsYXJhdGlvbihMaXN0PEJvZHlEZWNsYXJhdGlvbj4gYm9keURlY2xhcmF0aW9ucywgCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBmb3IgKEJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24gOiBib2R5RGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICBpZiAoYm9keURlY2xhcmF0aW9uIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAoY29tcGFyZU1ldGhvZHMoKE1ldGhvZERlY2xhcmF0aW9uKWJvZHlEZWNsYXJhdGlvbiwgbWV0aG9kKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm9keURlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChib2R5RGVjbGFyYXRpb24gaW5zdGFuY2VvZiBBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVNZXRob2ROYW1lcygoQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbilib2R5RGVjbGFyYXRpb24sIG1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJvZHlEZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQm9keURlY2xhcmF0aW9uIGdldEZpZWxkRGVjbGFyYXRpb24oTGlzdDxCb2R5RGVjbGFyYXRpb24+IGJvZHlEZWNsYXJhdGlvbnMsIElGaWVsZCBmaWVsZCkgewotICAgICAgICBmb3IgKEJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24gOiBib2R5RGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICBpZiAoYm9keURlY2xhcmF0aW9uIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIGlmIChjb21wYXJlRmllbGROYW1lcygoRmllbGREZWNsYXJhdGlvbilib2R5RGVjbGFyYXRpb24sIGZpZWxkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm9keURlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIGdldE1ldGhvZFBhcmFtZXRlcihDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LCAKLSAgICAgICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCwgaW50IG9mZnNldCkgewotICAgICAgICBpZiAoY29tcGlsYXRpb25Vbml0ID09IG51bGwpIHsKLSAgICAgICAgICBjb21waWxhdGlvblVuaXQgPSBnZXRBU1RQYXJzZXIobWV0aG9kLmdldENvbXBpbGF0aW9uVW5pdCgpLCBmYWxzZSk7ICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIElUeXBlIHR5cGUgPSBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpOwotICAgICAgICBMaXN0PEFic3RyYWN0VHlwZURlY2xhcmF0aW9uPiB0eXBlcyA9IGNvbXBpbGF0aW9uVW5pdC50eXBlcygpOwotICAgICAgICBmb3IgKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGFic3RyYWN0VHlwZURlY2xhcmF0aW9uIDogdHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyh0eXBlLmdldEVsZW1lbnROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1ldGhvZFRvQW5ub3RhdGVOYW1lID0gbWV0aG9kLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgTGlzdDxCb2R5RGVjbGFyYXRpb24+IGJvZHlEZWNsYXJhdGlvbnMgPSBnZXRCb2R5RGVjbGFyYXRpb25zRm9yVHlwZShhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgZm9yIChCb2R5RGVjbGFyYXRpb24gYm9keURlY2xhcmF0aW9uIDogYm9keURlY2xhcmF0aW9ucykgewotICAgICAgICAgICAgICAgICAgICBpZiAoYm9keURlY2xhcmF0aW9uIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBib2R5RGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kRGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHMobWV0aG9kVG9Bbm5vdGF0ZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gbWV0aG9kRGVjbGFyYXRpb24ucGFyYW1ldGVycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXJhbWV0ZXJTdGFydFBvc2l0aW9uID0gcGFyYW1ldGVyLmdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhcmFtZXRlckxlbmd0aCA9IHBhcmFtZXRlci5nZXRMZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBwYXJhbWV0ZXJTdGFydFBvc2l0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgb2Zmc2V0IDw9IHBhcmFtZXRlclN0YXJ0UG9zaXRpb24gKyBwYXJhbWV0ZXJMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbWV0ZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb21wYXJlTWV0aG9kUGFyYW1ldGVycyhTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtT25lLAotICAgICAgICAgICAgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbVR3bykgewotICAgICAgICBTdHJpbmcgdHlwZU9uZSA9IHBhcmFtT25lLmdldFR5cGUoKS50b1N0cmluZygpOwotICAgICAgICBTdHJpbmcgbmFtZU9uZSA9IHBhcmFtT25lLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCk7Ci0KLSAgICAgICAgU3RyaW5nIHR5cGVUd28gPSBwYXJhbVR3by5nZXRUeXBlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgU3RyaW5nIG5hbWVUd28gPSBwYXJhbVR3by5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpOwotCi0gICAgICAgIHJldHVybiAodHlwZU9uZS5lcXVhbHModHlwZVR3bykpICYmIChuYW1lT25lLmVxdWFscyhuYW1lVHdvKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0gICAgICAgIEFubm90YXRpb25WYWx1ZSBhbm5vdGF0aW9uVmFsdWUgPSBnZXRBbm5vdGF0aW9uVmFsdWUobWlycm9yLCBhdHRyaWJ1dGVOYW1lKTsKLSAgICAgICAgaWYgKGFubm90YXRpb25WYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvblZhbHVlLmdldFZhbHVlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBCb29sZWFuIGdldEJvb2xlYW5WYWx1ZShBbm5vdGF0aW9uTWlycm9yIG1pcnJvciwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0U3RyaW5nVmFsdWUobWlycm9yLCBhdHRyaWJ1dGVOYW1lKTsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEFubm90YXRpb25WYWx1ZSBnZXRBbm5vdGF0aW9uVmFsdWUoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0gICAgICAgIE1hcDxBbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbiwgQW5ub3RhdGlvblZhbHVlPiB2YWx1ZXMgPSBtaXJyb3IuZ2V0RWxlbWVudFZhbHVlcygpOwotICAgICAgICBTZXQ8TWFwLkVudHJ5PEFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uLCBBbm5vdGF0aW9uVmFsdWU+PiBlbnRyeVNldCA9IHZhbHVlcy5lbnRyeVNldCgpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeTxBbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbiwgQW5ub3RhdGlvblZhbHVlPiBlbnRyeSA6IGVudHJ5U2V0KSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRTaW1wbGVOYW1lKCkuZXF1YWxzKGF0dHJpYnV0ZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uTWlycm9yIGdldEFubm90YXRpb24oRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbikgewotICAgICAgICBDb2xsZWN0aW9uPEFubm90YXRpb25NaXJyb3I+IGFhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0KLSAgICAgICAgZm9yIChBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgOiBhYW5ub3RhdGlvbk1pcnJvcnMpIHsKLSAgICAgICAgICAgIGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiA9IGFubm90YXRpb25NaXJyb3IKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25UeXBlKCkuZ2V0RGVjbGFyYXRpb24oKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGFubm90YXRpb24uZ2V0Q2Fub25pY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uTWlycm9yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmdWYWx1ZShBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbikgewotICAgICAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZ2V0QW5ub3RhdGlvblZhbHVlKChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uLCBhdHRyaWJ1dGVOYW1lKTsKLSAgICAgICAgICAgIGlmIChleHByZXNzaW9uICE9IG51bGwgJiYgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFN0cmluZ0xpdGVyYWwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChTdHJpbmdMaXRlcmFsKSBleHByZXNzaW9uKS5nZXRMaXRlcmFsVmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RW51bVZhbHVlKEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBnZXRBbm5vdGF0aW9uVmFsdWUoKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb24sIGF0dHJpYnV0ZU5hbWUpOwotICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24gIT0gbnVsbCAmJiBleHByZXNzaW9uIGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAoKFF1YWxpZmllZE5hbWUpIGV4cHJlc3Npb24pLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCb29sZWFuIGdldEJvb2xlYW5WYWx1ZShBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbikgewotICAgICAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZ2V0QW5ub3RhdGlvblZhbHVlKChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uLCBhdHRyaWJ1dGVOYW1lKTsKLSAgICAgICAgICAgIGlmIChleHByZXNzaW9uICE9IG51bGwgJiYgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEJvb2xlYW5MaXRlcmFsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZigoKEJvb2xlYW5MaXRlcmFsKSBleHByZXNzaW9uKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbiBnZXRBbm5vdGF0aW9uVmFsdWUoTm9ybWFsQW5ub3RhdGlvbiBub3JtYWxBbm5vdGF0aW9uLCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5vcm1hbEFubm90YXRpb24udmFsdWVzKCk7Ci0gICAgICAgIGZvciAoTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA6IG1lbWJlclZhbHVlUGFpcnMpIHsKLSAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXIuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHMoYXR0cmlidXRlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKEJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24sCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbikgewotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb24oYm9keURlY2xhcmF0aW9uLm1vZGlmaWVycygpLCBhbm5vdGF0aW9uKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXIubW9kaWZpZXJzKCksIGFubm90YXRpb24pOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gbW9kaWZpZXJzLCAKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIGlmIChtb2RpZmllcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChJRXh0ZW5kZWRNb2RpZmllciBleHRlbmRlZE1vZGlmaWVyIDogbW9kaWZpZXJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV4dGVuZGVkTW9kaWZpZXIgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gYXN0QW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uKSBleHRlbmRlZE1vZGlmaWVyOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBhc3RBbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlTmFtZS5lcXVhbHMoYW5ub3RhdGlvbi5nZXRDYW5vbmljYWxOYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZU5hbWUuZXF1YWxzKGFubm90YXRpb24uZ2V0U2ltcGxlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFzdEFubm90YXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoSUFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZShhbm5vdGF0aW9uLCBhdHRyaWJ1dGVOYW1lKTsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbnVtVmFsdWUoSUFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgYXR0cmlidXRlTmFtZSk7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmluZGV4T2YoIi4iKSAhPSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZyh2YWx1ZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgQm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoSUFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgYXR0cmlidXRlTmFtZSk7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBbm5vdGF0aW9uVmFsdWUoSUFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgSU1lbWJlclZhbHVlUGFpcltdIG1lbWJlclZhbHVlUGFpcnMgPSBhbm5vdGF0aW9uLmdldE1lbWJlclZhbHVlUGFpcnMoKTsKLSAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpcnMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgZm9yIChJTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA6IG1lbWJlclZhbHVlUGFpcnMpIHsKLSAgICAgICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyLmdldE1lbWJlck5hbWUoKS5lcXVhbHMoYXR0cmlidXRlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElBbm5vdGF0aW9uIGdldEFubm90YXRpb24oSUFubm90YXRhYmxlIGFubm90YXRhYmxlLAotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBJQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gYW5ub3RhdGFibGUuZ2V0QW5ub3RhdGlvbnMoKTsKLSAgICAgICAgZm9yIChJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgICAgIFN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IGpkdEFubm90YXRpb24uZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uTmFtZS5lcXVhbHMoYW5ub3RhdGlvbi5nZXRDYW5vbmljYWxOYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgIHx8IGFubm90YXRpb25OYW1lLmVxdWFscyhhbm5vdGF0aW9uLmdldFNpbXBsZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gamR0QW5ub3RhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9Bbm5vdGF0aW9uc0NvcmVQcm9jZXNzb3JGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQW5ub3RhdGlvbnNDb3JlUHJvY2Vzc29yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzA0YWMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9Bbm5vdGF0aW9uc0NvcmVQcm9jZXNzb3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50OwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeTsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvcnM7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25zQ29yZVByb2Nlc3NvckZhY3RvcnkgaW1wbGVtZW50cyBBbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeSB7Ci0KLSAgICBwdWJsaWMgQW5ub3RhdGlvblByb2Nlc3NvciBnZXRQcm9jZXNzb3JGb3IoU2V0PEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24+IGFubm90YXRpb25TZXQsCi0gICAgICAgICAgICBBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQgcHJvY2Vzc29yRW52aXJvbm1lbnQpIHsKLSAgICAgICAgCi0gICAgICAgIExpc3Q8QW5ub3RhdGlvblByb2Nlc3Nvcj4gYW5ub3RhdGlvblByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb25Qcm9jZXNzb3I+KCk7Ci0gICAgICAgIAotICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4+IGFubm90YXRpb25Qcm9jZXNzb3JDYWNoZSA9IAotICAgICAgICAgICAgQW5ub3RhdGlvbnNNYW5hZ2VyLmdldEFubm90YXRpb25Qcm9jZXNzb3JzQ2FjaGUoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIDogYW5ub3RhdGlvblNldCkgewotICAgICAgICAgICAgTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IHByb2Nlc3NvckVsZW1lbnRzID0gYW5ub3RhdGlvblByb2Nlc3NvckNhY2hlLmdldCgKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCA6IHByb2Nlc3NvckVsZW1lbnRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25FbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBnZXRBbm5vdGF0aW9uUHJvY2Vzc29yKGNvbmZpZ3VyYXRpb25FbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvckVudmlyb25tZW50KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvY2Vzc29ycy5hZGQocHJvY2Vzc29yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25Qcm9jZXNzb3JzLmdldENvbXBvc2l0ZUFubm90YXRpb25Qcm9jZXNzb3IoYW5ub3RhdGlvblByb2Nlc3NvcnMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQW5ub3RhdGlvblByb2Nlc3NvciBnZXRBbm5vdGF0aW9uUHJvY2Vzc29yKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCwKLSAgICAgICAgICAgIEFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudCBwcm9jZXNzb3JFbnZpcm9ubWVudCkgewotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciBhbm5vdGF0aW9uUHJvY2Vzc29yID0gCi0gICAgICAgICAgICAgICAgICAoQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yKWNvbmZpZ3VyYXRpb25FbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gICAgICAgICAgICAgIGFubm90YXRpb25Qcm9jZXNzb3Iuc2V0QW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50KHByb2Nlc3NvckVudmlyb25tZW50KTsKLSAgICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25Qcm9jZXNzb3I7Ci0gICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICBBbm5vdGF0aW9uc0NvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IHN1cHBvcnRlZEFubm90YXRpb25UeXBlcygpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zTWFuYWdlci5nZXRBbm5vdGF0aW9uUHJvY2Vzc29yc0NhY2hlKCkua2V5U2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBzdXBwb3J0ZWRPcHRpb25zKCkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyMWQwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTliNjljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg5NGY4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNGcmkgTm92IDA3IDIzOjU4OjUyIEVTVCAyMDA4Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZDY0NzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuNC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLkNYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjAuMzA0LDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZTtidW5kbGUtdmVyc2lvbj0iMC40LjMiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBqYXZheC53c2RsO2J1bmRsZS12ZXJzaW9uPSJbMS42LjIsMS43LjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlO2J1bmRsZS12ZXJzaW9uPSIwLjUuMCIKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNy4wCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUNyZWF0ZWQtQnk6IDEuNS4wXzE0LWIwMyAoU3VuIE1pY3Jvc3lzdGVtcyBJbmMuKQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE2OWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+U2VwdGVtYmVyIDEyLCAyMDA4PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNGI4ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNmNmN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1DWEYgV2ViIFNlcnZpY2VzIENvbnN1bXB0aW9uIENvcmUgKEluY3ViYXRpb24pCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi1XRUJfU0VSVklDRV9MT0NBVE9SX0FYSVM9QXBhY2hlIENYRiBXZWIgU2VydmljZSBMb2NhdG9yCi1XRUJfU0VSVklDRV9MT0NBVE9SX0NBVEVHT1JZX0FYSVM9QXBhY2hlIENYRiBDb21wb25lbnRzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhM2E0YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LndzLmxvY2F0b3IiPgotICAgICAgPHdlYlNlcnZpY2VMb2NhdG9yQ2F0ZWdvcnkKLSAgICAgICAgIGlkPSJ3cy5sb2NhdG9yLmNhdGVnb3J5LmN4ZiIKLSAgICAgICAgIGxhYmVsPSIlV0VCX1NFUlZJQ0VfTE9DQVRPUl9DQVRFR09SWV9DWEYiLz4KLQotICAgICAgPHdlYlNlcnZpY2VMb2NhdG9yCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmxvY2F0b3IuQ1hGV2ViU2VydmljZUxvY2F0b3IiCi0gICAgICAgICBpZD0id3MubG9jYXRvci5jeGYiCi0gICAgICAgICBjYXRlZ29yeT0id3MubG9jYXRvci5jYXRlZ29yeS5jeGYiCi0gICAgICAgICBsYWJlbD0iV0VCX1NFUlZJQ0VfTE9DQVRPUl9DWEYiPgotICAgICAgPC93ZWJTZXJ2aWNlTG9jYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvQ1hGQ29uc3VtcHRpb25Db3JlTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvQ1hGQ29uc3VtcHRpb25Db3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNlYjAwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL0NYRkNvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQ1hGQ29uc3VtcHRpb25Db3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IAotICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLkNYRkNvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLSAgICAgICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyhDWEZDb25zdW1wdGlvbkNvcmVNZXNzYWdlcy5CVU5ETEVfTkFNRSwgQ1hGQ29uc3VtcHRpb25Db3JlTWVzc2FnZXMuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ1hGQ29uc3VtcHRpb25Db3JlTWVzc2FnZXMoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9DWEZDb25zdW1wdGlvbkNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9DWEZDb25zdW1wdGlvbkNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDk4MGJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvQ1hGQ29uc3VtcHRpb25Db3JlTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL0NYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTIwZmU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0gICAgLy8gVGhlIHBsdWctaW4gSUQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotICAgIHByaXZhdGUgc3RhdGljIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbiBwbHVnaW47Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbigpIHsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBwbHVnaW47Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKLSAgICAgICAgcGx1Z2luID0gdGhpczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwbHVnaW4gPSBudWxsOwotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgCi0gICAgICAgICAgICBtZXNzYWdlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotICAgICAgICBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4ubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgCi0gICAgICAgICAgICBleGNlcHRpb24udG9TdHJpbmcoKSwgZXhjZXB0aW9uKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFDbGllbnRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YUNsaWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRmZTI2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YUNsaWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5DWEZDb25zdW1wdGlvbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUucmVzb3VyY2VzLkphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5Db21tYW5kTGluZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkxhdW5jaFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLS8qKgotICogRXhlY3V0ZXMgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY3hmLnRvb2xzLndzZGx0by5XU0RMVG9KYXZhPC9jb2RlPiBjb21tYW5kIHdpdGggdGhlIGFyZ3VtZW50cwotICogbmVjZXNzYXJ5IHRvIGdlbmVyYXRlIGEgY2xpZW50LgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFDbGllbnRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENYRl9UT09MX0NMQVNTX05BTUUgPSAib3JnLmFwYWNoZS5jeGYudG9vbHMud3NkbHRvLldTRExUb0phdmEiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbDsKLQotICAgIHByaXZhdGUgSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+V1NETDJKYXZhQ2xpZW50Q29tbWFuZDwvY29kZT4gb2JqZWN0LgotICAgICAqIEBwYXJhbSBtb2RlbCB0aGUgPGNvZGU+V1NETDJKYXZhRGF0YU1vZGVsPC9jb2RlPiB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24KLSAgICAgKiBiZXR3ZWVuIGNvbW1hbmRzLgotICAgICAqLwotICAgIHB1YmxpYyBXU0RMMkphdmFDbGllbnRDb21tYW5kKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIobW9kZWwuZ2V0SmF2YVNvdXJjZUZvbGRlcigpKTsKLSAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCi0gICAgICAgIFN0cmluZ1tdIHByb2dBcmdzID0gQ29tbWFuZExpbmVVdGlscy5nZXRXU0RMMkphdmFHZW5lcmF0ZUNsaWVudEFyZ3VtZW50cyhtb2RlbCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0KLSAgICAgICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgICAgIExhdW5jaFV0aWxzLmxhdW5jaChqYXZhUHJvamVjdCwgV1NETDJKYXZhQ2xpZW50Q29tbWFuZC5DWEZfVE9PTF9DTEFTU19OQU1FLCBwcm9nQXJncyk7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY29weVcySkZpbGVzRnJvbVRtcCh0aGlzLm1vZGVsKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0KLQotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgTGlzdDxJUmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PElSZXNvdXJjZT4oKTsKLSAgICAgICAgY2hhbmdlZFJlc291cmNlcy5hZGRBbGwoamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLSAgICAgICAgaWYgKGNoYW5nZWRSZXNvdXJjZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiBjaGFuZ2VkUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuZGVsZXRlKHRydWUsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YUNsaWVudERlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YUNsaWVudERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhN2UxNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLkNYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dC5XU0RMMkphdmFQZXJzaXN0ZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLldTRExVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi0vKioKLSAqIExvYWRzIHRoZSA8Y29kZT5XU0RMMkphdmFEYXRhTW9kZWw8L2NvZGU+IHdpdGggdGhlIHBlcnNpc3RlZCBkZWZhdWx0cyAKLSAqIGZyb20gdGhlIHByZWZlcmVuY2VzIGFuZCB3aXRoIHRoZSBpbml0aWFsIHJ1bnRpbWUgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUKLSAqIHN0YXJ0aW5nIHBvaW50IFdTREwgVVJMLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFDbGllbnREZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICBwcml2YXRlIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIFN0cmluZyBwcm9qZWN0TmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBpbnB1dFVSTDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBXU0RMMkphdmFDbGllbnREZWZhdWx0aW5nQ29tbWFuZCBvYmplY3QuCi0gICAgICogQHBhcmFtIG1vZGVsIHRoZSA8Y29kZT5XU0RMMkphdmFEYXRhTW9kZWw8L2NvZGU+IHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbgotICAgICAqICAgICAgICAgICAgICBiZXR3ZWVuIGNvbW1hbmRzLgotICAgICAqLwotICAgIHB1YmxpYyBXU0RMMkphdmFDbGllbnREZWZhdWx0aW5nQ29tbWFuZChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGlucHV0VVJMKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotICAgICAgICB0aGlzLmlucHV0VVJMID0gaW5wdXRVUkw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgV1NETDJKYXZhUGVyc2lzdGVudENvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdTREwySmF2YUNvbnRleHQoKTsKLSAgICAgICAgbW9kZWwuc2V0Q3hmUnVudGltZVZlcnNpb24oY29udGV4dC5nZXRDeGZSdW50aW1lVmVyc2lvbigpKTsKLSAgICAgICAgbW9kZWwuc2V0Q3hmUnVudGltZUVkaXRpb24oY29udGV4dC5nZXRDeGZSdW50aW1lRWRpdGlvbigpKTsKLSAgICAgICAgbW9kZWwuc2V0UHJvamVjdE5hbWUocHJvamVjdE5hbWUpOwotCi0gICAgICAgIG1vZGVsLnNldEluY2x1ZGVkTmFtZXNwYWNlcyhuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSk7Ci0gICAgICAgIG1vZGVsLnNldEV4Y2x1ZGVkTmFtZXNwYWNlcyhuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSk7Ci0KLSAgICAgICAgLy8gWEpDCi0gICAgICAgIG1vZGVsLnNldFhqY1VzZURlZmF1bHRWYWx1ZXMoY29udGV4dC5pc1hqY1VzZURlZmF1bHRWYWx1ZXMoKSk7Ci0gICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nKGNvbnRleHQuaXNYamNUb1N0cmluZygpKTsKLSAgICAgICAgbW9kZWwuc2V0WGpjVG9TdHJpbmdNdWx0aUxpbmUoY29udGV4dC5pc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkpOwotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZ1NpbXBsZShjb250ZXh0LmlzWGpjVG9TdHJpbmdTaW1wbGUoKSk7Ci0gICAgICAgIG1vZGVsLnNldFhqY0xvY2F0b3IoY29udGV4dC5pc1hqY0xvY2F0b3IoKSk7Ci0gICAgICAgIG1vZGVsLnNldFhqY1N5bmNNZXRob2RzKGNvbnRleHQuaXNYamNTeW5jTWV0aG9kcygpKTsKLSAgICAgICAgbW9kZWwuc2V0WGpjTWFya0dlbmVyYXRlZChjb250ZXh0LmlzWGpjTWFya0dlbmVyYXRlZCgpKTsKLQotICAgICAgICBtb2RlbC5zZXRWYWxpZGF0ZShjb250ZXh0LmlzVmFsaWRhdGUoKSk7Ci0gICAgICAgIG1vZGVsLnNldFByb2Nlc3NTT0FQSGVhZGVycyhjb250ZXh0LmlzUHJvY2Vzc1NPQVBIZWFkZXJzKCkpOwotICAgICAgICBtb2RlbC5zZXRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyhjb250ZXh0LmlzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKSk7Ci0gICAgICAgIG1vZGVsLnNldExvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKGNvbnRleHQuaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpKTsKLSAgICAgICAgbW9kZWwuc2V0VXNlRGVmYXVsdFZhbHVlcyhjb250ZXh0LmlzVXNlRGVmYXVsdFZhbHVlcygpKTsKLSAgICAgICAgbW9kZWwuc2V0Tm9BZGRyZXNzQmluZGluZyhjb250ZXh0LmlzTm9BZGRyZXNzQmluZGluZygpKTsKLSAgICAgICAgbW9kZWwuc2V0QXV0b05hbWVSZXNvbHV0aW9uKGNvbnRleHQuaXNBdXRvTmFtZVJlc29sdXRpb24oKSk7Ci0gICAgICAgIAotICAgICAgICBtb2RlbC5zZXRKYXZhU291cmNlRm9sZGVyKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKSk7Ci0KLSAgICAJdHJ5IHsKLSAgICAJCVVSTCB3c2RsVXJsID0gbmV3IFVSTChpbnB1dFVSTCk7Ci0JCQltb2RlbC5zZXRXc2RsVVJMKHdzZGxVcmwpOwotCQkJCi0JCQlEZWZpbml0aW9uIGRlZmluaXRpb24gPSBXU0RMVXRpbHMucmVhZFdTREwobW9kZWwuZ2V0V3NkbFVSTCgpKTsKLSAgICAgICAgCWlmIChkZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgCQlTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBXU0RMVXRpbHMuZ2V0UGFja2FnZU5hbWVGcm9tTmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIAkJbW9kZWwuc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIAkJbW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkucHV0KHRhcmdldE5hbWVzcGFjZSwgcGFja2FnZU5hbWUpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IFdTRExVdGlscy5nZXRXU0RMTG9jYXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKHdzZGxMb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFdzZGxMb2NhdGlvbih3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgCQkKLSAgICAgICAgCQltb2RlbC5zZXRXc2RsRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICAgICAgCX0KLQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpIHsKLQkJICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgCi0JCSAgICAgICAgICAgIG11cmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQlDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELCAKLQkJICAgIAkJaW9lLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQlDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0JCX0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFdTREwySmF2YURhdGFNb2RlbCBnZXRXU0RMMkphdmFEYXRhTW9kZWwoKSB7Ci0gICAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL2xvY2F0b3IvQ1hGV2ViU2VydmljZUxvY2F0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvbG9jYXRvci9DWEZXZWJTZXJ2aWNlTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTUwZGVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvbG9jYXRvci9DWEZXZWJTZXJ2aWNlTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmxvY2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c2ZpbmRlci5BYnN0cmFjdFdlYlNlcnZpY2VMb2NhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIENYRldlYlNlcnZpY2VMb2NhdG9yIGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlTG9jYXRvciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgTGlzdCBnZXRXZWJTZXJ2aWNlQ2xpZW50cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFdlYlNlcnZpY2VDbGllbnRzKG1vbml0b3IpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBMaXN0IGdldFdlYlNlcnZpY2VDbGllbnRzKElQcm9qZWN0W10gcHJvamVjdHMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0V2ViU2VydmljZUNsaWVudHMocHJvamVjdHMsIG1vbml0b3IpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBMaXN0IGdldFdlYlNlcnZpY2VzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICBJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotICAgICAgICByZXR1cm4gZ2V0V2ViU2VydmljZXMocHJvamVjdHMsIG1vbml0b3IpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBMaXN0IGdldFdlYlNlcnZpY2VzKElQcm9qZWN0W10gcHJvamVjdHMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICBMaXN0IHdlYlNlcnZpY2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKElQcm9qZWN0IHByb2plY3QgOiBwcm9qZWN0cykgewotICAgICAgICAgICAgaWYgKEoyRUVVdGlscy5pc1dlYkNvbXBvbmVudChwcm9qZWN0KSkgewotICAgICAgICAgICAgICAgIHdlYlNlcnZpY2VzLmFkZEFsbChnZXRXZWJTZXJ2aWNlc0Zyb21Qcm9qZWN0KHByb2plY3QpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2ViU2VydmljZXM7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBMaXN0IGdldFdlYlNlcnZpY2VzRnJvbVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjFkMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3MjFlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzM1OGM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNGcmkgTm92IDA3IDIzOjU4OjUzIEVTVCAyMDA4Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MyMTU1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjQuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkuQ1hGQ29uc3VtcHRpb25VSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLndzcnQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjIwNCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjAuMzA0LDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53cztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSIwLjMuNCIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjtidW5kbGUtdmVyc2lvbj0iWzEuMC4zMDUsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNC4zIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpO2J1bmRsZS12ZXJzaW9uPSIwLjMuNSIsCi0gamF2YXgud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuNi4yLDEuNy4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNS4wIgotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS43LjAKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQ3JlYXRlZC1CeTogMS41LjBfMTQtYjAzIChTdW4gTWljcm9zeXN0ZW1zIEluYy4pCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxNjliZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5TZXB0ZW1iZXIgMTIsIDIwMDg8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzRiOGViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWRlODhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUNYRiBXZWIgU2VydmljZXMgQ29uc3VtcHRpb24gVUkgKEluY3ViYXRpb24pCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi1KQVhXU19XRUJTRVJWSUNFVFlQRT1QT0pPIFdlYiBTZXJ2aWNlCi0KLUpBWFdTX0NMSUVOVD1KQVgtV1MgU3R1YgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMGQxYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndzSW1wbCI+Ci0gICAgPHdlYlNlcnZpY2VJbXBsCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi53c0ltcGwuamF2YSIKLSAgICAgICAgICAgIGxhYmVsPSIlSkFYV1NfV0VCU0VSVklDRVRZUEUiCi0gICAgICAgICAgICByZXNvdXJjZVR5cGVNZXRhZGF0YT0iRmlsZSBJUmVzb3VyY2UgQ29tcGlsYXRpb25Vbml0IgotICAgICAgICAgICAgZXh0ZW5zaW9uTWV0YWRhdGE9Ii5qYXZhIC5jbGFzcyIKLSAgICAgICAgICAgIG9iamVjdFNlbGVjdGlvbldpZGdldD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5DWEZKQVhXU1NlbGVjdGlvbldpZGdldCIKLSAgICAgICAgICAgIG1lcmdlckNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLkphdmFNZXJnZXIiPgotICAgIDwvd2ViU2VydmljZUltcGw+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPCEtLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53c0NsaWVudEltcGwiPgotICAgICAgPHdlYlNlcnZpY2VDbGllbnRJbXBsCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jbGllbnQudHlwZS5qYXZhIgotICAgICAgICAgICAgbGFiZWw9IiVKQVhXU19DTElFTlQiPgotICAgICAgPC93ZWJTZXJ2aWNlQ2xpZW50SW1wbD4KLSAgIDwvZXh0ZW5zaW9uPi0tPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkub2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ij4KLSAgICAgIDxvYmplY3RTZWxlY3Rpb25XaWRnZXQKLSAgICAgICAgICAgIGNsYXNzPSIgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNYRkpBWFdTU2VsZWN0aW9uTGF1bmNoYWJsZSIKLSAgICAgICAgICAgIGV4dGVybmFsX21vZGlmeT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSIgb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5DWEZKQVhXU1NlbGVjdGlvbldpZGdldCIKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkpBWFdTU2VsZWN0aW9uVHJhbnNmb3JtZXIiPgotICAgICAgPC9vYmplY3RTZWxlY3Rpb25XaWRnZXQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Ij4KLSAgICAgICA8d2lkZ2V0RmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuV1NETDJKYXZhQ2xpZW50Q29uZmlnV2lkZ2V0RmFjdG9yeSIKLSAgICAgICAgICAgICBpZD0iV1NETDJKYXZhQ2xpZW50Q29uZmlnIgotICAgICAgICAgICAgIGluc2VydEJlZm9yZUNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiPgotICAgICAgIDwvd2lkZ2V0RmFjdG9yeT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gIDwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL0NYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL0NYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjg0N2I4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS9DWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkuQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRkpBWFdTU0VMRUNUSU9OTEFVTkNIQUJMRV9TRUxFQ1RJT05fRElBTE9HX01FU1NBR0U7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGSkFYV1NTRUxFQ1RJT05MQVVOQ0hBQkxFX1NFTEVDVElPTl9ESUFMT0dfVElUTEU7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0NMSUVOVF9QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9DTElFTlRfUEFHRV9ERVNDUklQVElPTjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfQ2xJRU5UX0RFRkFVTFRTX1BBR0VfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0NMSUVOVF9ERUZBVUxUU19QQUdFX0RFU0NSSVBUSU9OOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9HUk9VUF9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0FSR19HUk9VUF9MQUJFTDsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICAvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotICAgICAgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5CVU5ETEVfTkFNRSwgQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcygpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MDZiNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL0NYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUNYRkpBWFdTU0VMRUNUSU9OTEFVTkNIQUJMRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFPUJyb3dzZSBXb3Jrc3BhY2UgQ2xhc3NlcyBhbmQgSW50ZXJmYWNlcwotQ1hGSkFYV1NTRUxFQ1RJT05MQVVOQ0hBQkxFX1NFTEVDVElPTl9ESUFMT0dfTUVTU0FHRT1TZWxlY3QgdGhlIEphdmEgQ2xhc3Mgb3IgSW50ZXJmYWNlIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIFdlYiBTZXJ2aWNlCi0KLSNXU0RMMkphdmEgQ2xpZW50IENvbmdpaCBXaWRnZXQgRmFjdG9yeQotV1NETDJKQVZBX0NMSUVOVF9QQUdFX1RJVExFPXswfSB7MX0gV2ViIFNlcnZpY2UgV1NETDJKYXZhIENsaWVudCBDb25maWd1cmF0aW9uCi1XU0RMMkpBVkFfQ0xJRU5UX1BBR0VfREVTQ1JJUFRJT049Q3VzdG9taXNlIHlvdXIgV2ViIFNlcnZpY2UgZ2VuZXJhdGlvbiBieSBzZWxlY3Rpbmcgb3B0aW9ucyBvbiB0aGlzIHBhZ2UKLQotV1NETDJKQVZBX0NsSUVOVF9ERUZBVUxUU19QQUdFX1RJVExFPXswfSB7MX0gV2ViIFNlcnZpY2UgV1NETDJKYXZhIENsaWVudCBDb25maWd1cmF0aW9uCi1XU0RMMkpBVkFfQ0xJRU5UX0RFRkFVTFRTX1BBR0VfREVTQ1JJUFRJT049Q3VzdG9taXNlIHlvdXIgV2ViIFNlcnZpY2UgZ2VuZXJhdGlvbiBieSBzZWxlY3Rpbmcgb3B0aW9ucyBvbiB0aGlzIHBhZ2UKLQotI1dTREwySmF2YSBDbGllbnQgRGVmYXVsdHMgQ29uZmlnIFdpZGdldAotV1NETDJKQVZBX0dST1VQX0xBQkVMPVdTREwySmF2YSBHZW5lcmF0aW9uIE9wdGlvbnMKLVdTREwySkFWQV9YSkNfQVJHX0dST1VQX0xBQkVMPVhKQyBBcmd1bWVudHMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL0NYRkNvbnN1bXB0aW9uVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY5YjVlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotICAgIC8vIFRoZSBwbHVnLWluIElECi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbiBwbHVnaW47Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbigpIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICBwbHVnaW4gPSB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBsdWdpbiA9IG51bGw7Ci0gICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDWEZDb25zdW1wdGlvblVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBwbHVnaW47Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ01lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBDWEZDb25zdW1wdGlvblVJUGx1Z2luLmxvZyhuZXcgU3RhdHVzKHNldmVyaXR5LCBDWEZDb25zdW1wdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotICAgICAgICBDWEZDb25zdW1wdGlvblVJUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4uUExVR0lOX0lELCAKLSAgICAgICAgICAgIGV4Y2VwdGlvbi50b1N0cmluZygpLCBleGNlcHRpb24pKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DWEZKQVhXU1NlbGVjdGlvbkxhdW5jaGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NYRkpBWFdTU2VsZWN0aW9uTGF1bmNoYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTNkMWQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NYRkpBWFdTU2VsZWN0aW9uTGF1bmNoYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5TdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQWJzdHJhY3RPYmplY3RTZWxlY3Rpb25MYXVuY2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkuQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkuQ1hGQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgQ1hGSkFYV1NTZWxlY3Rpb25MYXVuY2hhYmxlIGV4dGVuZHMgQWJzdHJhY3RPYmplY3RTZWxlY3Rpb25MYXVuY2hhYmxlIHsKLSAgICBwcml2YXRlIElTdGF0dXMgdmFsaWRhdGlvblN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgCi0gICAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZlckNvbXBvbmVudE5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lID0gIiI7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uKSB7Ci0gICAgICAgIGlmIChpbml0aWFsU2VsZWN0aW9uICE9IG51bGwgJiYgIWluaXRpYWxTZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgZmlyc3RFbGVtZW50ID0gaW5pdGlhbFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBmaXJzdEVsZW1lbnQudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgbGF1bmNoKFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgc2VsZWN0aW9uRGlhbG9nID0gbmV3IEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKHNoZWxsLAotICAgICAgICAgICAgICAgIG5ldyBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoKSwgbmV3IFN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIHNlbGVjdGlvbkRpYWxvZy5zZXRUaXRsZShDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuQ1hGSkFYV1NTRUxFQ1RJT05MQVVOQ0hBQkxFX1NFTEVDVElPTl9ESUFMT0dfVElUTEUpOwotICAgICAgICBzZWxlY3Rpb25EaWFsb2cKLSAgICAgICAgICAgICAgICAuc2V0TWVzc2FnZShDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuQ1hGSkFYV1NTRUxFQ1RJT05MQVVOQ0hBQkxFX1NFTEVDVElPTl9ESUFMT0dfTUVTU0FHRSk7Ci0gICAgICAgIHNlbGVjdGlvbkRpYWxvZy5zZXRBbGxvd011bHRpcGxlKGZhbHNlKTsKLSAgICAgICAgc2VsZWN0aW9uRGlhbG9nLnNldElucHV0KEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKSk7Ci0gICAgICAgIHNlbGVjdGlvbkRpYWxvZy5hZGRGaWx0ZXIobmV3IEphdmFWaWV3ZXJGaWx0ZXIoKSk7Ci0KLSAgICAgICAgc2VsZWN0aW9uRGlhbG9nLnNldFZhbGlkYXRvcihuZXcgSmF2YVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcigpKTsKLQotICAgICAgICBpbnQgcmV0dXJuQ29kZSA9IHNlbGVjdGlvbkRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIGlmIChyZXR1cm5Db2RlID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBzZWxlY3RlZENvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBzZWxlY3Rpb25EaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSBzZWxlY3RlZENvbXBpbGF0aW9uVW5pdC5maW5kUHJpbWFyeVR5cGUoKTsKLSAgICAgICAgICAgIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElSZXNvdXJjZSB0eXBlUmVzb3VyY2UgPSB0eXBlLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlUmVzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2plY3QgPSB0eXBlUmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotICAgICAgICAgICAgICAgICAgICBJVmlydHVhbENvbXBvbmVudCBjb21wID0gUmVzb3VyY2VVdGlscy5nZXRDb21wb25lbnRPZih0eXBlUmVzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJDb21wb25lbnROYW1lID0gY29tcC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgc2VydmVyQ29tcG9uZW50TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgICAgICBwcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBzZXJ2ZXJDb21wb25lbnROYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBqbWUuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzLmdldFNldmVyaXR5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gSVN0YXR1cy5DQU5DRUw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldE9iamVjdFNlbGVjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnROYW1lKCkgewotICAgICAgICByZXR1cm4gc2VydmVyQ29tcG9uZW50TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLSAgICAgICAgICAgIElTZWxlY3Rpb25TZXJ2aWNlIHNlbGVjdGlvblNlcnZpY2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0gICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvblNlcnZpY2UoKTsKLSAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gc2VsZWN0aW9uU2VydmljZS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIFRyZWVTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBUcmVlU2VsZWN0aW9uIHRyZWVTZWxlY3Rpb24gPSAoVHJlZVNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgICAgICAgICAgIE9iamVjdCBmaXJzdEVsZW1lbnQgPSB0cmVlU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGlmIChmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKElDb21waWxhdGlvblVuaXQpIGZpcnN0RWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9qZWN0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG9iamVjdFNlbGVjdGlvbikgewotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0YXR1czsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE9iamVjdFNlbGVjdGlvbkRpc3BsYXlhYmxlU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlKFN0cmluZyBzdHJpbmdUb1ZhbGlkYXRlKSB7Ci0gICAgICAgIGNsYXNzTmFtZSA9IHN0cmluZ1RvVmFsaWRhdGU7Ci0KLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgdmFsaWRhdGlvblN0YXR1cyA9IEpEVFV0aWxzLnZhbGlkYXRlSmF2YVR5cGVOYW1lKHByb2plY3QuZ2V0TmFtZSgpLCBjbGFzc05hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmFsaWRhdGlvblN0YXR1cyA9IEpEVFV0aWxzLnZhbGlkYXRlSmF2YVR5cGVOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLQotLy8gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0vLyAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotLy8gICAgICAgICAgICBJVHlwZSB0eXBlID0gSkRUVXRpbHMuZ2V0VHlwZShwcm9qZWN0LCBjbGFzc05hbWUpOwotLy8gICAgICAgICAgICBpZiAodHlwZSA9PSBudWxsIHx8ICF0eXBlLmV4aXN0cygpKSB7Ci0vLyAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDb25zdW1wdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwgIiIpOwotLy8gICAgICAgICAgICB9IGVsc2UgewotLy8gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0YXR1cyA9IEpEVFV0aWxzLnZhbGlkYXRlSmF2YVR5cGVOYW1lKHByb2plY3QuZ2V0TmFtZSgpLCBjbGFzc05hbWUpOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RhdHVzLmlzT0soKTsKLS8vICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RhdHVzLmlzT0soKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmF2YVZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0gICAgICAgICAgICAgICAgICAgIElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYWNrYWdlRnJhZ21lbnRSb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gKElQYWNrYWdlRnJhZ21lbnQpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYWNrYWdlRnJhZ21lbnQuaGFzQ2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKElDb21waWxhdGlvblVuaXQpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIElUeXBlIHR5cGUgPSBjb21waWxhdGlvblVuaXQuZmluZFByaW1hcnlUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmlzQ2xhc3MoKSB8fCB0eXBlLmlzSW50ZXJmYWNlKCk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKYXZhU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yIGltcGxlbWVudHMgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciB7Ci0gICAgICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikgewotICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25bMF0gaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4uUExVR0lOX0lELCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDb25zdW1wdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTREwySmF2YUNsaWVudENvbmZpZ1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGQwOWM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTREwySmF2YUNsaWVudENvbmZpZ1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnZpZXdlcnMuUGFja2FnZU5hbWVFZGl0aW5nU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnZpZXdlcnMuUGFja2FnZU5hbWVUYWJsZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuV1NETDJKYXZhV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdTREwySmF2YUNsaWVudENvbmZpZ1dpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciB7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgcHJpdmF0ZSBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsOwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIG5hbWVzcGFjZUNvbXBvc2l0ZTsKLSAgICBwcml2YXRlIGludCBuYW1lc3BhY2VDb21wb3NpdGVIZWlnaHQgPSAtMTsKLQotICAgIHB1YmxpYyBXU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V1NETDJKYXZhRGF0YU1vZGVsKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKSB7Ci0gICAgICAgIHRoaXMuc3RhdHVzTGlzdGVuZXIgPSBzdGF0dXNMaXN0ZW5lcjsKLQotICAgICAgICBmaW5hbCBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBPdXRwdXQgRGlyCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlT3V0cHV0RGlyZWN0b3J5TGFiZWwobWFpbkNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgQ29tYm8gb3V0cHV0RGlyQ29tYm8gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZU91dHB1dERpcmVjdG9yeUNvbWJvKG1haW5Db21wb3NpdGUsIG1vZGVsKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgb3V0cHV0RGlyQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy8gUGFja2FnZSBOYW1lOgotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhY2thZ2VOYW1lTGFiZWwobWFpbkNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgZmluYWwgVGV4dCBwYWNrYWdlTmFtZVRleHQgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhY2thZ2VOYW1lVGV4dChtYWluQ29tcG9zaXRlLCBtb2RlbCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBwYWNrYWdlTmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWVUZXh0LmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBKRFRVdGlscy52YWxpZGF0ZVBhY2thZ2VOYW1lKG1vZGVsLmdldFByb2plY3ROYW1lKCksIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZmluYWwgQnV0dG9uIG5hbWVzcGFjZU1hcHBpbmdCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZU5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uKG1haW5Db21wb3NpdGUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZU1hcHBpbmdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUNvbXBvc2l0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIucGFjaygpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGUgPSBnZXROYW1lc3BhY2VNYXBwaW5nQ29tcG9zaXRlKG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlQ29tcG9zaXRlSGVpZ2h0ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnQgZ3JvdXBTaXplID0gbmFtZXNwYWNlQ29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSGVpZ2h0ID0gZ3JvdXBTaXplLnk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTaGVsbCBzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnQgc2hlbGxTaXplID0gc2hlbGwuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGwuc2V0U2l6ZShzaGVsbFNpemUueCwgc2hlbGxTaXplLnkgKyBuYW1lc3BhY2VDb21wb3NpdGVIZWlnaHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIubGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5wYWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGUuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5sYXlvdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsIHNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQb2ludCBzaGVsbFNpemUgPSBzaGVsbC5nZXRTaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaGVsbC5zZXRTaXplKHNoZWxsU2l6ZS54LCBzaGVsbFNpemUueSAtIG5hbWVzcGFjZUNvbXBvc2l0ZUhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlciA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy8gU2VydmljZSBOYW1lOgotLy8gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlU2VydmljZU5hbWVMYWJlbChtYWluQ29tcG9zaXRlKTsKLS8vCi0vLyAgICAgICAgQ29tYm8gc2VydmljZU5hbWVDb21ibyA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlU2VydmljZU5hbWVDb21ibyhtYWluQ29tcG9zaXRlLCBtb2RlbCk7Ci0vLyAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0vLyAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotLy8gICAgICAgIHNlcnZpY2VOYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgTGFiZWwgYmluZGluZ0ZpbGVzTGFiZWwgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUJpbmRpbmdGaWxlc0xhYmVsKG1haW5Db21wb3NpdGUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDM7Ci0gICAgICAgIGJpbmRpbmdGaWxlc0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIExpc3QgYmluZGluZ0ZpbGVzTGlzdCA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlQmluZGluZ0ZpbGVzTGlzdChtYWluQ29tcG9zaXRlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDM7Ci0gICAgICAgIGJpbmRpbmdGaWxlc0xpc3Quc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgQnV0dG9uIGFkZEJpbmRpbmdGaWxlQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVBZGRCaW5kaW5nRmlsZUJ1dHRvbihtYWluQ29tcG9zaXRlLCBtb2RlbCwKLSAgICAgICAgICAgICAgICBiaW5kaW5nRmlsZXNMaXN0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBhZGRCaW5kaW5nRmlsZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBCdXR0b24gcmVtb3ZlQmluZGluZ0ZpbGVCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uKG1haW5Db21wb3NpdGUsCi0gICAgICAgICAgICAgICAgbW9kZWwsIGJpbmRpbmdGaWxlc0xpc3QpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIHJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUGFkZGluZ0xhYmVsKG1haW5Db21wb3NpdGUpOwotCi0gICAgICAgIC8qCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWE1MQ2F0YWxvZ0xhYmVsKG1haW5Db21wb3NpdGUpOwotCi0gICAgICAgIFRleHQgeG1sQ2F0YWxvZ1RleHQgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhNTENhdGFsb2dUZXh0KG1haW5Db21wb3NpdGUsIG1vZGVsKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHhtbENhdGFsb2dUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWE1MQ2F0YWxvZ0Jyb3dzZUJ1dHRvbihtYWluQ29tcG9zaXRlKTsKLSAgICAgICAgICovCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBUYWJsZSBjcmVhdGVOYW1lc3BhY2VNYXBwaW5nVGFibGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBUYWJsZVZpZXdlciBwYWNrYWdlTmFtZVRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCwgU1dULkNIRUNLIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUgotICAgICAgICAgICAgICAgIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQotICAgICAgICBmaW5hbCBUYWJsZSBwYWNrYWdlTmFtZVRhYmxlID0gcGFja2FnZU5hbWVUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIFRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVdTRExOYW1lc3BhY2VWaWV3ZXJDb2x1bW4ocGFja2FnZU5hbWVUYWJsZVZpZXdlcik7Ci0KLSAgICAgICAgQ29sdW1uV2VpZ2h0RGF0YSBjb2x1bW5XZWlnaHREYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoMTAwLCAxMDAsIHRydWUpOwotICAgICAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbldlaWdodERhdGEpOwotCi0gICAgICAgIFRhYmxlVmlld2VyQ29sdW1uIHBhY2thZ2VOYW1lVmlld2VyQ29sdW1uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWNrYWdlTmFtZUNvbHVtbigKLSAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZVRhYmxlVmlld2VyLCBtb2RlbCk7Ci0KLSAgICAgICAgVGV4dENlbGxFZGl0b3IgdGV4dENlbGxFZGl0b3IgPSBuZXcgVGV4dENlbGxFZGl0b3IocGFja2FnZU5hbWVUYWJsZVZpZXdlci5nZXRUYWJsZSgpKTsKLSAgICAgICAgdGV4dENlbGxFZGl0b3IuYWRkTGlzdGVuZXIoIG5ldyBJQ2VsbEVkaXRvckxpc3RlbmVyKCkgewotCQkKLQkJCXB1YmxpYyB2b2lkIGVkaXRvclZhbHVlQ2hhbmdlZChib29sZWFuIG9sZFZhbGlkU3RhdGUsIGJvb2xlYW4gbmV3VmFsaWRTdGF0ZSkgewotCQkJCXN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwkJCQkKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCBjYW5jZWxFZGl0b3IoKSB7Ci0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgYXBwbHlFZGl0b3JWYWx1ZSgpIHsKLQkJCX0KLQkJfSk7Ci0gICAgICAgIAotICAgICAgICB0ZXh0Q2VsbEVkaXRvci5zZXRWYWxpZGF0b3IobmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCQkKLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChPYmplY3QgcGFja2FnZU5hbWUpIHsKLQkgICAgICAgICAgICBzdGF0dXMgPSBKRFRVdGlscy52YWxpZGF0ZVBhY2thZ2VOYW1lKG1vZGVsLmdldFByb2plY3ROYW1lKCksIHBhY2thZ2VOYW1lLnRvU3RyaW5nKCkpOwotCSAgICAgICAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKSB7Ci0JICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICByZXR1cm4gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCX0KLQkJfSk7Ci0KLSAgICAgICAgcGFja2FnZU5hbWVWaWV3ZXJDb2x1bW4uc2V0RWRpdGluZ1N1cHBvcnQobmV3IFBhY2thZ2VOYW1lRWRpdGluZ1N1cHBvcnQocGFja2FnZU5hbWVUYWJsZVZpZXdlciwKLSAgICAgICAgCQl0ZXh0Q2VsbEVkaXRvciwgbW9kZWwpKTsKLQotICAgICAgICBjb2x1bW5XZWlnaHREYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoMTAwLCAxMDAsIHRydWUpOwotICAgICAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbldlaWdodERhdGEpOwotCi0gICAgICAgIHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBQYWNrYWdlTmFtZVRhYmxlQ29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlVmlld2VyLnNldElucHV0KG1vZGVsLmdldFdzZGxEZWZpbml0aW9uKCkpOwotCi0gICAgICAgIFRhYmxlSXRlbVtdIHRhYmxlSXRlbXMgPSBwYWNrYWdlTmFtZVRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGVJdGVtc1tpXTsKLSAgICAgICAgICAgIGlmIChtb2RlbC5nZXRJbmNsdWRlZE5hbWVzcGFjZXMoKS5jb250YWluc0tleSh0YWJsZUl0ZW0uZ2V0VGV4dCgwKSkpIHsKLSAgICAgICAgICAgICAgICB0YWJsZUl0ZW0uc2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFja2FnZU5hbWVUYWJsZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBnZXROYW1lc3BhY2VNYXBwaW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBUYWJsZSBwYWNrYWdlTmFtZVRhYmxlID0gY3JlYXRlTmFtZXNwYWNlTWFwcGluZ1RhYmxlKG5hbWVzcGFjZUNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSA2OwotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHJldHVybiBuYW1lc3BhY2VDb21wb3NpdGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ2xpZW50Q29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ2xpZW50Q29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzZkMzczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTREwySmF2YUNsaWVudENvbmZpZ1dpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLkNYRkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdTREwySmF2YUNsaWVudENvbmZpZ1dpZGdldEZhY3RvcnkgaW1wbGVtZW50cyBJTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3RvcnkgewotICAgIHByaXZhdGUgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3Igd3NkbDJKYXZhQ2xpZW50V2lkZ2V0Q29udHJpYnV0b3I7Ci0gICAgcHJpdmF0ZSBTaW1wbGVXaWRnZXRDb250cmlidXRvciB3c2RsMkphdmFDbGllbnREZWZhdWx0c1dpZGdldENvbnRyaWJ1dG9yOwotCi0gICAgcHJpdmF0ZSBXU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXQgd3NkbDJKYXZhQ29uZmlnV2lkZ2V0ID0gbmV3IFdTREwySmF2YUNsaWVudENvbmZpZ1dpZGdldCgpOwotICAgIHByaXZhdGUgV1NETDJKYXZhQ2xpZW50RGVmYXVsdHNDb25maWdXaWRnZXQgd3NkbDJKYXZhQ2xpZW50RGVmYXVsdHNDb25maWdXaWRnZXQgPSBuZXcgV1NETDJKYXZhQ2xpZW50RGVmYXVsdHNDb25maWdXaWRnZXQoKTsKLQotICAgIHB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXRGaXJzdE5hbWVkV2lkZ2V0KCkgewotICAgICAgICBpZiAoKHdzZGwySmF2YUNsaWVudFdpZGdldENvbnRyaWJ1dG9yID09IG51bGwKLSAgICAgICAgICAgICAgICB8fCB3c2RsMkphdmFDbGllbnREZWZhdWx0c1dpZGdldENvbnRyaWJ1dG9yID09IG51bGwpKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdzZGwySmF2YUNsaWVudFdpZGdldENvbnRyaWJ1dG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXROZXh0TmFtZWRXaWRnZXQoSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Q29udHJpYnV0b3IpIHsKLSAgICAgICAgaWYgKHdpZGdldENvbnRyaWJ1dG9yID09IHdzZGwySmF2YUNsaWVudFdpZGdldENvbnRyaWJ1dG9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gd3NkbDJKYXZhQ2xpZW50RGVmYXVsdHNXaWRnZXRDb250cmlidXRvcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotICAgICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMMkphdmFDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLSAgICAgICAgICAgICAgICAiV1NETDJKYXZhRGF0YU1vZGVsIiwgV1NETDJKYXZhQ2xpZW50Q29uZmlnV2lkZ2V0RmFjdG9yeS5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMMkphdmFEYXRhTW9kZWwoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHdzZGwySmF2YUNvbmZpZ1dpZGdldC5zZXRXU0RMMkphdmFEYXRhTW9kZWwobW9kZWwpOwotICAgICAgICB3c2RsMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldC5zZXRXU0RMMkphdmFEYXRhTW9kZWwobW9kZWwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICB3c2RsMkphdmFDbGllbnRXaWRnZXRDb250cmlidXRvciA9IG5ldyBTaW1wbGVXaWRnZXRDb250cmlidXRvcigpOwotICAgICAgICBDWEZDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXU0RMMkphdmFDb250ZXh0KCk7Ci0gICAgICAgIFN0cmluZyB3c2RsMkphdmFDbGllbnRQYWdlVGl0bGUgPSBDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICBDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuV1NETDJKQVZBX0NMSUVOVF9QQUdFX1RJVExFLCBuZXcgT2JqZWN0W117Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldEN4ZlJ1bnRpbWVFZGl0aW9uKCksIGNvbnRleHQuZ2V0Q3hmUnVudGltZVZlcnNpb24oKX0pOwotICAgICAgICB3c2RsMkphdmFDbGllbnRXaWRnZXRDb250cmlidXRvci5zZXRUaXRsZSh3c2RsMkphdmFDbGllbnRQYWdlVGl0bGUpOwotICAgICAgICB3c2RsMkphdmFDbGllbnRXaWRnZXRDb250cmlidXRvcgotICAgICAgICAgICAgICAgIC5zZXREZXNjcmlwdGlvbihDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuV1NETDJKQVZBX0NMSUVOVF9QQUdFX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgd3NkbDJKYXZhQ2xpZW50V2lkZ2V0Q29udHJpYnV0b3Iuc2V0RmFjdG9yeShuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgewotICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gd3NkbDJKYXZhQ29uZmlnV2lkZ2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIHdzZGwySmF2YUNsaWVudERlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3IgPSBuZXcgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IoKTsKLSAgICAgICAgU3RyaW5nIHdzZGwySmF2YUNsaWVudERlZmF1bHRzUGFnZVRpdGxlID0gQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgIENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfQ2xJRU5UX0RFRkFVTFRTX1BBR0VfVElUTEUsIG5ldyBPYmplY3RbXSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5nZXRDeGZSdW50aW1lRWRpdGlvbigpLCBjb250ZXh0LmdldEN4ZlJ1bnRpbWVWZXJzaW9uKCl9KTsKLSAgICAgICAgd3NkbDJKYXZhQ2xpZW50RGVmYXVsdHNXaWRnZXRDb250cmlidXRvci5zZXRUaXRsZSh3c2RsMkphdmFDbGllbnREZWZhdWx0c1BhZ2VUaXRsZSk7Ci0gICAgICAgIHdzZGwySmF2YUNsaWVudERlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3IKLSAgICAgICAgICAgICAgICAuc2V0RGVzY3JpcHRpb24oQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLldTREwySkFWQV9DTElFTlRfREVGQVVMVFNfUEFHRV9ERVNDUklQVElPTik7Ci0gICAgICAgIHdzZGwySmF2YUNsaWVudERlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3Iuc2V0RmFjdG9yeShuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgewotICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gd3NkbDJKYXZhQ2xpZW50RGVmYXVsdHNDb25maWdXaWRnZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ2xpZW50RGVmYXVsdHNDb25maWdXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTREwySmF2YUNsaWVudERlZmF1bHRzQ29uZmlnV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YTdkNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ2xpZW50RGVmYXVsdHNDb25maWdXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkuQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzLldTREwySmF2YVdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhQ2xpZW50RGVmYXVsdHNDb25maWdXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgewotICAgIAotICAgIHByaXZhdGUgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsOwotICAgIAotICAgIHB1YmxpYyBXU0RMMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldCgpIHsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0V1NETDJKYXZhRGF0YU1vZGVsKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpIHsKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIG1haW5Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0gICAgICAgIG1haW5Db21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIG1haW5Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgR3JvdXAgd3NkbDJqYXZhR3JvdXAgPSBuZXcgR3JvdXAobWFpbkNvbXBvc2l0ZSwgU1dULlNIQURPV19JTik7Ci0gICAgICAgIHdzZGwyamF2YUdyb3VwLnNldFRleHQoQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLldTREwySkFWQV9HUk9VUF9MQUJFTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgd3NkbDJqYXZhbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHdzZGwyamF2YUdyb3VwLnNldExheW91dCh3c2RsMmphdmFsYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLS8vICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlU2VydmVyQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRGVmYXVsdFZhbHVlc0J1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVOYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgaWYgKENYRk1vZGVsVXRpbHMuaXNBdXRvTmFtZVJlc29sdXRpb25QZXJtaXR0ZWQoKSkgewotICAgICAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVBdXRvTmFtZVJlc29sdXRpb25CdXR0b24od3NkbDJqYXZhR3JvdXAsIG1vZGVsKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKG1vZGVsLmdldEN4ZlJ1bnRpbWVWZXJzaW9uKCkuY29tcGFyZVRvKENYRkNvcmVQbHVnaW4uQ1hGX1ZFUlNJT05fMl8xKSA+PSAwKSB7Ci0gICAgICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZU5vQWRkcmVzc0JpbmRpbmdCdXR0b24od3NkbDJqYXZhR3JvdXAsIG1vZGVsKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgR3JvdXAgeGpjQXJnR3JvdXAgPSBuZXcgR3JvdXAobWFpbkNvbXBvc2l0ZSwgU1dULlNIQURPV19JTik7Ci0gICAgICAgIHhqY0FyZ0dyb3VwLnNldFRleHQoQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfQVJHX0dST1VQX0xBQkVMKTsKLSAgICAgICAgR3JpZExheW91dCB4amNBcmdMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgeGpjQXJnR3JvdXAuc2V0TGF5b3V0KHhqY0FyZ0xheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB4amNBcmdHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBUYWJsZSB4amNBcmdzVGFibGUgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ0FyZ1RhYmxlKHhqY0FyZ0dyb3VwLCBtb2RlbCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgZ3JpZERhdGEudmVydGljYWxTcGFuID0gNjsKLSAgICAgICAgeGpjQXJnc1RhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDRGVmYXVsdFZhbHVlc1RhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ1RhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNMb2NhdG9yVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgbW9kZWwpOwotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1N5bmNNZXRob2RzVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgbW9kZWwpOwotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBtb2RlbCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0pBWFdTU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9KQVhXU1NlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMWJkNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0pBWFdTU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS5DWEZDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSkFYV1NTZWxlY3Rpb25UcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyIHsKLQotICAgIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmFsdWU7Ci0gICAgICAgICAgICBPYmplY3Qgc2VsZWN0aW9uID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJRmlsZSkgewotICAgICAgICAgICAgICAgIElGaWxlIGZpbGUgPSAoSUZpbGUpIHNlbGVjdGlvbjsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbHlRdWFsaWZpZWRKYXZhTmFtZSA9IHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhTmFtZShmaWxlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZnVsbHlRdWFsaWZpZWRKYXZhTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKElDb21waWxhdGlvblVuaXQpIHNlbGVjdGlvbikuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotICAgICAgICAgICAgICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkSmF2YU5hbWUgPSB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkSmF2YU5hbWUoZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmdWxseVF1YWxpZmllZEphdmFOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0cnVjdHVyZWRTZWxlY3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkSmF2YU5hbWUoSUZpbGUgcmVzb3VyY2UpIHsKLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQotICAgICAgICBJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQotICAgICAgICBpZiAocGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGphdmFGaWxlTmFtZSA9IHBhdGgubGFzdFNlZ21lbnQoKTsKLQotICAgICAgICBpZiAocGF0aC5pc0Fic29sdXRlKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSVBhdGggamF2YUZvbGRlclBhdGggPSBwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLSAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KHByb2plY3QpLmZpbmRQYWNrYWdlRnJhZ21lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhRm9sZGVyUGF0aCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpICsgIi4iICsgamF2YUZpbGVOYW1lOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gamF2YUZpbGVOYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93c3J0L0NYRldlYlNlcnZpY2VDbGllbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93c3J0L0NYRldlYlNlcnZpY2VDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQwODZjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd3NydC9DWEZXZWJTZXJ2aWNlQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6IAotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5BYnN0cmFjdFdlYlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlQ2xpZW50SW5mbzsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBDWEZXZWJTZXJ2aWNlQ2xpZW50IGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlQ2xpZW50IHsKLQotICAgIHB1YmxpYyBDWEZXZWJTZXJ2aWNlQ2xpZW50KFdlYlNlcnZpY2VDbGllbnRJbmZvIGluZm8pIHsKLSAgICAgICAgc3VwZXIoaW5mbyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElDb21tYW5kRmFjdG9yeSBhc3NlbWJsZShJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdCwKLSAgICAgICAgICAgIFN0cmluZyBlYXJQcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGVwbG95KElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBwcm9qZWN0LAotICAgICAgICAgICAgU3RyaW5nIGVhclByb2plY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXZlbG9wKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBlYXJQcm9qZWN0KSB7Ci0KLSAgICAgICAgVmVjdG9yIGNvbW1hbmRzID0gbmV3IFZlY3RvcigpOwotCi0gICAgICAgIFdTREwySmF2YURhdGFNb2RlbCB3c2RsMkphdmFNb2RlbCA9IENYRkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdTREwySmF2YURhdGFNb2RlbCgpOwotICAgICAgICBjb21tYW5kcy5hZGQobmV3IFdTREwySmF2YUNsaWVudERlZmF1bHRpbmdDb21tYW5kKHdzZGwySmF2YU1vZGVsLCBwcm9qZWN0TmFtZSwgCi0gICAgICAgIAkJZ2V0V2ViU2VydmljZUNsaWVudEluZm8oKS5nZXRXc2RsVVJMKCkpKTsKLSAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBXU0RMMkphdmFDbGllbnRDb21tYW5kKHdzZGwySmF2YU1vZGVsKSk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeShjb21tYW5kcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElDb21tYW5kRmFjdG9yeSBpbnN0YWxsKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBwcm9qZWN0LAotICAgICAgICAgICAgU3RyaW5nIGVhclByb2plY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElDb21tYW5kRmFjdG9yeSBydW4oSUVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIHByb2plY3QsCi0gICAgICAgICAgICBTdHJpbmcgZWFyUHJvamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyODA4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMDIzMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzRlOGUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI0ZyaSBOb3YgMDcgMjM6NTg6NTQgRVNUIDIwMDgKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxZGQzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC40LjMucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmU7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWksCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aSwKLSAgIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aSxvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUsb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWw7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWksCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLAotICAgb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aSwKLSAgIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUucmVzb3VyY2VzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZSxvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlsczsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aSwKLSAgIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWksCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlIgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2UuamVtO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMi4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnY7YnVuZGxlLXZlcnNpb249IlsxLjAuMzA1LDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIGphdmF4LndzZGw7YnVuZGxlLXZlcnNpb249IlsxLjYuMiwxLjcuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5jb25zb2xlO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTtidW5kbGUtdmVyc2lvbj0iMC41LjAiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlO2J1bmRsZS12ZXJzaW9uPSIwLjUuMCIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMjA0LDEuMS4wKSIKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNy4wCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUNyZWF0ZWQtQnk6IDEuNS4wXzE0LWIwMyAoU3VuIE1pY3Jvc3lzdGVtcyBJbmMuKQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUltcG9ydC1QYWNrYWdlOiBqYXZheC5qd3MsCi0gamF2YXguandzLnNvYXAsCi0gamF2YXgueG1sLndzO3ZlcnNpb249IjIuMS4wIiwKLSBvcmcuamRvbTt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmpkb20uaW5wdXQ7dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5qZG9tLm91dHB1dDt2ZXJzaW9uPSIxLjAuMCIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE2OWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+U2VwdGVtYmVyIDEyLCAyMDA4PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYWJvdXQuaW5pIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2I5M2U2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciBmZWF0dXJlIGRldGFpbHMgaW4gdGhlICJBYm91dCIgCi0jIGRpYWxvZyAodHJhbnNsYXRlZCkuICBNYXhpbXVtIDE1IGxpbmVzIGFuZCA3NSBjaGFyYWN0ZXJzIHBlciBsaW5lLgotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9aWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYWJvdXQubWFwcGluZ3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2Fib3V0LnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODk5MTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUNYRiBXZWIgU2VydmljZXMgKEluY3ViYXRpb24pXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBJT05BIFRlY2hub2xvZ2llcyBQTEMgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2luY3ViYXRvci9cblwKLVxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ3YmEyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBqbWVyZ2VyLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwOWMyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvaWNvbnMvdmlldzE2L2NvbnNvbGVfdmlldy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9pY29ucy92aWV3MTYvY29uc29sZV92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5OGY2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9pY29ucy92aWV3MTYvY29uc29sZV92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2ptZXJnZXIvbWVyZ2UueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvam1lcmdlci9tZXJnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMmRkMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvam1lcmdlci9tZXJnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBNZXJnZSBydWxlcyB1c2VkIGJ5IEpNZXJnZXIgLS0+Ci08bWVyZ2U6b3B0aW9ucyAKLQl4bWxuczptZXJnZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZWNsaXBzZS9lbWYvY29kZWdlbi9qbWVyZ2UvT3B0aW9ucyI+Ci0JCi0JPCEtLSBpZiB0YXJnZXQgaXMgZ2VuZXJhdGVkLCB0cmFuc2ZlciAtLT4KLSAgICA8IS0tIGNoYW5nZSB0byBzb3VyY2VNYXJrdXAgaWYgdGhlIHNvdXJjZSBpcyB0aGUgc3RhbmRhcmQgLS0+Ci0gICAgPG1lcmdlOnB1bGwgCi0gICAgICAgIHNvdXJjZUdldD0iTWV0aG9kL2dldEJvZHkiCi0gICAgICAgIHNvdXJjZVRyYW5zZmVyPSIoXHMqLy9ccypiZWdpbi11c2VyLWNvZGUuKj8vL1xzKmVuZC11c2VyLWNvZGVccyopXG4iCi0gICAgICAgIHRhcmdldFB1dD0iTWV0aG9kL3NldEJvZHkiLz4KLQkKLQk8bWVyZ2U6cHVsbCAKLQkJc291cmNlR2V0PSJNZXRob2QvZ2V0UmV0dXJuVHlwZSIgCi0JCXRhcmdldFB1dD0iTWV0aG9kL3NldFJldHVyblR5cGUiLz4KLQk8bWVyZ2U6cHVsbCAKLQkJc291cmNlR2V0PSJNZXRob2QvZ2V0RXhjZXB0aW9ucyIgCi0JCXRhcmdldFB1dD0iTWV0aG9kL2FkZEV4Y2VwdGlvbiIvPgotCQotICAgIDxtZXJnZTpwdWxsCi0gICAgICBzb3VyY2VHZXQ9Ik1lbWJlci9nZXRDb21tZW50IgotICAgICAgdGFyZ2V0UHV0PSJNZW1iZXIvc2V0Q29tbWVudCIvPgotICAgIDxtZXJnZTpwdWxsCi0gICAgICAgc291cmNlR2V0PSJJbXBvcnQvZ2V0TmFtZSIKLSAgICAgICB0YXJnZXRQdXQ9IkltcG9ydC9zZXROYW1lIi8+Ci0gICAgPG1lcmdlOnB1bGwKLSAgICAgICBzb3VyY2VHZXQ9IkNvbXBpbGF0aW9uVW5pdC9nZXRIZWFkZXIiCi0gICAgICAgdGFyZ2V0UHV0PSJDb21waWxhdGlvblVuaXQvc2V0SGVhZGVyIi8+Ci0KLTwhLS0gTWVyZ2UgcnVsZXMgdG8gaGFuZGxlIGFubm90YXRpb246Ci0JLSBXaXRoIHRoaXMgcHVsbCBydWxlLCBhbm5vdGF0aW9ucyBpbiB0aGUgdGFyZ2V0IGlzIHJlcGxhY2VkIGJ5IGFubm90YXRpb25zIG9mIHRoZSAKLQlzYW1lIG5hbWUgaW4gdGhlIHNvdXJjZS4KLQktIFdpdGggdGhpcyBzd2VlcCBydWxlLCBhbnkgYW5ub3RhdGlvbiBpbiB0aGUgdGFyZ2V0IHRoYXQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgCi0gIAlzb3VyY2UgaXMgY29tbWVudGVkIG91dC4gCi0gIAktIEJ5IGRlZmF1bHQsIGFueSBhbm5vdGF0aW9uIGluIHRoZSBzb3VyY2UgdGhhdCBpcyBub3QgaW4gdGhlIHRhcmdldCBhcmUgcHVsbGVkIGludG8gdGhlIHRhcmdldC4KLS0tPgotCi0JPG1lcmdlOnB1bGwgCi0gICAgCXNvdXJjZUdldD0iQW5ub3RhdGlvbi9nZXRDb250ZW50cyIKLSAgICAJdGFyZ2V0UHV0PSJBbm5vdGF0aW9uL3NldENvbnRlbnRzIi8+Ci0gICAKLSAgCTxtZXJnZTpzd2VlcCBzZWxlY3Q9IkFubm90YXRpb24iIGFjdGlvbj0iY29tbWVudCIvPgotCQkKLTwvbWVyZ2U6b3B0aW9ucz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL21vZGVsL0NYRi5lY29yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL21vZGVsL0NYRi5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzZTMwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9tb2RlbC9DWEYuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ibW9kZWwiCi0gICAgbnNVUkk9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDWEZDb250ZXh0IiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3hmUnVudGltZUxvY2F0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN4ZlJ1bnRpbWVFZGl0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN4ZlJ1bnRpbWVWZXJzaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcmJvc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdlbmVyYXRlQW50QnVpbGRGaWxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2VuZXJhdGVDbGllbnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnZW5lcmF0ZVNlcnZlciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRhdGFiaW5kaW5nIiBlVHlwZT0iIy8vRGF0YUJpbmRpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImpheGIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZnJvbnRlbmQiIGVUeXBlPSIjLy9Gcm9udGVuZCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iamF4d3MiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0IgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+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+Ci0gICAgPGVUeXBlUGFyYW1ldGVycyBuYW1lPSJUMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJJTWV0aG9kIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCIvPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL21vZGVsL0NYRi5lY29yZV9kaWFncmFtIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvbW9kZWwvQ1hGLmVjb3JlX2RpYWdyYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMzIzZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvbW9kZWwvQ1hGLmVjb3JlX2RpYWdyYW0KKysrIC9kZXYvbnVsbApAQCAtMSwzNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxub3RhdGlvbjpEaWFncmFtIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIHhtbG5zOm5vdGF0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi9ydW50aW1lLzEuMC4xL25vdGF0aW9uIiB4bWk6aWQ9Il95clVOMGV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSJFY29yZSIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+Ci0gIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekp0YUFPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMjAwMSI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMQU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI1MDAxIi8+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMQWV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAxIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfelM4MWtPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2N4ZlJ1bnRpbWVMb2NhdGlvbiIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3pTODFrZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pTODFrdXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9jeGZSdW50aW1lRWRpdGlvbiIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3pTODFrLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pTODFsT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9jeGZSdW50aW1lVmVyc2lvbiIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3pTODFsZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pTODFsdXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC92ZXJib3NlIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfelM4MWwtdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfelM4MW1PdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2dlbmVyYXRlQW50QnVpbGRGaWxlIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfelM4MW1ldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfelM4MW11dWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2dlbmVyYXRlQ2xpZW50Ii8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfelM4MW0tdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfelM4MW5PdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2dlbmVyYXRlU2VydmVyIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfelM4MW5ldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfelM4MW51dWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2RhdGFiaW5kaW5nIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfelM4MW4tdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfelM4MW9PdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2Zyb250ZW5kIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfelM4MW9ldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfelM4MW91dWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9DWEZDb250ZXh0L3VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3pTODFvLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iXy1JaHdvT3VuRWQycGZJbVQxalQ3dlEiIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9leHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8tSWh3b2V1bkVkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pKM0xBdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfekozTEEtdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pKM0xCT3VrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTEJldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMiI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfekozTEJ1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMQi11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfekozTENPdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMQ2V1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAzIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96SjNMQ3V1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pKM0xDLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMRE91a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il96SnRhQWV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVDbGFzcyIgaHJlZj0iQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dCIvPgotICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3pKdGFBdXVrRWQycGZJbVQxalQ3dlEiIHg9IjQ2NSIgeT0iMTUiLz4KLSAgPC9jaGlsZHJlbj4KLSAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMRGV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIyMDAxIj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xFT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjUwMDEiLz4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xFZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDEiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pKM0xFdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfekozTEUtdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pKM0xGT3VrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTEZldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMiI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfekozTEZ1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMRi11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfekozTEdPdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMR2V1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAzIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96SjNMR3V1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pKM0xHLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMSE91a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il96SjNMRHV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVDbGFzcyIgaHJlZj0iQ1hGLmVjb3JlIy8vQ1hGRGF0YU1vZGVsIi8+Ci0gICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfekozTEQtdWtFZDJwZkltVDFqVDd2USIgeD0iNDY1IiB5PSIyOTAiLz4KLSAgPC9jaGlsZHJlbj4KLSAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMSGV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIyMDAxIj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xJT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjUwMDEiLz4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xJZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDEiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pKM0xJdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfekozTEktdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pKM0xKT3VrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTEpldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMiI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfekozTEp1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMSi11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfekozTEtPdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMS2V1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAzIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96SjNMS3V1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pKM0xLLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMTE91a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il96SjNMSHV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVDbGFzcyIgaHJlZj0iQ1hGLmVjb3JlIy8vSmF2YTJXU0NvbnRleHQiLz4KLSAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il96SjNMSC11a0VkMnBmSW1UMWpUN3ZRIiB4PSIxODUiIHk9IjI5MCIvPgotICA8L2NoaWxkcmVuPgotICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xMZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjIwMDEiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTE1PdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNTAwMSIvPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTE1ldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMSI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfekozTE11dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMTS11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfekozTE5PdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMTmV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAyIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96SjNMTnV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pKM0xOLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMT091a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVU4T3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDMiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pLQVU4ZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfektBVTh1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pLQVU4LXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX3pKM0xMdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiBocmVmPSJDWEYuZWNvcmUjLy9KYXZhMldTRGF0YU1vZGVsIi8+Ci0gICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfekozTEwtdWtFZDJwZkltVDFqVDd2USIgeD0iMjMwIiB5PSI2MjAiLz4KLSAgPC9jaGlsZHJlbj4KLSAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FVOU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIyMDAxIj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVU5LXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjUwMDEiLz4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVUtT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDEiPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9jd2V6SUI5MkVkNkk1c3dscnNuMzdnIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQvZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbiIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3ZXpJUjkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3ZXpJaDkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC9wcm9jZXNzU09BUEhlYWRlcnMiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9jd2ZhTUI5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9jd2ZhTVI5MkVkNkk1c3dscnNuMzdnIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQvbG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmciLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9jd2ZhTWg5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9jd2ZhTXg5MkVkNkk1c3dscnNuMzdnIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQvbG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmciLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9jd2ZhTkI5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9jd2ZhTlI5MkVkNkk1c3dscnNuMzdnIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQvdmFsaWRhdGUiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9jd2dCUUI5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9jd2dCUVI5MkVkNkk1c3dscnNuMzdnIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQvd3NkbFZlcnNpb24iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9jd2dCUWg5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9jd2dCUXg5MkVkNkk1c3dscnNuMzdnIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQvdXNlRGVmYXVsdFZhbHVlcyIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3Z0JSQjkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3Z0JSUjkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNBcmdzIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3dnQlJoOTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3dnb1VCOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L25vQWRkcmVzc0JpbmRpbmciLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9jd2dvVVI5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9jd2dvVWg5MkVkNkk1c3dscnNuMzdnIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQveGpjVXNlRGVmYXVsdFZhbHVlcyIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3Z29VeDkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3aFBZQjkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNUb1N0cmluZyIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3aFBZUjkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3aFBZaDkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNUb1N0cmluZ011bHRpTGluZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3aFBZeDkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3aFBaQjkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNUb1N0cmluZ1NpbXBsZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3aFBaUjkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3aDJjQjkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNMb2NhdG9yIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3doMmNSOTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3doMmNoOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY1N5bmNNZXRob2RzIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3doMmN4OTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3doMmRCOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY01hcmtHZW5lcmF0ZWQiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9jd2gyZFI5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9jd2lkZ0I5MkVkNkk1c3dscnNuMzdnIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQveGpjRXBpc29kZUZpbGUiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9jd2lkZ1I5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9qVmgwZ0I5MkVkNkk1c3dscnNuMzdnIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQvYXV0b05hbWVSZXNvbHV0aW9uIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfalZoMGdSOTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96S0FVLWV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pLQVUtdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96S0FVLS11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVVfT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDIiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pLQVVfZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfektBVV91dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pLQVVfLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVkFPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfektBVkFldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWQXV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfektBVkEtdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfektBVTlldWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQ2xhc3MiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQiLz4KLSAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il96S0FVOXV1a0VkMnBmSW1UMWpUN3ZRIiB4PSI3MjUiIHk9IjI5MCIvPgotICA8L2NoaWxkcmVuPgotICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVZCT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjIwMDEiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVkItdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNTAwMSIvPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVkNPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMSI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfektBVkNldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWQ3V1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfektBVkMtdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWRE91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAyIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96S0FWRGV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pLQVZEdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWRC11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVZFT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDMiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pLQVZFZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfektBVkV1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pLQVZFLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX3pLQVZCZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFEYXRhTW9kZWwiLz4KLSAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il96S0FWQnV1a0VkMnBmSW1UMWpUN3ZRIiB4PSI3NTAiIHk9IjY3MCIvPgotICA8L2NoaWxkcmVuPgotICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVZGT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjIwMDUiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVkYtdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNTAwNSIvPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVkdPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAxMSI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfektBVkdldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWR3V1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfektBVkctdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWSE91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDEyIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96S0FWSGV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pLQVZIdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWSC11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il96S0FWRmV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiBocmVmPSJDWEYuZWNvcmUjLy9Gcm9udGVuZCIvPgotICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3pLQVZGdXVrRWQycGZJbVQxalQ3dlEiIHg9IjczNSIgeT0iMTUiIHdpZHRoPSI5MSIvPgotICA8L2NoaWxkcmVuPgotICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVZJT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjIwMDUiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVkktdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNTAwNSIvPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVkpPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAxMSI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfektBVkpldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWSnV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfektBVkotdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWS091a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDEyIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96S0FWS2V1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pLQVZLdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWSy11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il96S0FWSWV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiBocmVmPSJDWEYuZWNvcmUjLy9EYXRhQmluZGluZyIvPgotICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3pLQVZJdXVrRWQycGZJbVQxalQ3dlEiIHg9IjczNSIgeT0iNzUiIHdpZHRoPSI5MSIvPgotICA8L2NoaWxkcmVuPgotICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVZMT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjIwMDQiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVkwtdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNTAwNCIvPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVk1PdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAxMCI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfektBVk1ldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWTXV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfektBVk0tdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfektBVkxldWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9IkNYRi5lY29yZSMvL1VSTCIvPgotICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3pLQVZMdXVrRWQycGZJbVQxalQ3dlEiIHg9IjE4NSIgeT0iMTUiIHdpZHRoPSI3NiIvPgotICA8L2NoaWxkcmVuPgotICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVZOT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjIwMDQiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektLRjhPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNTAwNCIvPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektLRjhldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAxMCI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfektLRjh1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96S0tGOC11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfektLRjlPdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfektBVk5ldWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9IkNYRi5lY29yZSMvL0RlZmluaXRpb24iLz4KLSAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il96S0FWTnV1a0VkMnBmSW1UMWpUN3ZRIiB4PSIxODUiIHk9IjYwIiB3aWR0aD0iNzYiLz4KLSAgPC9jaGlsZHJlbj4KLSAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0tGOWV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIyMDA0Ij4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLS0YtT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjUwMDQiLz4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLS0YtZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMTAiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pLS0YtdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfektLRi0tdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pLS0ZfT3VrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX3pLS0Y5dXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJDWEYuZWNvcmUjLy9NYXAiLz4KLSAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il96S0tGOS11a0VkMnBmSW1UMWpUN3ZRIiB4PSIxODUiIHk9IjExMCIgd2lkdGg9Ijc2Ii8+Ci0gIDwvY2hpbGRyZW4+Ci0gIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektLRl9ldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMjAwNCI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0tHQU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI1MDA0Ii8+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0tHQWV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDEwIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96S0tHQXV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pLS0dBLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96S0tHQk91a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il96S0tGX3V1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iQ1hGLmVjb3JlIy8vSU1ldGhvZCIvPgotICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3pLS0ZfLXVrRWQycGZJbVQxalQ3dlEiIHg9IjE4NSIgeT0iMTU1IiB3aWR0aD0iNzYiLz4KLSAgPC9jaGlsZHJlbj4KLSAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il95clVOMHV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0iQ1hGLmVjb3JlIy8iLz4KLSAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpFZGdlIiB4bWk6aWQ9Il96VWwwVU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI0MDA0IiBzb3VyY2U9Il96SjNMRGV1a0VkMnBmSW1UMWpUN3ZRIiB0YXJnZXQ9Il96SnRhQU91a0VkMnBmSW1UMWpUN3ZRIj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfelVsMFVldWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfelVsMFV1dWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il96VWwwVS11a0VkMnBmSW1UMWpUN3ZRIiBwb2ludHM9Ils0LCAtMSwgMSwgNzNdJFs0LCAtNzMsIDEsIDFdIi8+Ci0gICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3pXWDlDT3VrRWQycGZJbVQxalQ3dlEiIGlkPSIoMC40NiwwLjAwNzQ5MDYzNykiLz4KLSAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfeldYOUNldWtFZDJwZkltVDFqVDd2USIgaWQ9IigwLjUwMjcwMjcsMC45ODUyMjE3KSIvPgotICA8L2VkZ2VzPgotICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkVkZ2UiIHhtaTppZD0iX3pWQ2dRT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjQwMDQiIHNvdXJjZT0iX3pKM0xIZXVrRWQycGZJbVQxalQ3dlEiIHRhcmdldD0iX3pKdGFBT3VrRWQycGZJbVQxalQ3dlEiPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il96VkNnUWV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il96VkNnUXV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3pWQ2dRLXVrRWQycGZJbVQxalQ3dlEiIHBvaW50cz0iWzAsIDEsIC00MSwgMzE4XSRbNDEsIC0zMTcsIDAsIDBdIi8+Ci0gICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3pXWDlBT3VrRWQycGZJbVQxalQ3dlEiIGlkPSIoMC44OTk1ODE2LDAuMDQyNzgwNzUpIi8+Ci0gICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3pXWDlBZXVrRWQycGZJbVQxalQ3dlEiIGlkPSIoMC4xMDgxMDgxMSwwLjk5NTA3MzkpIi8+Ci0gIDwvZWRnZXM+Ci0gIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246RWRnZSIgeG1pOmlkPSJfelZDZ1JPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNDAwNCIgc291cmNlPSJfekozTExldWtFZDJwZkltVDFqVDd2USIgdGFyZ2V0PSJfekozTERldWtFZDJwZkltVDFqVDd2USI+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3pWQ2dSZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX3pWQ2dSdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfelZDZ1ItdWtFZDJwZkltVDFqVDd2USIgcG9pbnRzPSJbMCwgMCwgLTYwLCAtMTIwXSRbNjAsIDEyMCwgMCwgMF0iLz4KLSAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfeldYOUN1dWtFZDJwZkltVDFqVDd2USIgaWQ9IigwLjkwODE2MzI1LDAuMDA1MzQ3NTkzNykiLz4KLSAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfeldYOUMtdWtFZDJwZkltVDFqVDd2USIgaWQ9IigwLjI1NSwwLjk4ODc2NDA1KSIvPgotICA8L2VkZ2VzPgotICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkVkZ2UiIHhtaTppZD0iX3pWQ2dTT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjQwMDQiIHNvdXJjZT0iX3pKM0xMZXVrRWQycGZJbVQxalQ3dlEiIHRhcmdldD0iX3pKM0xIZXVrRWQycGZJbVQxalQ3dlEiPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il96VkNnU2V1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il96VkNnU3V1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3pWQ2dTLXVrRWQycGZJbVQxalQ3dlEiIHBvaW50cz0iWzAsIDAsIC02MCwgNjJdJFs2MCwgLTYxLCAwLCAxXSIvPgotICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il96V1g5RE91a0VkMnBmSW1UMWpUN3ZRIiBpZD0iKDAuMzg3NzU1MSwwLjAwNTM0NzU5MzcpIi8+Ci0gICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3pXWDlEZXVrRWQycGZJbVQxalQ3dlEiIGlkPSIoMC41MTA0NjAyNiwwLjk4OTMwNDg0KSIvPgotICA8L2VkZ2VzPgotICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkVkZ2UiIHhtaTppZD0iX3pWQ2dUT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjQwMDQiIHNvdXJjZT0iX3pLQVU5T3VrRWQycGZJbVQxalQ3dlEiIHRhcmdldD0iX3pKdGFBT3VrRWQycGZJbVQxalQ3dlEiPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il96VkNnVGV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il96VkNnVHV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3pWQ2dULXVrRWQycGZJbVQxalQ3dlEiIHBvaW50cz0iWzAsIDAsIC02MCwgMzAxXSRbNjAsIC0zMDAsIDAsIDFdIi8+Ci0gICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3pXWDlCdXVrRWQycGZJbVQxalQ3dlEiIGlkPSIoMS4wLDAuNDk4NDEyNykiLz4KLSAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfeldYOUItdWtFZDJwZkltVDFqVDd2USIgaWQ9IigwLjg0ODY0ODY3LDAuOTY1NTE3MikiLz4KLSAgPC9lZGdlcz4KLSAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpFZGdlIiB4bWk6aWQ9Il96VkNnVU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI0MDA0IiBzb3VyY2U9Il96S0FWQk91a0VkMnBmSW1UMWpUN3ZRIiB0YXJnZXQ9Il96SjNMRGV1a0VkMnBmSW1UMWpUN3ZRIj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfelZDZ1VldWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfelZDZ1V1dWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il96VkNnVS11a0VkMnBmSW1UMWpUN3ZRIiBwb2ludHM9IlstNTYsIC0zMCwgMzc0LCAyMDJdJFstMjY1LCAtMTQzLCAxNjUsIDg5XSIvPgotICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il96V1g5QXV1a0VkMnBmSW1UMWpUN3ZRIiBpZD0iKDAuMDU1MTcyNDE0LDAuMDA4MTMwMDgxKSIvPgotICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il96V1g5QS11a0VkMnBmSW1UMWpUN3ZRIiBpZD0iKDAuMCwwLjY2NjY2NjcpIi8+Ci0gIDwvZWRnZXM+Ci0gIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246RWRnZSIgeG1pOmlkPSJfelZDZ1ZPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNDAwNCIgc291cmNlPSJfektBVkJPdWtFZDJwZkltVDFqVDd2USIgdGFyZ2V0PSJfektBVTlPdWtFZDJwZkltVDFqVDd2USI+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3pWQ2dWZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX3pWQ2dWdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfelZDZ1YtdWtFZDJwZkltVDFqVDd2USIgcG9pbnRzPSJbMCwgMCwgLTExMSwgMF0kWzExMSwgMCwgMCwgMF0iLz4KLSAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfeldYOUJPdWtFZDJwZkltVDFqVDd2USIgaWQ9IigwLjU4NjIwNjksMC4wKSIvPgotICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il96V1g5QmV1a0VkMnBmSW1UMWpUN3ZRIiBpZD0iKDAuNDAyOTMwNCwwLjk5MzY1MDgpIi8+Ci0gIDwvZWRnZXM+Ci08L25vdGF0aW9uOkRpYWdyYW0+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9tb2RlbC9DWEYuZ2VubW9kZWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9tb2RlbC9DWEYuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZGYzYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvbW9kZWwvQ1hGLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBjb3B5cmlnaHRUZXh0PSJDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDJiN4RDsmI3hBO0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMmI3hEOyYjeEE7YXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wJiN4RDsmI3hBO3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0JiN4RDsmI3hBO2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJiN4RDsmI3hBOyAmI3hEOyYjeEE7Q29udHJpYnV0b3JzOiYjeEQ7JiN4QTtJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iCi0gICAgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjIiBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUiCi0gICAgbW9kZWxOYW1lPSJDWEYiIHJvb3RFeHRlbmRzSW50ZXJmYWNlPSIiIHJvb3RJbXBsZW1lbnRzSW50ZXJmYWNlPSIiIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLmVtZi5pbXBvcnRlci5lY29yZSIKLSAgICBjb21wbGlhbmNlTGV2ZWw9IjUuMCIgY29weXJpZ2h0RmllbGRzPSJmYWxzZSIgbGFuZ3VhZ2U9IiI+Ci0gIDxmb3JlaWduTW9kZWw+Q1hGLmVjb3JlPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkNYRiIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGVjb3JlUGFja2FnZT0iQ1hGLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJDWEYuZWNvcmUjLy9Gcm9udGVuZCI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IkNYRi5lY29yZSMvL0Zyb250ZW5kL0pBWFdTIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iQ1hGLmVjb3JlIy8vRGF0YUJpbmRpbmciPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJDWEYuZWNvcmUjLy9EYXRhQmluZGluZy9KQVhCIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IkNYRi5lY29yZSMvL1VSTCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iQ1hGLmVjb3JlIy8vRGVmaW5pdGlvbiIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iQ1hGLmVjb3JlIy8vTWFwIj4KLSAgICAgIDxnZW5UeXBlUGFyYW1ldGVycyBlY29yZVR5cGVQYXJhbWV0ZXI9IkNYRi5lY29yZSMvL01hcC9UIi8+Ci0gICAgICA8Z2VuVHlwZVBhcmFtZXRlcnMgZWNvcmVUeXBlUGFyYW1ldGVyPSJDWEYuZWNvcmUjLy9NYXAvVDEiLz4KLSAgICA8L2dlbkRhdGFUeXBlcz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IkNYRi5lY29yZSMvL0lNZXRob2QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9IkNYRi5lY29yZSMvL0NYRkNvbnRleHQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkNvbnRleHQvY3hmUnVudGltZUxvY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9jeGZSdW50aW1lRWRpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkNvbnRleHQvY3hmUnVudGltZVZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZDb250ZXh0L3ZlcmJvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2dlbmVyYXRlQW50QnVpbGRGaWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9nZW5lcmF0ZUNsaWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkNvbnRleHQvZ2VuZXJhdGVTZXJ2ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2RhdGFiaW5kaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9mcm9udGVuZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkNvbnRleHQvdXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9leHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkRhdGFNb2RlbC9wcm9qZWN0TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkRhdGFNb2RlbC9yZXNvdXJjZURpcmVjdG9yeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkRhdGFNb2RlbC9jbGFzc0RpcmVjdG9yeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkRhdGFNb2RlbC93c2RsRmlsZU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvd3NkbFVSTCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkRhdGFNb2RlbC9jb25maWdXc2RsTG9jYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvZnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGRGF0YU1vZGVsL2Z1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvY29uZmlnSWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGRGF0YU1vZGVsL2VuZHBvaW50TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkRhdGFNb2RlbC9zZXJ2aWNlTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkRhdGFNb2RlbC93c2RsRGVmaW5pdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkRhdGFNb2RlbC93c2RsTG9jYXRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJDWEYuZWNvcmUjLy9KYXZhMldTQ29udGV4dCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0NvbnRleHQvc29hcDEyQmluZGluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NDb250ZXh0L2dlbmVyYXRlWFNESW1wb3J0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NDb250ZXh0L2dlbmVyYXRlV1NETCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NDb250ZXh0L2dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTQ29udGV4dC9hbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTQ29udGV4dC9nZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTQ29udGV4dC9nZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NDb250ZXh0L2dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0NvbnRleHQvZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IkNYRi5lY29yZSMvL0phdmEyV1NEYXRhTW9kZWwiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NEYXRhTW9kZWwvY2xhc3NwYXRoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0RhdGFNb2RlbC9qYXZhU3RhcnRpbmdQb2ludCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NEYXRhTW9kZWwvdXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0RhdGFNb2RlbC9leHRyYWN0SW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0RhdGFNb2RlbC9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0RhdGFNb2RlbC9tZXRob2RNYXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTRGF0YU1vZGVsL2Fubm90YXRpb25NYXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTRGF0YU1vZGVsL3NvdXJjZURpcmVjdG9yeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NEYXRhTW9kZWwvcG9ydE5hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L2dlbmVyYXRlSW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3Byb2Nlc3NTT0FQSGVhZGVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQvbG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L2xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC92YWxpZGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQvd3NkbFZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3VzZURlZmF1bHRWYWx1ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY0FyZ3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L25vQWRkcmVzc0JpbmRpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY1VzZURlZmF1bHRWYWx1ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY1RvU3RyaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNUb1N0cmluZ011bHRpTGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQveGpjVG9TdHJpbmdTaW1wbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY0xvY2F0b3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY1N5bmNNZXRob2RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNNYXJrR2VuZXJhdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNFcGlzb2RlRmlsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQvYXV0b05hbWVSZXNvbHV0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IkNYRi5lY29yZSMvL1dTREwySmF2YURhdGFNb2RlbCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhRGF0YU1vZGVsL2luY2x1ZGVkTmFtZXNwYWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YURhdGFNb2RlbC9iaW5kaW5nRmlsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFEYXRhTW9kZWwvZXhjbHVkZWROYW1lc3BhY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhRGF0YU1vZGVsL2NhdGFsb2dGaWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhRGF0YU1vZGVsL2phdmFTb3VyY2VGb2xkZXIiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUyNDNlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUNYRiBXZWIgU2VydmljZXMgQ29yZSAoSW5jdWJhdGlvbikKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLUNYRl9GQUNFVF9DT1JFX0xBQkVMPUNYRiAyLnggV2ViIFNlcnZpY2VzCi1DWEZfRkFDRVRfQ09SRV9ESVNDUklQVElPTj1FbmFibGVzIFdlYiBTZXJ2aWNlcyBnZW5lcmF0aW9uIHRocm91Z2ggQ1hGIDIueAotQ1hGX0NPUkVfVEVNUExBVEVfTEFCRUw9Q1hGIFdlYiBTZXJ2aWNlcyBQcm9qZWN0Ci1DWEZfRkFDRVRfSlNUX1dFQjI0X1BSRVNFVF9MQUJFTD1DWEYgV2ViIFNlcnZpY2VzIFByb2plY3QgdjIuNAotQ1hGX0ZBQ0VUX0pTVF9XRUIyNV9QUkVTRVRfTEFCRUw9Q1hGIFdlYiBTZXJ2aWNlcyBQcm9qZWN0IHYyLjUKLUNYRl9GQUNFVF9KU1RfV0VCMjRfUFJFU0VUX0RFU0NSSVBUSU9OPUNvbmZpZ3VyZXMgYSBEeW5hbWljIFdlYiBQcm9qZWN0IHdpdGggQ1hGIHVzaW5nIFdlYiBNb2R1bGUgdjIuNCBhbmQgSmF2YSB2NS4wCi1DWEZfRkFDRVRfSlNUX1dFQjI1X1BSRVNFVF9ERVNDUklQVElPTj1Db25maWd1cmVzIGEgRHluYW1pYyBXZWIgUHJvamVjdCB3aXRoIENYRiB1c2luZyBXZWIgTW9kdWxlIHYyLjUgYW5kIEphdmEgdjUuMApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODNkODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLQotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICAgPHBhY2thZ2UgCi0gICAgICAgICAgdXJpID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsLmVjb3JlIiAKLSAgICAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZSIKLSAgICAgICAgICBnZW5Nb2RlbCA9ICJtb2RlbC9DWEYuZ2VubW9kZWwiIC8+IAotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyI+Ci0gICAgICAgPHByb2plY3QtZmFjZXQgaWQ9ImN4Zi5jb3JlIj4KLSAgICAgICAgICA8bGFiZWw+JUNYRl9GQUNFVF9DT1JFX0xBQkVMPC9sYWJlbD4KLQkgICAgICA8ZGVzY3JpcHRpb24+JUNYRl9GQUNFVF9DT1JFX0RJU0NSSVBUSU9OPC9kZXNjcmlwdGlvbj4KLQkgICA8L3Byb2plY3QtZmFjZXQ+Ci0gICAgICAgCi0JICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iY3hmLmNvcmUiIHZlcnNpb249IjEuMCI+Ci0JICAgICAgPGNvbnN0cmFpbnQ+Ci0JCSAgICAgPGFuZD4KLSAgICAgIAkgICAgICAgIDxyZXF1aXJlcyBmYWNldD0ianN0LndlYiIgdmVyc2lvbj0iWzIuNCIvPgotICAgICAgCSAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJqc3QuamF2YSIgdmVyc2lvbj0iWzUuMCIvPgotICAgICAgICAgICAgICAgIDxjb25mbGljdHMgZmFjZXQ9ImF4aXMyLmNvcmUiIHZlcnNpb249IlsxLjAiLz4KLSAgICAgICAgICAgICAgICA8Y29uZmxpY3RzIGZhY2V0PSJheGlzMi5leHQiIHZlcnNpb249IlsxLjAiLz4KLSAgICAgICAgICAgICA8L2FuZD4KLSAgICAgICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgICAgICAgCi0gICAgICAgICAgPGFjdGlvbiBpZD0iY3hmLmNvcmUuaW5zdGFsbCIgdHlwZT0iSU5TVEFMTCI+Ci0gICAgICAJICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuZmFjZXQuQ1hGRmFjZXRJbnN0YWxsRGVsZWdhdGUiLz4KLSAgICAJICA8L2FjdGlvbj4KLSAgICAgICAgICAKLSAgICAgICAgICA8YWN0aW9uIGlkPSJjeGYuY29yZS51bmluc3RhbGwiIHR5cGU9IlVOSU5TVEFMTCI+Ci0gICAgICAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmZhY2V0LkNYRkZhY2V0VW5pbnN0YWxsRGVsZWdhdGUiLz4KLSAgICAgICAgICA8L2FjdGlvbj4KLSAgCSAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgICAgIDx0ZW1wbGF0ZSBpZD0idGVtcGxhdGUuY3hmLmNvcmUiPgotICAgICAgICAgIDxsYWJlbD4lQ1hGX0NPUkVfVEVNUExBVEVfTEFCRUw8L2xhYmVsPgotICAgICAgICAgIDxmaXhlZAotICAgICAgICAgICAgICAgZmFjZXQ9ImN4Zi5jb3JlIj4KLSAgICAgICAgICA8L2ZpeGVkPgotICAgICAgICAgIDxmaXhlZAotICAgICAgICAgICAgICAgZmFjZXQ9ImpzdC53ZWIiPgotICAgICAgICAgIDwvZml4ZWQ+Ci0gICAgICAgICAgPGZpeGVkCi0gICAgICAgICAgICAgICBmYWNldD0ianN0LmphdmEiPgotICAgICAgICAgIDwvZml4ZWQ+Ci0gICAgICAgICAgPHByZXNldAotICAgICAgICAgICAgIGlkPSJjeGYuanN0LndlYjI0LnByZXNldCI+Ci0gICAgICAgICAgPC9wcmVzZXQ+Ci0gICAgICAgPC90ZW1wbGF0ZT4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0gICAgICAgPHN1cHBvcnRlZD4KLSAgICAgICAgICA8cnVudGltZS1jb21wb25lbnQgYW55PSJ0cnVlIi8+Ci0gICAgICAgICAgPGZhY2V0Ci0gICAgICAgICAgICAgaWQ9ImN4Zi5jb3JlIgotICAgICAgICAgICAgIHZlcnNpb249IjEuMCIvPgotICAgICAgIDwvc3VwcG9ydGVkPgotICAgIDwvZXh0ZW5zaW9uPgotCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJlc2V0cyI+Ci0gICAgICAgPHN0YXRpYy1wcmVzZXQgaWQ9ImN4Zi5qc3Qud2ViMjQucHJlc2V0Ij4KLSAgICAgICAgICA8bGFiZWw+JUNYRl9GQUNFVF9KU1RfV0VCMjRfUFJFU0VUX0xBQkVMPC9sYWJlbD4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+JUNYRl9GQUNFVF9KU1RfV0VCMjRfUFJFU0VUX0RFU0NSSVBUSU9OPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICA8ZmFjZXQKLSAgICAgICAgICAgICBpZD0iY3hmLmNvcmUiCi0gICAgICAgICAgICAgdmVyc2lvbj0iMS4wIj4KLSAgICAgICAgICA8L2ZhY2V0PgotICAgICAgICAgIDxmYWNldAotICAgICAgICAgICAgIGlkPSJqc3Qud2ViIgotICAgICAgICAgICAgIHZlcnNpb249IjIuNCI+Ci0gICAgICAgICAgPC9mYWNldD4KLSAgICAgICAgICA8ZmFjZXQKLSAgICAgICAgICAgICBpZD0ianN0LmphdmEiCi0gICAgICAgICAgICAgdmVyc2lvbj0iNS4wIj4KLSAgICAgICAgICA8L2ZhY2V0PgotICAgICAgIDwvc3RhdGljLXByZXNldD4KLSAgICAgICA8c3RhdGljLXByZXNldCBpZD0iY3hmLmpzdC53ZWIyNS5wcmVzZXQiPgotICAgICAgICAgIDxsYWJlbD4lQ1hGX0ZBQ0VUX0pTVF9XRUIyNV9QUkVTRVRfTEFCRUw8L2xhYmVsPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4lQ1hGX0ZBQ0VUX0pTVF9XRUIyNV9QUkVTRVRfREVTQ1JJUFRJT048L2Rlc2NyaXB0aW9uPgotICAgICAgICAgIDxmYWNldAotICAgICAgICAgICAgIGlkPSJjeGYuY29yZSIKLSAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiPgotICAgICAgICAgIDwvZmFjZXQ+Ci0gICAgICAgICAgPGZhY2V0Ci0gICAgICAgICAgICAgaWQ9ImpzdC53ZWIiCi0gICAgICAgICAgICAgdmVyc2lvbj0iMi41Ij4KLSAgICAgICAgICA8L2ZhY2V0PgotICAgICAgICAgIDxmYWNldAotICAgICAgICAgICAgIGlkPSJqc3QuamF2YSIKLSAgICAgICAgICAgICB2ZXJzaW9uPSI1LjAiPgotICAgICAgICAgIDwvZmFjZXQ+Ci0gICAgICAgPC9zdGF0aWMtcHJlc2V0PgotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIj4KLSAgICAgICA8Y2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIgotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUuQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIiPgotICAgICAgIDwvY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXI+Ci0gICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvQ1hGQ2xhc3NwYXRoQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL0NYRkNsYXNzcGF0aENvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmRkYmJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvQ1hGQ2xhc3NwYXRoQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotCi1wdWJsaWMgY2xhc3MgQ1hGQ2xhc3NwYXRoQ29udGFpbmVyIGltcGxlbWVudHMgSUNsYXNzcGF0aENvbnRhaW5lciB7Ci0KLQlwcml2YXRlIElQYXRoIHBhdGg7Ci0JcHJpdmF0ZSBMaXN0PElDbGFzc3BhdGhFbnRyeT4gY2xhc3NwYXRoRW50cmllczsKLQlwcml2YXRlIFN0cmluZyBjeGZMaWJyYXJ5RWRpdGlvbjsKLQlwcml2YXRlIFN0cmluZyBjeGZMaWJyYXJ5VmVyc2lvbjsKLQlwcml2YXRlIFN0cmluZyBjeGZMaWJyYXJ5TG9jYXRpb247Ci0JCi0JcHVibGljIENYRkNsYXNzcGF0aENvbnRhaW5lcihJUGF0aCBwYXRoLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJY2xhc3NwYXRoRW50cmllcyA9ICBuZXcgQXJyYXlMaXN0PElDbGFzc3BhdGhFbnRyeT4oKTsKLQkJY3hmTGlicmFyeUxvY2F0aW9uID0gZ2V0Q3hmUnVudGltZUxvY2F0aW9uKCk7Ci0JCWN4ZkxpYnJhcnlWZXJzaW9uID0gZ2V0Q3hmUnVudGltZVZlcnNpb24oKTsKLQkJY3hmTGlicmFyeUVkaXRpb24gPSBnZXRDeGZSdW50aW1lRWRpdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gZ2V0Q2xhc3NwYXRoRW50cmllcygpIHsKLSAgICAgICAgaWYgKCFjeGZMaWJyYXJ5VmVyc2lvbi5lcXVhbHMoZ2V0Q3hmUnVudGltZVZlcnNpb24oKSkpIHsKLSAgICAgICAgICAgIGNsYXNzcGF0aEVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PElDbGFzc3BhdGhFbnRyeT4oKTsKLSAgICAgICAgICAgIGN4ZkxpYnJhcnlMb2NhdGlvbiA9IGdldEN4ZlJ1bnRpbWVMb2NhdGlvbigpOwotICAgICAgICAgICAgY3hmTGlicmFyeVZlcnNpb24gPSBnZXRDeGZSdW50aW1lVmVyc2lvbigpOwotICAgICAgICAgICAgY3hmTGlicmFyeUVkaXRpb24gPSBnZXRDeGZSdW50aW1lRWRpdGlvbigpOwotICAgICAgICB9Ci0KLQkgICAgaWYgKGNsYXNzcGF0aEVudHJpZXMuc2l6ZSgpID09IDApIHsKLQkgICAgICAgIEZpbGUgY3hmTGliRGlyZWN0b3J5ID0gZ2V0Q1hGTGlicmFyeURpcmVjdG9yeSgpOwotCSAgICAgICAgaWYgKGN4ZkxpYkRpcmVjdG9yeS5leGlzdHMoKSAmJiBjeGZMaWJEaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotCSAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gY3hmTGliRGlyZWN0b3J5Lmxpc3QoKTsKLQkgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGN4ZkxpYkRpcmVjdG9yeS5nZXRQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVzW2ldKTsKLQkgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0JICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZS5pbmRleE9mKCIuIikgIT0gLTEKLQkgICAgICAgICAgICAgICAgICAgICAgICAmJiBmaWxlTmFtZS5zdWJzdHJpbmcoZmlsZU5hbWUubGFzdEluZGV4T2YoIi4iKSwgZmlsZU5hbWUubGVuZ3RoKCkpLmVxdWFscygKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuamFyIikpIHsKLQkgICAgICAgICAgICAgICAgCWNsYXNzcGF0aEVudHJpZXMuYWRkKEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aChmaWxlLmdldEFic29sdXRlUGF0aCgpKSwgbnVsbCwgCi0JICAgICAgICAgICAgICAgIAkgICAgICAgIG5ldyBQYXRoKCIvIikpKTsKLQkgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkJfQotCQlyZXR1cm4gY2xhc3NwYXRoRW50cmllcy50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbY2xhc3NwYXRoRW50cmllcy5zaXplKCldKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkgICAgaWYgKGdldEN4ZlJ1bnRpbWVMb2NhdGlvbigpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgRmlsZSBjeGZMaWJEaXJlY3RvcnkgPSBnZXRDWEZMaWJyYXJ5RGlyZWN0b3J5KCk7Ci0gICAgICAgICAgICByZXR1cm4gY3hmTGliRGlyZWN0b3J5LmV4aXN0cygpICYmIGN4ZkxpYkRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpOwotCSAgICB9Ci0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICBNZXNzYWdlRm9ybWF0LmZvcm1hdChDWEZDb3JlTWVzc2FnZXMuQ1hGX0NPTlRBSU5FUl9MSUJSQVJZLCBjeGZMaWJyYXJ5RWRpdGlvbiwgCi0JCSAgICAgICAgY3hmTGlicmFyeVZlcnNpb24pOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIEtfQVBQTElDQVRJT047Ci0JfQotCi0JcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0JCXJldHVybiBwYXRoOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRDeGZSdW50aW1lTG9jYXRpb24oKSB7Ci0JICAgIHJldHVybiBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpLmdldEN4ZlJ1bnRpbWVMb2NhdGlvbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEN4ZlJ1bnRpbWVWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5nZXRDeGZSdW50aW1lVmVyc2lvbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEN4ZlJ1bnRpbWVFZGl0aW9uKCkgewotICAgICAgICByZXR1cm4gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5nZXRDeGZSdW50aW1lRWRpdGlvbigpOwotICAgIH0KLQotCXByaXZhdGUgRmlsZSBnZXRDWEZMaWJyYXJ5RGlyZWN0b3J5KCkgewotICAgICAgICBJUGF0aCBjeGZMaWJQYXRoID0gbmV3IFBhdGgoY3hmTGlicmFyeUxvY2F0aW9uKTsKLSAgICAgICAgaWYgKCFjeGZMaWJQYXRoLmhhc1RyYWlsaW5nU2VwYXJhdG9yKCkpIHsKLSAgICAgICAgICAgIGN4ZkxpYlBhdGggPSBjeGZMaWJQYXRoLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY3hmTGliUGF0aCA9IGN4ZkxpYlBhdGguYXBwZW5kKCJsaWIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIEZpbGUgY3hmTGliRGlyZWN0b3J5ID0gbmV3IEZpbGUoY3hmTGliUGF0aC50b09TU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gY3hmTGliRGlyZWN0b3J5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvQ1hGQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvQ1hGQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0MjM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL0NYRkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci0KLXB1YmxpYyBjbGFzcyBDWEZDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciBleHRlbmRzIENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIHsKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JICAgIENYRkNsYXNzcGF0aENvbnRhaW5lciBjeGZDbGFzc3BhdGhDb250YWluZXIgPSBuZXcgQ1hGQ2xhc3NwYXRoQ29udGFpbmVyKGNvbnRhaW5lclBhdGgsIGphdmFQcm9qZWN0KTsKLQkgICAgCi0JICAgIGlmIChjeGZDbGFzc3BhdGhDb250YWluZXIuaXNWYWxpZCgpKSB7Ci0JICAgICAgICBKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoY29udGFpbmVyUGF0aCwgbmV3IElKYXZhUHJvamVjdFtdIHtqYXZhUHJvamVjdH0sIAotCQkJCW5ldyBJQ2xhc3NwYXRoQ29udGFpbmVyW10ge2N4ZkNsYXNzcGF0aENvbnRhaW5lcn0sIG51bGwpOwotCSAgICB9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9DWEZDb3JlTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvQ1hGQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NjU5MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9DWEZDb3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBDWEZDb3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IAotICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9GQUNFVF9JTlNUQUxMX0RFTEVHQVRFX1JVTlRJTUVfTE9DQVRJT05fTk9UX1NFVDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9DT05UQUlORVJfTElCUkFSWTsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICAvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotICAgICAgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBDWEZDb3JlTWVzc2FnZXMuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ1hGQ29yZU1lc3NhZ2VzKCkgewotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9DWEZDb3JlTWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvQ1hGQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZGFhNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9DWEZDb3JlTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jSkRUVXRpbHMKLUNYRl9GQUNFVF9JTlNUQUxMX0RFTEVHQVRFX1JVTlRJTUVfTE9DQVRJT05fTk9UX1NFVD1DWEYgUnVudGltZSBsb2NhdGlvbiBub3Qgc2V0LiBQbGVhc2Ugc2V0IGxvY2F0aW9uIGluIFByZWZlcmVuY2VzID4gV2ViIFNlcnZpY2VzID4gQ1hmIDIueCBQcmVmZXJlbmNlcwotQ1hGX0NPTlRBSU5FUl9MSUJSQVJZPXswfSBMaWJyYXJ5IFt7MX1dClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9DWEZDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL0NYRkNvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU2NTEwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL0NYRkNvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5jb250ZXh0LkphdmEyV1NQZXJzaXN0ZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dC5XU0RMMkphdmFQZXJzaXN0ZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1hGQ29yZVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0gICAgLy8gVGhlIHBsdWctaW4gSUQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1hGX1ZFUlNJT05fMl8wID0gIjIuMCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENYRl9WRVJTSU9OXzJfMSA9ICIyLjEiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ1hGQ29yZVBsdWdpbiBwbHVnaW47Ci0KLSAgICBwcml2YXRlIEphdmEyV1NQZXJzaXN0ZW50Q29udGV4dCBqYXZhMldTQ29udGV4dDsKLSAgICBwcml2YXRlIFdTREwySmF2YVBlcnNpc3RlbnRDb250ZXh0IHdzZGwySmF2YUNvbnRleHQ7Ci0KLSAgICBwcml2YXRlIFZlcnNpb24gY3VycmVudFJ1bnRpbWVWZXJzaW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBDWEZDb3JlUGx1Z2luKCkgewotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIHBsdWdpbiA9IHRoaXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcGx1Z2luID0gbnVsbDsKLSAgICAgICAgc3VwZXIuc3RvcChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENYRkNvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLSAgICAgICAgcmV0dXJuIHBsdWdpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0IGdldEphdmEyV1NDb250ZXh0KCkgewotICAgICAgICBpZiAoamF2YTJXU0NvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgamF2YTJXU0NvbnRleHQgPSBuZXcgSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0KCk7Ci0gICAgICAgICAgICBqYXZhMldTQ29udGV4dC5sb2FkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGphdmEyV1NDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBXU0RMMkphdmFQZXJzaXN0ZW50Q29udGV4dCBnZXRXU0RMMkphdmFDb250ZXh0KCkgewotICAgICAgICBpZiAod3NkbDJKYXZhQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3c2RsMkphdmFDb250ZXh0ID0gbmV3IFdTREwySmF2YVBlcnNpc3RlbnRDb250ZXh0KCk7Ci0gICAgICAgICAgICB3c2RsMkphdmFDb250ZXh0LmxvYWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbDJKYXZhQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmVyc2lvbiBnZXRDdXJyZW50UnVudGltZVZlcnNpb24oKSB7Ci0gICAgICAgIGlmIChjdXJyZW50UnVudGltZVZlcnNpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGN4ZlJ1bnRpbWVWZXJzaW9uID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5nZXRDeGZSdW50aW1lVmVyc2lvbigpOwotICAgICAgICAgICAgaWYgKGN4ZlJ1bnRpbWVWZXJzaW9uLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBjeGZSdW50aW1lVmVyc2lvbiA9ICIwLjAuMCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLmN1cnJlbnRSdW50aW1lVmVyc2lvbiA9IG5ldyBWZXJzaW9uKGN4ZlJ1bnRpbWVWZXJzaW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3VycmVudFJ1bnRpbWVWZXJzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRSdW50aW1lVmVyc2lvbihWZXJzaW9uIHZlcnNpb24pIHsKLSAgICAgICAgdGhpcy5jdXJyZW50UnVudGltZVZlcnNpb24gPSB2ZXJzaW9uOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKG5ldyBTdGF0dXMoc2V2ZXJpdHksIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ29yZVBsdWdpbi5QTFVHSU5fSUQsIAotICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi50b1N0cmluZygpLCBleGNlcHRpb24pKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL2NvbnRleHQvQ1hGUGVyc2lzdGVudENvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvY29udGV4dC9DWEZQZXJzaXN0ZW50Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTQ0MDdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvY29udGV4dC9DWEZQZXJzaXN0ZW50Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29udGV4dC5QZXJzaXN0ZW50Q29udGV4dDsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDWEZQZXJzaXN0ZW50Q29udGV4dCBleHRlbmRzIFBlcnNpc3RlbnRDb250ZXh0IGltcGxlbWVudHMgQ1hGQ29udGV4dCB7Ci0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBjeGYgcnVudGltZSBsb2NhdGlvbiBnZW5lcmFsCi0gICAgICogcHJlZmVyZW5jZSBmcm9tIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0NYRl9SVU5USU1FX0xPQ0FUSU9OID0gImN4ZlJ1bnRpbWVMb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFN0aXJuZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgY3hmIHJ1bnRpbWUgZWRpdGlvbiBnZW5lcmFsIHByZWZlcmVuY2UgZnJvbQotICAgICAqIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0NYRl9SVU5USU1FX0VESVRJT04gPSAiY3hmUnVudGltZUVkaXRpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBTdGlybmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIGN4ZiB2ZXJzaW9uIGdlbmVyYWwgcHJlZmVyZW5jZSBmcm9tCi0gICAgICogdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfQ1hGX1JVTlRJTUVfVkVSU0lPTiA9ICJjeGZSdW50aW1lVmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIgPSAiZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfQ1hGX1ZFUkJPU0UgPSAiY3hmVmVyYm9zZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0NYRl9VU0VfU1BSSU5HX0FQUF9DT05URVhUID0gImN4ZlVzZVNwcmluZ0FwcENvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgQ1hGUGVyc2lzdGVudENvbnRleHQoUGx1Z2luIHBsdWdpbikgewotICAgICAgICBzdXBlcihDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbG9hZCgpIHsKLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0NYRl9SVU5USU1FX0xPQ0FUSU9OLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0NYRl9SVU5USU1FX0VESVRJT04sICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfQ1hGX1JVTlRJTUVfVkVSU0lPTiwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0NYRl9WRVJCT1NFLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19WRVJCT1NFKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0NYRl9VU0VfU1BSSU5HX0FQUF9DT05URVhULCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDeGZSdW50aW1lTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfQ1hGX1JVTlRJTUVfTE9DQVRJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEN4ZlJ1bnRpbWVMb2NhdGlvbihTdHJpbmcgcnVudGltZUxvY2F0aW9uKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfQ1hGX1JVTlRJTUVfTE9DQVRJT04sIHJ1bnRpbWVMb2NhdGlvbik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3hmUnVudGltZUVkaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfQ1hGX1JVTlRJTUVfRURJVElPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q3hmUnVudGltZUVkaXRpb24oU3RyaW5nIHJ1bnRpbWVFZGl0aW9uKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfQ1hGX1JVTlRJTUVfRURJVElPTiwgcnVudGltZUVkaXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3hmUnVudGltZVZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfQ1hGX1JVTlRJTUVfVkVSU0lPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q3hmUnVudGltZVZlcnNpb24oU3RyaW5nIHJ1bnRpbWVWZXJzaW9uKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfQ1hGX1JVTlRJTUVfVkVSU0lPTiwgcnVudGltZVZlcnNpb24pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoYm9vbGVhbiBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIsIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWZXJib3NlKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9DWEZfVkVSQk9TRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIHZlcmJvc2UpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9DWEZfVkVSQk9TRSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0NYRl9VU0VfU1BSSU5HX0FQUF9DT05URVhUKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoYm9vbGVhbiB1c2VTcHJpbmdBcHBDb250ZXh0KSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfQ1hGX1VTRV9TUFJJTkdfQVBQX0NPTlRFWFQsIHVzZVNwcmluZ0FwcENvbnRleHQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvY29udGV4dC9KYXZhMldTUGVyc2lzdGVudENvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvY29udGV4dC9KYXZhMldTUGVyc2lzdGVudENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxZTE3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL2NvbnRleHQvSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRGF0YUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkZyb250ZW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKYXZhMldTUGVyc2lzdGVudENvbnRleHQgZXh0ZW5kcyBDWEZQZXJzaXN0ZW50Q29udGV4dCBpbXBsZW1lbnRzIEphdmEyV1NDb250ZXh0IHsKLSAgICAvKioKLSAgICAgKiBTdHJpbmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIGN4ZiBzb2FwIGJpbmRpbmcgZ2VuZXJhbCBwcmVmZXJlbmNlCi0gICAgICogZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9KMldTX1NPQVAxMl9CSU5ESU5HID0gImN4ZkoyV1NTb2FwMTJCaW5kaW5nIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgY3hmIGdlbmVyYXRlIHhzZCBpbXBvcnRzIGdlbmVyYWwKLSAgICAgKiBwcmVmZXJlbmNlIGZyb20gdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9YU0RfSU1QT1JUUyA9ICJjeGZKMldTWFNESW1wb3J0cyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgY3hmIGRlZmF1bHQgZnJvbnRlbmQgZ2VuZXJhbAotICAgICAqIHByZWZlcmVuY2UgZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0oyV1NfREVGQVVMVF9GUk9OVEVORCA9ICJjeGZKMldTRGVmYXVsdEZyb250ZW5kIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBjeGYgZGVmYXVsdCBEYXRhYmluZGluZyBnZW5lcmFsCi0gICAgICogcHJlZmVyZW5jZSBmcm9tIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfSjJXU19ERUZBVUxUX0RBVEFCSU5ESU5HID0gImN4ZkoyV1NEZWZhdWx0RGF0YWJpbmRpbmciOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIGN4ZiBnZW5lcmF0ZSBjbGllbnQgZ2VuZXJhbCBwcmVmZXJlbmNlCi0gICAgICogZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfQ0xJRU5UID0gImN4ZkoyV1NHZW5lcmF0ZUNsaWVudCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgY3hmIGdlbmVyYXRlIHNlcnZlciBnZW5lcmFsIHByZWZlcmVuY2UKLSAgICAgKiBmcm9tIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9TRVJWRVIgPSAiY3hmSjJXU0dlbmVyYXRlU2VydmVyIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBjeGYgZ2VuZXJhdGUgd3JhcHBlciBhbmQgZmF1bHQgYmVhbnMKLSAgICAgKiBnZW5lcmFsIHByZWZlcmVuY2UgZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUyA9ICJjeGZKMldTR2VuZXJhdGVXcmFwcGVyRmF1bHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIGN4ZiBnZW5lcmF0ZSB3c2RsIGdlbmVyYWwgcHJlZmVyZW5jZQotICAgICAqIGZyb20gdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX1dTREwgPSAiY3hmSjJXU0dlbmVyYXRlV1NETCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgY3hmIGdlbmVyYXRlIGFudCBidWlsZCBmaWxlIGdlbmVyYWwKLSAgICAgKiBwcmVmZXJlbmNlIGZyb20gdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFID0gImN4ZkoyV1NHZW5lcmF0ZUFOVEJ1aWxkRmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgQVBUIGFubm90YXRpb24gcHJvY2Vzc2luZyBnZW5lcmFsCi0gICAgICogcHJlZmVyZW5jZSBmcm9tIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfSjJXU19FTkFCTEVfQU5OT1RBVElPTl9QUk9DRVNTSU5HIAotICAgICAgICA9ICJjeGZKMldTRW5hYmxlQW5ub3RhdGlvblByb2Nlc3NpbmciOyAvLyROT04tTkxTLTEkCi0gCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBnZW5lcmF0ZSA8Y29kZT5AV2ViTWV0aG9kPC9jb2RlPiBhbm5vdGF0aW9uIGdlbmVyYWwKLSAgICAgKiBwcmVmZXJlbmNlIGZyb20gdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT04gCi0gICAgICAgID0gImN4ZkoyV1NHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24iOyAvLyROT04tTkxTLTEkCi0gCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBnZW5lcmF0ZSA8Y29kZT5AV2ViUGFyYW08L2NvZGU+IGFubm90YXRpb24gZ2VuZXJhbAotICAgICAqIHByZWZlcmVuY2UgZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OIAotICAgICAgICA9ICJjeGZKMldTR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24iOyAvLyROT04tTkxTLTEkCi0gCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBnZW5lcmF0ZSA8Y29kZT5AUmVxdWVzdFdyYXBwZXI8L2NvZGU+IGFubm90YXRpb24gZ2VuZXJhbAotICAgICAqIHByZWZlcmVuY2UgZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OIAotICAgICAgICA9ICJjeGZKMldTR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIGdlbmVyYXRlIDxjb2RlPkBSZXNwb25zZVdyYXBwZXI8L2NvZGU+IGFubm90YXRpb24gZ2VuZXJhbAotICAgICAqIHByZWZlcmVuY2UgZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTiAKLSAgICAgICAgPSAiY3hmSjJXU0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBKYXZhMldTUGVyc2lzdGVudENvbnRleHQoKSB7Ci0gICAgICAgIHN1cGVyKENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2FkKCkgewotICAgICAgICBzdXBlci5sb2FkKCk7Ci0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9KMldTX1NPQVAxMl9CSU5ESU5HLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX1NPQVAxMl9CSU5ESU5HKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfWFNEX0lNUE9SVFMsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfWFNEX0lNUE9SVFMpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfSjJXU19ERUZBVUxUX0RBVEFCSU5ESU5HLCBEYXRhQmluZGluZy5KQVhCLmdldExpdGVyYWwoKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0oyV1NfREVGQVVMVF9GUk9OVEVORCwgRnJvbnRlbmQuSkFYV1MuZ2V0TGl0ZXJhbCgpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9DTElFTlQsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhULCBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19HRU5FUkFURV9DTElFTlQpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9TRVJWRVIsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhULCBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19HRU5FUkFURV9TRVJWRVIpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlMpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9XU0RMLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dTREwpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfSjJXU19FTkFCTEVfQU5OT1RBVElPTl9QUk9DRVNTSU5HLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEKSk7Ci0KLSAgICAgICAgLy9UT0RPIE1PVkUgVEhFIEZPTExPV0lORyA0Ci0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT04sIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OLCBDWEZNb2RlbFV0aWxzCi0gICAgICAgICAgICAgICAgLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULAotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTikpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT04sIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT04pKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NvYXAxMkJpbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0oyV1NfU09BUDEyX0JJTkRJTkcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNvYXAxMkJpbmRpbmcoYm9vbGVhbiBzb2FwMTJCaW5kaW5nKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfSjJXU19TT0FQMTJfQklORElORywgc29hcDEyQmluZGluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVhTREltcG9ydHMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfWFNEX0lNUE9SVFMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlWFNESW1wb3J0cyhib29sZWFuIGdlbmVyYXRlWFNESW1wb3J0cykgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfWFNEX0lNUE9SVFMsIGdlbmVyYXRlWFNESW1wb3J0cyk7Ci0gICAgfQotCi0gICAgcHVibGljIERhdGFCaW5kaW5nIGdldERhdGFiaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gRGF0YUJpbmRpbmcuZ2V0KGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9KMldTX0RFRkFVTFRfREFUQUJJTkRJTkcpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhYmluZGluZyhEYXRhQmluZGluZyBkYXRhQmluZGluZykgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0oyV1NfREVGQVVMVF9EQVRBQklORElORywgZGF0YUJpbmRpbmcuZ2V0TGl0ZXJhbCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRnJvbnRlbmQgZ2V0RnJvbnRlbmQoKSB7Ci0gICAgICAgIHJldHVybiBGcm9udGVuZC5nZXQoZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX0oyV1NfREVGQVVMVF9GUk9OVEVORCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZyb250ZW5kKEZyb250ZW5kIGRlZmF1bHRGcm9udGVuZCkgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0oyV1NfREVGQVVMVF9GUk9OVEVORCwgZGVmYXVsdEZyb250ZW5kLmdldExpdGVyYWwoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZUNsaWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9DTElFTlQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlQ2xpZW50KGJvb2xlYW4gZ2VuZXJhdGVDbGllbnQpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX0NMSUVOVCwgZ2VuZXJhdGVDbGllbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVTZXJ2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfU0VSVkVSKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVNlcnZlcihib29sZWFuIGdlbmVyYXRlU2VydmVyKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9TRVJWRVIsIGdlbmVyYXRlU2VydmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyhib29sZWFuIGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlMsIGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVXU0RMKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX1dTREwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlV1NETChib29sZWFuIGdlbmVyYXRlV1NETCkgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfV1NETCwgZ2VuZXJhdGVXU0RMKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlQW50QnVpbGRGaWxlKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUFudEJ1aWxkRmlsZShib29sZWFuIGdlbmVyYXRlQW50QnVpbGRGaWxlKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9BTlRfQlVJTERfRklMRSwgZ2VuZXJhdGVBbnRCdWlsZEZpbGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9KMldTX0VOQUJMRV9BTk5PVEFUSU9OX1BST0NFU1NJTkcpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbihib29sZWFuIGdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT04sIGdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKGJvb2xlYW4gZ2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OLCBnZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoYm9vbGVhbiBlbmFibGVBbm5vdGF0aW9uUHJvY2Vzc2luZykgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0oyV1NfRU5BQkxFX0FOTk9UQVRJT05fUFJPQ0VTU0lORywgZW5hYmxlQW5ub3RhdGlvblByb2Nlc3NpbmcpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oYm9vbGVhbiBnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbikgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OLCBnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKGJvb2xlYW4gZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OLCBnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvY29udGV4dC9XU0RMMkphdmFQZXJzaXN0ZW50Q29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9jb250ZXh0L1dTREwySmF2YVBlcnNpc3RlbnRDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MmQzZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9jb250ZXh0L1dTREwySmF2YVBlcnNpc3RlbnRDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRGF0YUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkZyb250ZW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdTREwySmF2YVBlcnNpc3RlbnRDb250ZXh0IGV4dGVuZHMgQ1hGUGVyc2lzdGVudENvbnRleHQgaW1wbGVtZW50cyBXU0RMMkphdmFDb250ZXh0IHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9HRU5FUkFURV9DTElFTlQgPSAiY3hmVzJKR2VuZXJhdGVDbGllbnQiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfU0VSVkVSID0gImN4ZlcySkdlbmVyYXRlU2VydmVyIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfVzJKX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OID0gImN4ZlcySkdlbmVyYXRlSW1wbGVtZW50YXRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUgPSAiY3hmVzJKR2VuZXJhdGVBbnRCdWlsZEZpbGUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9QUk9DRVNTX1NPQVBfSEVBREVSUyA9ICJjeGZXMkpQcm9jZXNzU09BUEhlYWRlcnMiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9XMkpfTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFTkFNRV9NQVBQSU5HIAotICAgICAgICA9ICJjeGZXMkpMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VuYW1lTWFwcGluZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVNQQUNFX01BUFBJTkcgCi0gICAgICAgID0gImN4ZlcySkxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9XMkpfVkFMSURBVEVfV1NETCA9ICJjeGZXMkpWYWxpZGF0ZVdTREwiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9EQVRBQklORElORyA9ICJjeGZXMkpEYXRhYmluZGluZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9GUk9OVEVORCA9ICJjeGZXMkpGcm9udGVuZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9XU0RMX1ZFUlNJT04gPSAiY3hmVzJKV1NETFZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9XMkpfWEpDX0FSR1MgPSAiY3hmVzJKWEpDQXJncyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9OT19BRERSRVNTX0JJTkRJTkcgPSAiY3hmVzJKTm9BZGRyZXNzQmluZGluZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9VU0VfREVGQVVMVF9WQUxVRVMgPSAiY3hmVzJKVXNlRGVmYXVsdFZhbHVlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9BVVRPX05BTUVfUkVTT0xVVElPTiA9ICJjeGZXMkpBdXRvTmFtZVJlc29sdXRpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfVVNFX0RFRkFVTFRfVkFMVUVTID0gInhqY1VzZURlZmF1bHRWYWx1ZXMiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX1RPX1NUUklORyA9ICJ4amNUb1N0cmluZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfVE9fU1RSSU5HX01VTFRJID0gInhqY1RvU3RyaW5nTXVsdGkiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX1RPX1NUUklOR19TSU1QTEUgPSAieGpjVG9TdHJpbmdTaW1wbGUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX0xPQ0FUT1IgPSAieGpjTG9jYXRvciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfU1lOQ19NRVRIT0RTID0gInhqY1N5bmNNZXRob2RzIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19NQVJLX0dFTkVSQVRFRCA9ICJ4amNNYXJrR2VuZXJhdGVkIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19FUElTT0RFX0ZJTEUgPSAieGpjRXBpc29kZUZpbGUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgV1NETDJKYXZhUGVyc2lzdGVudENvbnRleHQoKSB7Ci0gICAgICAgIHN1cGVyKENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2FkKCkgewotICAgICAgICBzdXBlci5sb2FkKCk7Ci0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfQ0xJRU5ULCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fR0VORVJBVEVfQ0xJRU5UKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1cySl9HRU5FUkFURV9TRVJWRVIsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhULCBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19HRU5FUkFURV9TRVJWRVIpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVzJKX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTikpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhULCBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19HRU5FUkFURV9BTlRfQlVJTERfRklMRSkpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9XMkpfWEpDX0FSR1MsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9XMkpfUFJPQ0VTU19TT0FQX0hFQURFUlMsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1BST0NFU1NfU09BUF9IRUFERVJTKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1cySl9MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VOQU1FX01BUFBJTkcsIENYRk1vZGVsVXRpbHMKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1cySl9MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVNQQUNFX01BUFBJTkcsIENYRk1vZGVsVXRpbHMKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkcpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVzJKX1ZBTElEQVRFX1dTREwsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1ZBTElEQVRFKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1cySl9EQVRBQklORElORywgRGF0YUJpbmRpbmcuSkFYQi5nZXRMaXRlcmFsKCkpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9XMkpfRlJPTlRFTkQsIEZyb250ZW5kLkpBWFdTLmdldExpdGVyYWwoKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1cySl9XU0RMX1ZFUlNJT04sIENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfV3NkbFZlcnNpb24oKQotICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0VmFsdWVMaXRlcmFsKCkpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9XMkpfTk9fQUREUkVTU19CSU5ESU5HLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19OT19BRERSRVNTX0JJTkRJTkcpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVzJKX1VTRV9ERUZBVUxUX1ZBTFVFUywgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fVVNFX0RFRkFVTFRfVkFMVUVTKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1cySl9BVVRPX05BTUVfUkVTT0xVVElPTiwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fQVVUT19OQU1FX1JFU09MVVRJT04pKTsKLQotICAgICAgICBzZXREZWZhdWx0KFhKQ19VU0VfREVGQVVMVF9WQUxVRVMsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVMpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFhKQ19UT19TVFJJTkcsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklORykpOwotCi0gICAgICAgIHNldERlZmF1bHQoWEpDX1RPX1NUUklOR19NVUxUSSwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkUpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFhKQ19UT19TVFJJTkdfU0lNUExFLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfU0lNUExFKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChYSkNfTE9DQVRPUiwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfTE9DQVRPUikpOwotCi0gICAgICAgIHNldERlZmF1bHQoWEpDX1NZTkNfTUVUSE9EUywgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfU1lOQ19NRVRIT0RTKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChYSkNfTUFSS19HRU5FUkFURUQsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX01BUktfR0VORVJBVEVEKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChYSkNfRVBJU09ERV9GSUxFLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlQW50QnVpbGRGaWxlKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlQW50QnVpbGRGaWxlKGJvb2xlYW4gZ2VuZXJhdGVBbnRCdWlsZEZpbGUpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUsIGdlbmVyYXRlQW50QnVpbGRGaWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlQ2xpZW50KCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfQ0xJRU5UKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUNsaWVudChib29sZWFuIGdlbmVyYXRlQ2xpZW50KSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVzJKX0dFTkVSQVRFX0NMSUVOVCwgZ2VuZXJhdGVDbGllbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfVzJKX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUltcGxlbWVudGF0aW9uKGJvb2xlYW4gZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbikgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1cySl9HRU5FUkFURV9JTVBMRU1FTlRBVElPTiwgZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVNlcnZlcigpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfVzJKX0dFTkVSQVRFX1NFUlZFUik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVTZXJ2ZXIoYm9vbGVhbiBnZW5lcmF0ZVNlcnZlcikgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1cySl9HRU5FUkFURV9TRVJWRVIsIGdlbmVyYXRlU2VydmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9XMkpfTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFTkFNRV9NQVBQSU5HKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyhib29sZWFuIGxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVzJKX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRU5BTUVfTUFQUElORywKLSAgICAgICAgICAgICAgICBsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfVzJKX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FU1BBQ0VfTUFQUElORyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoYm9vbGVhbiBsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZykgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1cySl9MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVNQQUNFX01BUFBJTkcsIGxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb2Nlc3NTT0FQSGVhZGVycygpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfVzJKX1BST0NFU1NfU09BUF9IRUFERVJTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzU09BUEhlYWRlcnMoYm9vbGVhbiBwcm9jZXNzU29hcEhlYWRlcnMpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9XMkpfUFJPQ0VTU19TT0FQX0hFQURFUlMsIHByb2Nlc3NTb2FwSGVhZGVycyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfVzJKX1ZBTElEQVRFX1dTREwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRlKGJvb2xlYW4gdmFsaWRhdGUpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9XMkpfVkFMSURBVEVfV1NETCwgdmFsaWRhdGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBEYXRhQmluZGluZyBnZXREYXRhYmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIERhdGFCaW5kaW5nLmdldChnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfVzJKX0RBVEFCSU5ESU5HKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGF0YWJpbmRpbmcoRGF0YUJpbmRpbmcgZGF0YUJpbmRpbmcpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9XMkpfREFUQUJJTkRJTkcsIGRhdGFCaW5kaW5nLmdldExpdGVyYWwoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEZyb250ZW5kIGdldEZyb250ZW5kKCkgewotICAgICAgICByZXR1cm4gRnJvbnRlbmQuZ2V0KGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9XMkpfRlJPTlRFTkQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGcm9udGVuZChGcm9udGVuZCBmcm9udGVuZCkgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1cySl9GUk9OVEVORCwgZnJvbnRlbmQuZ2V0TGl0ZXJhbCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdzZGxWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX1cySl9XU0RMX1ZFUlNJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdzZGxWZXJzaW9uKFN0cmluZyB3c2RsVmVyc2lvbikgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1cySl9XU0RMX1ZFUlNJT04sIHdzZGxWZXJzaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFhqY0FyZ3MoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfVzJKX1hKQ19BUkdTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNBcmdzKFN0cmluZyB4amNBcmdzKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVzJKX1hKQ19BUkdTLCB4amNBcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05vQWRkcmVzc0JpbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX1cySl9OT19BRERSRVNTX0JJTkRJTkcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5vQWRkcmVzc0JpbmRpbmcoYm9vbGVhbiBub0FkZHJlc3NCaW5kaW5nKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVzJKX05PX0FERFJFU1NfQklORElORywgbm9BZGRyZXNzQmluZGluZyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzQXV0b05hbWVSZXNvbHV0aW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9XMkpfQVVUT19OQU1FX1JFU09MVVRJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF1dG9OYW1lUmVzb2x1dGlvbihib29sZWFuIGF1dG9OYW1lUmVzb2x1dGlvbikgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1cySl9BVVRPX05BTUVfUkVTT0xVVElPTiwgYXV0b05hbWVSZXNvbHV0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZURlZmF1bHRWYWx1ZXMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX1cySl9VU0VfREVGQVVMVF9WQUxVRVMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVzZURlZmF1bHRWYWx1ZXMoYm9vbGVhbiB1c2VEZWZhdWx0VmFsdWVzKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVzJKX1VTRV9ERUZBVUxUX1ZBTFVFUywgdXNlRGVmYXVsdFZhbHVlcyk7Ci0gICAgfQotCi0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVXNlRGVmYXVsdFZhbHVlcyhib29sZWFuIHVzZVhKQ0RlZmF1bHRWYWx1ZXMpIHsKLSAgICAgICAgc2V0VmFsdWUoWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUywgdXNlWEpDRGVmYXVsdFZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNYamNUb1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFhKQ19UT19TVFJJTkcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY1RvU3RyaW5nKGJvb2xlYW4geGpjVG9TdHJpbmcpIHsKLSAgICAgICAgc2V0VmFsdWUoWEpDX1RPX1NUUklORywgeGpjVG9TdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihYSkNfVE9fU1RSSU5HX01VTFRJKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNUb1N0cmluZ011bHRpTGluZShib29sZWFuIHhqY1RvU3RyaW5nTXVsdGlMaW5lKSB7Ci0gICAgICAgIHNldFZhbHVlKFhKQ19UT19TVFJJTkdfTVVMVEksIHhqY1RvU3RyaW5nTXVsdGlMaW5lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY1RvU3RyaW5nU2ltcGxlKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oWEpDX1RPX1NUUklOR19TSU1QTEUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY1RvU3RyaW5nU2ltcGxlKGJvb2xlYW4geGpjVG9TdHJpbmdTaW1wbGUpIHsKLSAgICAgICAgc2V0VmFsdWUoWEpDX1RPX1NUUklOR19TSU1QTEUsIHhqY1RvU3RyaW5nU2ltcGxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY0xvY2F0b3IoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihYSkNfTE9DQVRPUik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjTG9jYXRvcihib29sZWFuIHhqY0xvY2F0b3IpIHsKLSAgICAgICAgc2V0VmFsdWUoWEpDX0xPQ0FUT1IsIHhqY0xvY2F0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzWGpjU3luY01ldGhvZHMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihYSkNfU1lOQ19NRVRIT0RTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNTeW5jTWV0aG9kcyhib29sZWFuIHhqY1N5bmNNZXRob2RzKSB7Ci0gICAgICAgIHNldFZhbHVlKFhKQ19TWU5DX01FVEhPRFMsIHhqY1N5bmNNZXRob2RzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY01hcmtHZW5lcmF0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihYSkNfTUFSS19HRU5FUkFURUQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY01hcmtHZW5lcmF0ZWQoYm9vbGVhbiB4amNNYXJrR2VuZXJhdGVkKSB7Ci0gICAgICAgIHNldFZhbHVlKFhKQ19NQVJLX0dFTkVSQVRFRCwgeGpjTWFya0dlbmVyYXRlZCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRYamNFcGlzb2RlRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNTdHJpbmcoWEpDX0VQSVNPREVfRklMRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjRXBpc29kZUZpbGUoU3RyaW5nIHhqY0VwaXNvZGVGaWxlKSB7Ci0gICAgICAgIHNldFZhbHVlKFhKQ19FUElTT0RFX0ZJTEUsIHhqY0VwaXNvZGVGaWxlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvQ1hGQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9DWEZDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NGJlMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9DWEZDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsOwotCi0vKioKLSAqIAotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1hGQ29udGV4dCB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBDWEYgSG9tZSBEaXJlY3RvcnkgbG9jYXRpb24uCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldEN4ZlJ1bnRpbWVMb2NhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0Q3hmUnVudGltZUxvY2F0aW9uIDxlbT5DeGYgUnVudGltZSBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgQ1hGIEhvbWUgRGlyZWN0b3J5IGxvY2F0aW9uLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkN4ZiBSdW50aW1lIExvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRDeGZSdW50aW1lTG9jYXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEN4ZlJ1bnRpbWVMb2NhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgQ1hGIFJ1bnRpbWUgRWRpdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q3hmUnVudGltZUVkaXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldEN4ZlJ1bnRpbWVFZGl0aW9uIDxlbT5DeGYgUnVudGltZSBFZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBDWEYgUnVudGltZSBFZGl0aW9uLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkN4ZiBSdW50aW1lIEVkaXRpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldEN4ZlJ1bnRpbWVFZGl0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRDeGZSdW50aW1lRWRpdGlvbihTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgQ1hGIFRvb2wgdmVyc2lvbi4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q3hmUnVudGltZVZlcnNpb24oKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldEN4ZlJ1bnRpbWVWZXJzaW9uIDxlbT5DeGYgUnVudGltZSBWZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBDWEYgVG9vbCB2ZXJzaW9uCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3hmIFJ1bnRpbWUgVmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0Q3hmUnVudGltZVZlcnNpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEN4ZlJ1bnRpbWVWZXJzaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgY29tbWVudHMgYXJlIHNob3duIGR1cmluZyB0aGUgY29kZSBnZW5lcmF0aW9uIHByb2Nlc3MuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1ZlcmJvc2UoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzVmVyYm9zZSA8ZW0+VmVyYm9zZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogRGlzcGxheXMgY29tbWVudHMgZHVyaW5nIHRoZSBjb2RlIGdlbmVyYXRpb24gcHJvY2Vzcy4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJib3NlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc1ZlcmJvc2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdG8gZ2VuZXJhdGUgYW4gQW50IGJ1aWxkLnhtbCBmaWxlLgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzR2VuZXJhdGVBbnRCdWlsZEZpbGUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzR2VuZXJhdGVBbnRCdWlsZEZpbGUgPGVtPkdlbmVyYXRlIEFudCBCdWlsZCBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXQgdG8gZ2VuZXJhdGUgYW4gQW50IGJ1aWxkLnhtbCBmaWxlLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIEFudCBCdWlsZCBGaWxlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlQW50QnVpbGRGaWxlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRHZW5lcmF0ZUFudEJ1aWxkRmlsZShib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0byBnZW5lcmF0ZSBhIGNsaWVudC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0dlbmVyYXRlQ2xpZW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc0dlbmVyYXRlQ2xpZW50IDxlbT5HZW5lcmF0ZSBDbGllbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNwZWNpZnkgdG8gZ2VuZXJhdGUgY2xpZW50IHNpZGUgY29kZS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZSBDbGllbnQ8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVDbGllbnQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEdlbmVyYXRlQ2xpZW50KGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRvIGdlbmVyYXRlIGEgc2VydmVyLgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzR2VuZXJhdGVTZXJ2ZXIoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzR2VuZXJhdGVTZXJ2ZXIgPGVtPkdlbmVyYXRlIFNlcnZlcjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU3BlY2lmeSB0byBnZW5lcmF0ZSBzZXJ2ZXIgc2lkZSBjb2RlLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIFNlcnZlcjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVNlcnZlcigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0R2VuZXJhdGVTZXJ2ZXIoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkYXRhIGJpbmRpbmcgdXNlZC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0iamF4YiIKLSAgICAgKi8KLSAgICBEYXRhQmluZGluZyBnZXREYXRhYmluZGluZygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0RGF0YWJpbmRpbmcgPGVtPkRhdGFiaW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhYmluZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRGF0YUJpbmRpbmcKLSAgICAgKiBAc2VlICNnZXREYXRhYmluZGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0RGF0YWJpbmRpbmcoRGF0YUJpbmRpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZnJvbnRlbmQgdXNlZC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0iamF4d3MiCi0gICAgICovCi0gICAgRnJvbnRlbmQgZ2V0RnJvbnRlbmQoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldEZyb250ZW5kIDxlbT5Gcm9udGVuZDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RnJvbnRlbmQ8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkZyb250ZW5kCi0gICAgICogQHNlZSAjZ2V0RnJvbnRlbmQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEZyb250ZW5kKEZyb250ZW5kIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0IGlzIHVzZWQgaW5zdGVhZCBvZiBjeGYtc2VydmxldC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCA8ZW0+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBJZiB0cnVlIHRoZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dCBpcyB1c2VkIG90aGVyd2lzZSBjeGYgc2VydmxldC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2UgU3ByaW5nIEFwcGxpY2F0aW9uIENvbnRleHQ8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjc2V0RXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKGJvb2xlYW4pCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZSNnZXRDWEZDb250ZXh0X0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGJvb2xlYW4gaXNFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyIDxlbT5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcihib29sZWFuIHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvQ1hGRGF0YU1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0NYRkRhdGFNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2ExY2VlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvQ1hGRGF0YU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLQotLyoqCi0gKiAKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqLwotcHVibGljIGludGVyZmFjZSBDWEZEYXRhTW9kZWwgZXh0ZW5kcyBDWEZDb250ZXh0IHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvcmlnaW5hdGluZyBwcm9qZWN0IHRoYXQgY29udGFpbnMgdGhlIGphdmEgb3Igd3NkbCByZXNvdXJjZS4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0UHJvamVjdE5hbWUgPGVtPlByb2plY3QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgb3JpZ2luYXRpbmcgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBqYXZhIG9yIHdzZGwgcmVzb3VyY2UuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRQcm9qZWN0TmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0UHJvamVjdE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgb3V0cHV0IGZpbGVzIGFyZSBwbGFjZWQuCi0gICAgICogIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRSZXNvdXJjZURpcmVjdG9yeSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRSZXNvdXJjZURpcmVjdG9yeSA8ZW0+UmVzb3VyY2UgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSByZXNvdXJjZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIG91dHB1dCBmaWxlcyBhcmUgcGxhY2VkLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIERpcmVjdG9yeTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0UmVzb3VyY2VEaXJlY3RvcnkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFJlc291cmNlRGlyZWN0b3J5KFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGdlbmVyYXRlZCBzb3VyY2VzIGFyZSBjb21waWxlZCBpbnRvLgotICAgICAqIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmaWxlcyBhcmUgbm90IGNvbXBpbGVkLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRDbGFzc0RpcmVjdG9yeSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRDbGFzc0RpcmVjdG9yeSA8ZW0+Q2xhc3MgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgZ2VuZXJhdGVkIHNvdXJjZXMgYXJlIGNvbXBpbGVkIGludG8uIElmIG5vdAotICAgICAqIHNwZWNpZmllZCwgdGhlIGZpbGVzIGFyZSBub3QgY29tcGlsZWQuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3MgRGlyZWN0b3J5PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRDbGFzc0RpcmVjdG9yeSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0Q2xhc3NEaXJlY3RvcnkoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIFdTREwgRmlsZSB0aGF0IGlzIHVzZWQgYXMgaW5wdXQgdG8gV1NETDJKYXZhIG9yCi0gICAgICogaXMgdGhlIG91dHB1dCBvZiBKYXZhMldTLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRXc2RsRmlsZU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0V3NkbEZpbGVOYW1lIDxlbT5Xc2RsIEZpbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBGaWxlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFdzZGxGaWxlTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0V3NkbEZpbGVOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBXU0RMIFVSTC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBVUkwgZ2V0V3NkbFVSTCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRXc2RsVVJMIDxlbT5Xc2RsIFVSTDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBVUkw8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFdzZGxVUkwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFdzZGxVUkwoVVJMIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdzZGwgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIFdlYkNvbnRlbnQgZGlyZWN0b3J5LgotICAgICAqIFVzZWQgaW4gdGhlIHNwcmluZyBjb25maWd1cmF0aW9uLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRDb25maWdXc2RsTG9jYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0Q29uZmlnV3NkbExvY2F0aW9uIDxlbT5Db25maWcgV3NkbCBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlnIFdzZGwgTG9jYXRpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldENvbmZpZ1dzZGxMb2NhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0Q29uZmlnV3NkbExvY2F0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBKYXZhIENsYXNzIHRoYXQgbWF5IGJlIHVzZWQgYXMgaW5wdXQgdG8gSmF2YTJXUyBvciBpcyB0aGUgb3V0cHV0Ci0gICAgICogb2YgV1NETDJKYXZhLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lIDxlbT5GdWxseSBRdWFsaWZpZWQgSmF2YSBDbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBKYXZhIENsYXNzIHRoYXQgbWF5IGJlIHVzZWQgYXMgaW5wdXQgdG8gSmF2YTJXUyBvciBpcyB0aGUgb3V0cHV0IG9mIFdTREwySmF2YS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GdWxseSBRdWFsaWZpZWQgSmF2YSBDbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZShTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgSmF2YSBJbnRlcmZhY2UgdGhhdCBtYXkgYmUgdXNlZCBhcyBpbnB1dCB0byBKYXZhMldTLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lIDxlbT5GdWxseSBRdWFsaWZpZWQgSmF2YSBJbnRlcmZhY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgSmF2YSBJbnRlcmZhY2UgdGhhdCBtYXkgYmUgdXNlZCBhcyBpbnB1dCB0byBKYXZhMldTLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZ1bGx5IFF1YWxpZmllZCBKYXZhIEludGVyZmFjZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIGluIHRoZSBDWEYgU3ByaW5nIENvbmZpZ3VyYXRpb24gdG8gdW5pcXVlbHkgaWRlbnRpZnkgZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldENvbmZpZ0lkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldENvbmZpZ0lkIDxlbT5Db25maWcgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbmZpZyBJZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0Q29uZmlnSWQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldENvbmZpZ0lkKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0YXJnZXROYW1lc3BhY2UuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSB0YXJnZXROYW1lc3BhY2UuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVuZG9pbnROYW1lIGF0dHJpYnV0ZSB1c2VkIGluIHRoZSBqYXh3czplbmRwb2ludCBlbGVtZW50IGluIHRoZSBDWEYgU3ByaW5nIENvbmZpZ3VyYXRpb24uCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldEVuZHBvaW50TmFtZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0RW5kcG9pbnROYW1lIDxlbT5FbmRwb2ludCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBlbmRwb2ludE5hbWUgYXR0cmlidXRlIHVzZWQgaW4gdGhlIGpheHdzOmVuZHBvaW50IGVsZW1lbnQgaW4gdGhlIENYRiBTcHJpbmcgQ29uZmlndXJhdGlvbi4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbmRwb2ludCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRFbmRwb2ludE5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEVuZHBvaW50TmFtZShTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2VydmljZU5hbWUgYXR0cmlidXRlIHVzZWQgaW4gdGhlIGpheHdzOmVuZHBvaW50IGVsZW1lbnQgaW4gdGhlIENYRiBTcHJpbmcgQ29uZmlndXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0U2VydmljZU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0U2VydmljZU5hbWUgPGVtPlNlcnZpY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgc2VydmljZU5hbWUgYXR0cmlidXRlIHVzZWQgaW4gdGhlIGpheHdzOmVuZHBvaW50IGVsZW1lbnQgaW4gdGhlIENYRiBTcHJpbmcgQ29uZmlndXJhdGlvbi4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFNlcnZpY2VOYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgRGVmaW5pdGlvbiBnZXRXc2RsRGVmaW5pdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRXc2RsRGVmaW5pdGlvbiA8ZW0+V3NkbCBEZWZpbml0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIERlZmluaXRpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFdzZGxEZWZpbml0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRXc2RsRGVmaW5pdGlvbihEZWZpbml0aW9uIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRXc2RsTG9jYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0V3NkbExvY2F0aW9uIDxlbT5Xc2RsIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIExvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRXc2RsTG9jYXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFdzZGxMb2NhdGlvbihTdHJpbmcgdmFsdWUpOwotICAgICAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0NYRkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvQ1hGRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2UzMDFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvQ1hGRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogJElkOiBDWEZGYWN0b3J5LmphdmEsdiAxLjEgMjAwOC8xMS8xMCAyMDozNzo0MyBkYXZpZF93aWxsaWFtcyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENYRkZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0gICAgLyoqCi0gICAgICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBDWEZGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkZhY3RvcnlJbXBsLmluaXQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SmF2YTIgV1MgRGF0YSBNb2RlbDwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SmF2YTIgV1MgRGF0YSBNb2RlbDwvZW0+Jy4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSmF2YTJXU0RhdGFNb2RlbCBjcmVhdGVKYXZhMldTRGF0YU1vZGVsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldTREwyIEphdmEgRGF0YSBNb2RlbDwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETDIgSmF2YSBEYXRhIE1vZGVsPC9lbT4nLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBXU0RMMkphdmFEYXRhTW9kZWwgY3JlYXRlV1NETDJKYXZhRGF0YU1vZGVsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIENYRlBhY2thZ2UgZ2V0Q1hGUGFja2FnZSgpOwotCi19IC8vQ1hGRmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9DWEZQYWNrYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0NYRlBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUxZDViNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0NYRlBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNTAgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogJElkOiBDWEZQYWNrYWdlLmphdmEsdiAxLjMgMjAwOS8wNC8wNiAyMTozMzoxNCBzY2xhcmtlIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENYRlBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0gICAgLyoqCi0gICAgICogVGhlIHBhY2thZ2UgbmFtZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBTdHJpbmcgZU5BTUUgPSAibW9kZWwiOwotCi0gICAgLyoqCi0gICAgICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC5lY29yZSI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwiOwotCi0gICAgLyoqCi0gICAgICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBDWEZQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsLmluaXQoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQgPGVtPkNvbnRleHQ8L2VtPn0nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0Q1hGQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBDWEZfQ09OVEVYVCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3hmIFJ1bnRpbWUgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfQ09OVEVYVF9fQ1hGX1JVTlRJTUVfTE9DQVRJT04gPSAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN4ZiBSdW50aW1lIEVkaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfQ09OVEVYVF9fQ1hGX1JVTlRJTUVfRURJVElPTiA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3hmIFJ1bnRpbWUgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9DT05URVhUX19DWEZfUlVOVElNRV9WRVJTSU9OID0gMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJib3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0NPTlRFWFRfX1ZFUkJPU0UgPSAzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIEFudCBCdWlsZCBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFID0gNDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBDbGllbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfQ09OVEVYVF9fR0VORVJBVEVfQ0xJRU5UID0gNTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBTZXJ2ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfQ09OVEVYVF9fR0VORVJBVEVfU0VSVkVSID0gNjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhYmluZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9DT05URVhUX19EQVRBQklORElORyA9IDc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJvbnRlbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfQ09OVEVYVF9fRlJPTlRFTkQgPSA4OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9DT05URVhUX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQgPSA5OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9DT05URVhUX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIgPSAxMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db250ZXh0PC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgPSAxMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCA8ZW0+RGF0YSBNb2RlbDwvZW0+fScgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldENYRkRhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTCA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3hmIFJ1bnRpbWUgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fQ1hGX1JVTlRJTUVfTE9DQVRJT04gPSBDWEZfQ09OVEVYVF9fQ1hGX1JVTlRJTUVfTE9DQVRJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3hmIFJ1bnRpbWUgRWRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19DWEZfUlVOVElNRV9FRElUSU9OID0gQ1hGX0NPTlRFWFRfX0NYRl9SVU5USU1FX0VESVRJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3hmIFJ1bnRpbWUgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19DWEZfUlVOVElNRV9WRVJTSU9OID0gQ1hGX0NPTlRFWFRfX0NYRl9SVU5USU1FX1ZFUlNJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyYm9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19WRVJCT1NFID0gQ1hGX0NPTlRFWFRfX1ZFUkJPU0U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQW50IEJ1aWxkIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUgPSBDWEZfQ09OVEVYVF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQ2xpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0NMSUVOVCA9IENYRl9DT05URVhUX19HRU5FUkFURV9DTElFTlQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgU2VydmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1NFUlZFUiA9IENYRl9DT05URVhUX19HRU5FUkFURV9TRVJWRVI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YWJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fREFUQUJJTkRJTkcgPSBDWEZfQ09OVEVYVF9fREFUQUJJTkRJTkc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJvbnRlbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fRlJPTlRFTkQgPSBDWEZfQ09OVEVYVF9fRlJPTlRFTkQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVCA9IENYRl9DT05URVhUX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUiA9IENYRl9DT05URVhUX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX1BST0pFQ1RfTkFNRSA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIERpcmVjdG9yeTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19SRVNPVVJDRV9ESVJFQ1RPUlkgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBEaXJlY3Rvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fQ0xBU1NfRElSRUNUT1JZID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBGaWxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fV1NETF9GSUxFX05BTUUgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIFVSTDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19XU0RMX1VSTCA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBXc2RsIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19XU0RMX0xPQ0FUSU9OID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsbHkgUXVhbGlmaWVkIEphdmEgQ2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsbHkgUXVhbGlmaWVkIEphdmEgSW50ZXJmYWNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUUgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25maWcgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fQ09ORklHX0lEID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19UQVJHRVRfTkFNRVNQQUNFID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5kcG9pbnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19FTkRQT0lOVF9OQU1FID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19TRVJWSUNFX05BTUUgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBEZWZpbml0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX1dTRExfREVGSU5JVElPTiA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX1dTRExfTE9DQVRJT04gPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMTM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGF0YSBNb2RlbDwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDE0OwotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQgPGVtPkphdmEyIFdTIENvbnRleHQ8L2VtPn0nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldEphdmEyV1NDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFQgPSAyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN4ZiBSdW50aW1lIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fQ1hGX1JVTlRJTUVfTE9DQVRJT04gPSBDWEZfQ09OVEVYVF9fQ1hGX1JVTlRJTUVfTE9DQVRJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3hmIFJ1bnRpbWUgRWRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0NYRl9SVU5USU1FX0VESVRJT04gPSBDWEZfQ09OVEVYVF9fQ1hGX1JVTlRJTUVfRURJVElPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DeGYgUnVudGltZSBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fQ1hGX1JVTlRJTUVfVkVSU0lPTiA9IENYRl9DT05URVhUX19DWEZfUlVOVElNRV9WRVJTSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcmJvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19WRVJCT1NFID0gQ1hGX0NPTlRFWFRfX1ZFUkJPU0U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQW50IEJ1aWxkIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9BTlRfQlVJTERfRklMRSA9IENYRl9DT05URVhUX19HRU5FUkFURV9BTlRfQlVJTERfRklMRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBDbGllbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9DTElFTlQgPSBDWEZfQ09OVEVYVF9fR0VORVJBVEVfQ0xJRU5UOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFNlcnZlcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1NFUlZFUiA9IENYRl9DT05URVhUX19HRU5FUkFURV9TRVJWRVI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YWJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19EQVRBQklORElORyA9IENYRl9DT05URVhUX19EQVRBQklORElORzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gcm9udGVuZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0ZST05URU5EID0gQ1hGX0NPTlRFWFRfX0ZST05URU5EOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVCA9IENYRl9DT05URVhUX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSID0gQ1hGX0NPTlRFWFRfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwMTIgQmluZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX1NPQVAxMl9CSU5ESU5HID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgWFNEIEltcG9ydHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9YU0RfSU1QT1JUUyA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFdTREw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XU0RMID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgV3JhcHBlciBGYXVsdCBCZWFuczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlMgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bbm5vdGF0aW9uIFByb2Nlc3NpbmcgRW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgV2ViIE1ldGhvZCBBbm5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgV2ViIFBhcmFtIEFubm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTiA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFJlcXVlc3QgV3JhcHBlciBBbm5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT04gPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBSZXNwb25zZSBXcmFwcGVyIEFubm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT04gPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgODsKLQotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KYXZhMiBXUyBDb250ZXh0PC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCA8ZW0+SmF2YTIgV1MgRGF0YSBNb2RlbDwvZW0+fScgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRKYXZhMldTRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUwgPSAzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN4ZiBSdW50aW1lIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fQ1hGX1JVTlRJTUVfTE9DQVRJT04gPSBDWEZfREFUQV9NT0RFTF9fQ1hGX1JVTlRJTUVfTE9DQVRJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3hmIFJ1bnRpbWUgRWRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0NYRl9SVU5USU1FX0VESVRJT04gPSBDWEZfREFUQV9NT0RFTF9fQ1hGX1JVTlRJTUVfRURJVElPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DeGYgUnVudGltZSBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fQ1hGX1JVTlRJTUVfVkVSU0lPTiA9IENYRl9EQVRBX01PREVMX19DWEZfUlVOVElNRV9WRVJTSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcmJvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19WRVJCT1NFID0gQ1hGX0RBVEFfTU9ERUxfX1ZFUkJPU0U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQW50IEJ1aWxkIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9BTlRfQlVJTERfRklMRSA9IENYRl9EQVRBX01PREVMX19HRU5FUkFURV9BTlRfQlVJTERfRklMRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBDbGllbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9DTElFTlQgPSBDWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfQ0xJRU5UOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFNlcnZlcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1NFUlZFUiA9IENYRl9EQVRBX01PREVMX19HRU5FUkFURV9TRVJWRVI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YWJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19EQVRBQklORElORyA9IENYRl9EQVRBX01PREVMX19EQVRBQklORElORzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gcm9udGVuZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0ZST05URU5EID0gQ1hGX0RBVEFfTU9ERUxfX0ZST05URU5EOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVCA9IENYRl9EQVRBX01PREVMX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSID0gQ1hGX0RBVEFfTU9ERUxfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9qZWN0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19QUk9KRUNUX05BTUUgPSBDWEZfREFUQV9NT0RFTF9fUFJPSkVDVF9OQU1FOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIERpcmVjdG9yeTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX1JFU09VUkNFX0RJUkVDVE9SWSA9IENYRl9EQVRBX01PREVMX19SRVNPVVJDRV9ESVJFQ1RPUlk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fQ0xBU1NfRElSRUNUT1JZID0gQ1hGX0RBVEFfTU9ERUxfX0NMQVNTX0RJUkVDVE9SWTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIEZpbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX1dTRExfRklMRV9OQU1FID0gQ1hGX0RBVEFfTU9ERUxfX1dTRExfRklMRV9OQU1FOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgVVJMPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fV1NETF9VUkwgPSBDWEZfREFUQV9NT0RFTF9fV1NETF9VUkw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIFdzZGwgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19DT05GSUdfV1NETF9MT0NBVElPTiA9IENYRl9EQVRBX01PREVMX19DT05GSUdfV1NETF9MT0NBVElPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxseSBRdWFsaWZpZWQgSmF2YSBDbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRSA9IENYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGx5IFF1YWxpZmllZCBKYXZhIEludGVyZmFjZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUUgPSBDWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fQ09ORklHX0lEID0gQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19JRDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fVEFSR0VUX05BTUVTUEFDRSA9IENYRl9EQVRBX01PREVMX19UQVJHRVRfTkFNRVNQQUNFOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuZHBvaW50IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19FTkRQT0lOVF9OQU1FID0gQ1hGX0RBVEFfTU9ERUxfX0VORFBPSU5UX05BTUU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fU0VSVklDRV9OQU1FID0gQ1hGX0RBVEFfTU9ERUxfX1NFUlZJQ0VfTkFNRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19XU0RMX0RFRklOSVRJT04gPSBDWEZfREFUQV9NT0RFTF9fV1NETF9ERUZJTklUSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19XU0RMX0xPQ0FUSU9OID0gQ1hGX0RBVEFfTU9ERUxfX1dTRExfTE9DQVRJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcDEyIEJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19TT0FQMTJfQklORElORyA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFhTRCBJbXBvcnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfWFNEX0lNUE9SVFMgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBXU0RMPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1NETCA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFdyYXBwZXIgRmF1bHQgQmVhbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QW5ub3RhdGlvbiBQcm9jZXNzaW5nIEVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRCA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFdlYiBNZXRob2QgQW5ub3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTiA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFdlYiBQYXJhbSBBbm5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT04gPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgNjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBSZXF1ZXN0IFdyYXBwZXIgQW5ub3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgUmVzcG9uc2UgV3JhcHBlciBBbm5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3NwYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fQ0xBU1NQQVRIID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SmF2YSBTdGFydGluZyBQb2ludDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0pBVkFfU1RBUlRJTkdfUE9JTlQgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fVVNFX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDExOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dHJhY3QgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fRVhUUkFDVF9JTlRFUkZBQ0UgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX05BTUUgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIE1hcDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX01FVEhPRF9NQVAgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QW5ub3RhdGlvbiBNYXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX01BUCA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxNTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2UgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fU09VUkNFX0RJUkVDVE9SWSA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxNjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19QT1JUX05BTUUgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SmF2YTIgV1MgRGF0YSBNb2RlbDwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTg7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0IDxlbT5XU0RMMiBKYXZhIENvbnRleHQ8L2VtPn0nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFQgPSA0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN4ZiBSdW50aW1lIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19DWEZfUlVOVElNRV9MT0NBVElPTiA9IENYRl9DT05URVhUX19DWEZfUlVOVElNRV9MT0NBVElPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DeGYgUnVudGltZSBFZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19DWEZfUlVOVElNRV9FRElUSU9OID0gQ1hGX0NPTlRFWFRfX0NYRl9SVU5USU1FX0VESVRJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3hmIFJ1bnRpbWUgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fQ1hGX1JVTlRJTUVfVkVSU0lPTiA9IENYRl9DT05URVhUX19DWEZfUlVOVElNRV9WRVJTSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcmJvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX1ZFUkJPU0UgPSBDWEZfQ09OVEVYVF9fVkVSQk9TRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBBbnQgQnVpbGQgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUgPSBDWEZfQ09OVEVYVF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQ2xpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19HRU5FUkFURV9DTElFTlQgPSBDWEZfQ09OVEVYVF9fR0VORVJBVEVfQ0xJRU5UOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFNlcnZlcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fR0VORVJBVEVfU0VSVkVSID0gQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX1NFUlZFUjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhYmluZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fREFUQUJJTkRJTkcgPSBDWEZfQ09OVEVYVF9fREFUQUJJTkRJTkc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJvbnRlbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX0ZST05URU5EID0gQ1hGX0NPTlRFWFRfX0ZST05URU5EOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUID0gQ1hGX0NPTlRFWFRfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUiA9IENYRl9DT05URVhUX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+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+Q3hmIFJ1bnRpbWUgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0NYRl9SVU5USU1FX0xPQ0FUSU9OID0gQ1hGX0RBVEFfTU9ERUxfX0NYRl9SVU5USU1FX0xPQ0FUSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN4ZiBSdW50aW1lIEVkaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0NYRl9SVU5USU1FX0VESVRJT04gPSBDWEZfREFUQV9NT0RFTF9fQ1hGX1JVTlRJTUVfRURJVElPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DeGYgUnVudGltZSBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19DWEZfUlVOVElNRV9WRVJTSU9OID0gQ1hGX0RBVEFfTU9ERUxfX0NYRl9SVU5USU1FX1ZFUlNJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyYm9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fVkVSQk9TRSA9IENYRl9EQVRBX01PREVMX19WRVJCT1NFOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIEFudCBCdWlsZCBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19HRU5FUkFURV9BTlRfQlVJTERfRklMRSA9IENYRl9EQVRBX01PREVMX19HRU5FUkFURV9BTlRfQlVJTERfRklMRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBDbGllbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0NMSUVOVCA9IENYRl9EQVRBX01PREVMX19HRU5FUkFURV9DTElFTlQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgU2VydmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19HRU5FUkFURV9TRVJWRVIgPSBDWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfU0VSVkVSOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRhdGFiaW5kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19EQVRBQklORElORyA9IENYRl9EQVRBX01PREVMX19EQVRBQklORElORzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gcm9udGVuZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fRlJPTlRFTkQgPSBDWEZfREFUQV9NT0RFTF9fRlJPTlRFTkQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQgPSBDWEZfREFUQV9NT0RFTF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSID0gQ1hGX0RBVEFfTU9ERUxfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9qZWN0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1BST0pFQ1RfTkFNRSA9IENYRl9EQVRBX01PREVMX19QUk9KRUNUX05BTUU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19SRVNPVVJDRV9ESVJFQ1RPUlkgPSBDWEZfREFUQV9NT0RFTF9fUkVTT1VSQ0VfRElSRUNUT1JZOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIERpcmVjdG9yeTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fQ0xBU1NfRElSRUNUT1JZID0gQ1hGX0RBVEFfTU9ERUxfX0NMQVNTX0RJUkVDVE9SWTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIEZpbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fV1NETF9GSUxFX05BTUUgPSBDWEZfREFUQV9NT0RFTF9fV1NETF9GSUxFX05BTUU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBVUkw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1dTRExfVVJMID0gQ1hGX0RBVEFfTU9ERUxfX1dTRExfVVJMOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBXc2RsIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19DT05GSUdfV1NETF9MT0NBVElPTiA9IENYRl9EQVRBX01PREVMX19DT05GSUdfV1NETF9MT0NBVElPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxseSBRdWFsaWZpZWQgSmF2YSBDbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FID0gQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0NMQVNTX05BTUU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsbHkgUXVhbGlmaWVkIEphdmEgSW50ZXJmYWNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FID0gQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fQ09ORklHX0lEID0gQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19JRDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19UQVJHRVRfTkFNRVNQQUNFID0gQ1hGX0RBVEFfTU9ERUxfX1RBUkdFVF9OQU1FU1BBQ0U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5kcG9pbnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fRU5EUE9JTlRfTkFNRSA9IENYRl9EQVRBX01PREVMX19FTkRQT0lOVF9OQU1FOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fU0VSVklDRV9OQU1FID0gQ1hGX0RBVEFfTU9ERUxfX1NFUlZJQ0VfTkFNRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1dTRExfREVGSU5JVElPTiA9IENYRl9EQVRBX01PREVMX19XU0RMX0RFRklOSVRJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fV1NETF9MT0NBVElPTiA9IENYRl9EQVRBX01PREVMX19XU0RMX0xPQ0FUSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIEltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTiA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgU09BUCBIZWFkZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19QUk9DRVNTX1NPQVBfSEVBREVSUyA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvYWQgRGVmYXVsdCBOYW1lc3BhY2UgUGFja2FnZSBOYW1lIE1hcHBpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkcgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2FkIERlZmF1bHQgRXhjbHVkZXMgTmFtZXBzYWNlIE1hcHBpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORyA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbGlkYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19WQUxJREFURSA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fV1NETF9WRVJTSU9OID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlIERlZmF1bHQgVmFsdWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19VU0VfREVGQVVMVF9WQUxVRVMgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgNjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgQXJnczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0FSR1MgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgNzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5ObyBBZGRyZXNzIEJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX05PX0FERFJFU1NfQklORElORyA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhqYyBVc2UgRGVmYXVsdCBWYWx1ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVMgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgOTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgVG8gU3RyaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhqYyBUbyBTdHJpbmcgTXVsdGkgTGluZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDExOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhqYyBUbyBTdHJpbmcgU2ltcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HX1NJTVBMRSA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgTG9jYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0xPQ0FUT1IgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WGpjIFN5bmMgTWV0aG9kczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1NZTkNfTUVUSE9EUyA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxNDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgTWFyayBHZW5lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19NQVJLX0dFTkVSQVRFRCA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxNTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgRXBpc29kZSBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfRVBJU09ERV9GSUxFID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDE2OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dG8gTmFtZSBSZXNvbHV0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19BVVRPX05BTUVfUkVTT0xVVElPTiA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxNzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlZCBOYW1lc3BhY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19JTkNMVURFRF9OQU1FU1BBQ0VTID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDE4OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJpbmRpbmcgRmlsZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fQklORElOR19GSUxFUyA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxOTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlZCBOYW1lc3BhY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19FWENMVURFRF9OQU1FU1BBQ0VTID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDIwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2cgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fQ0FUQUxPR19GSUxFID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDIxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkphdmEgU291cmNlIEZvbGRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fSkFWQV9TT1VSQ0VfRk9MREVSID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDIyOwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldTREwyIEphdmEgRGF0YSBNb2RlbDwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAyMzsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkZyb250ZW5kIDxlbT5Gcm9udGVuZDwvZW0+fScgZW51bS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkZyb250ZW5kCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRGcm9udGVuZCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBGUk9OVEVORCA9IDY7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5EYXRhQmluZGluZyA8ZW0+RGF0YSBCaW5kaW5nPC9lbT59JyBlbnVtLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRGF0YUJpbmRpbmcKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldERhdGFCaW5kaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IERBVEFfQklORElORyA9IDc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlVSTDwvZW0+JyBkYXRhIHR5cGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlIGphdmEubmV0LlVSTAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0VVJMKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IFVSTCA9IDg7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkRlZmluaXRpb248L2VtPicgZGF0YSB0eXBlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBqYXZheC53c2RsLkRlZmluaXRpb24KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldERlZmluaXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgREVGSU5JVElPTiA9IDk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk1hcDwvZW0+JyBkYXRhIHR5cGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlIGphdmEudXRpbC5NYXAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldE1hcCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBNQVAgPSAxMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SU1ldGhvZDwvZW0+JyBkYXRhIHR5cGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldElNZXRob2QoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgSU1FVEhPRCA9IDExOwotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCA8ZW0+Q29udGV4dDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250ZXh0PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUNsYXNzIGdldENYRkNvbnRleHQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0Q3hmUnVudGltZUxvY2F0aW9uIDxlbT5DeGYgUnVudGltZSBMb2NhdGlvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkN4ZiBSdW50aW1lIExvY2F0aW9uPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0Q3hmUnVudGltZUxvY2F0aW9uKCkKLSAgICAgKiBAc2VlICNnZXRDWEZDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0N4ZlJ1bnRpbWVMb2NhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXRDeGZSdW50aW1lRWRpdGlvbiA8ZW0+Q3hmIFJ1bnRpbWUgRWRpdGlvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkN4ZiBSdW50aW1lIEVkaXRpb248L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXRDeGZSdW50aW1lRWRpdGlvbigpCi0gICAgICogQHNlZSAjZ2V0Q1hGQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9DeGZSdW50aW1lRWRpdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXRDeGZSdW50aW1lVmVyc2lvbiA8ZW0+Q3hmIFJ1bnRpbWUgVmVyc2lvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkN4ZiBSdW50aW1lIFZlcnNpb248L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXRDeGZSdW50aW1lVmVyc2lvbigpCi0gICAgICogQHNlZSAjZ2V0Q1hGQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9DeGZSdW50aW1lVmVyc2lvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc1ZlcmJvc2UgPGVtPlZlcmJvc2U8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJib3NlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNWZXJib3NlKCkKLSAgICAgKiBAc2VlICNnZXRDWEZDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X1ZlcmJvc2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNHZW5lcmF0ZUFudEJ1aWxkRmlsZSA8ZW0+R2VuZXJhdGUgQW50IEJ1aWxkIEZpbGU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HZW5lcmF0ZSBBbnQgQnVpbGQgRmlsZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzR2VuZXJhdGVBbnRCdWlsZEZpbGUoKQotICAgICAqIEBzZWUgI2dldENYRkNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfR2VuZXJhdGVBbnRCdWlsZEZpbGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNHZW5lcmF0ZUNsaWVudCA8ZW0+R2VuZXJhdGUgQ2xpZW50PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2VuZXJhdGUgQ2xpZW50PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNHZW5lcmF0ZUNsaWVudCgpCi0gICAgICogQHNlZSAjZ2V0Q1hGQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9HZW5lcmF0ZUNsaWVudCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc0dlbmVyYXRlU2VydmVyIDxlbT5HZW5lcmF0ZSBTZXJ2ZXI8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HZW5lcmF0ZSBTZXJ2ZXI8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc0dlbmVyYXRlU2VydmVyKCkKLSAgICAgKiBAc2VlICNnZXRDWEZDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0dlbmVyYXRlU2VydmVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldERhdGFiaW5kaW5nIDxlbT5EYXRhYmluZGluZzwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRhdGFiaW5kaW5nPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0RGF0YWJpbmRpbmcoKQotICAgICAqIEBzZWUgI2dldENYRkNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfRGF0YWJpbmRpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0RnJvbnRlbmQgPGVtPkZyb250ZW5kPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RnJvbnRlbmQ8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXRGcm9udGVuZCgpCi0gICAgICogQHNlZSAjZ2V0Q1hGQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9Gcm9udGVuZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCA8ZW0+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKQotICAgICAqIEBzZWUgI2dldENYRkNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyIDxlbT5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpCi0gICAgICogQHNlZSAjZ2V0Q1hGQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9FeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwgPGVtPkRhdGEgTW9kZWw8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGF0YSBNb2RlbDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUNsYXNzIGdldENYRkRhdGFNb2RlbCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFByb2plY3ROYW1lIDxlbT5Qcm9qZWN0IE5hbWU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm9qZWN0IE5hbWU8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFByb2plY3ROYW1lKCkKLSAgICAgKiBAc2VlICNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9Qcm9qZWN0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFJlc291cmNlRGlyZWN0b3J5IDxlbT5SZXNvdXJjZSBEaXJlY3Rvcnk8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNvdXJjZSBEaXJlY3Rvcnk8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFJlc291cmNlRGlyZWN0b3J5KCkKLSAgICAgKiBAc2VlICNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9SZXNvdXJjZURpcmVjdG9yeSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldENsYXNzRGlyZWN0b3J5IDxlbT5DbGFzcyBEaXJlY3Rvcnk8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DbGFzcyBEaXJlY3Rvcnk8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldENsYXNzRGlyZWN0b3J5KCkKLSAgICAgKiBAc2VlICNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9DbGFzc0RpcmVjdG9yeSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFdzZGxGaWxlTmFtZSA8ZW0+V3NkbCBGaWxlIE5hbWU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xc2RsIEZpbGUgTmFtZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0V3NkbEZpbGVOYW1lKCkKLSAgICAgKiBAc2VlICNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9Xc2RsRmlsZU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRXc2RsVVJMIDxlbT5Xc2RsIFVSTDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldzZGwgVVJMPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRXc2RsVVJMKCkKLSAgICAgKiBAc2VlICNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9Xc2RsVVJMKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0Q29uZmlnV3NkbExvY2F0aW9uIDxlbT5Db25maWcgV3NkbCBMb2NhdGlvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbmZpZyBXc2RsIExvY2F0aW9uPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRDb25maWdXc2RsTG9jYXRpb24oKQotICAgICAqIEBzZWUgI2dldENYRkRhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX0NvbmZpZ1dzZGxMb2NhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSA8ZW0+RnVsbHkgUXVhbGlmaWVkIEphdmEgQ2xhc3MgTmFtZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZ1bGx5IFF1YWxpZmllZCBKYXZhIENsYXNzIE5hbWU8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpCi0gICAgICogQHNlZSAjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfRnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSA8ZW0+RnVsbHkgUXVhbGlmaWVkIEphdmEgSW50ZXJmYWNlIE5hbWU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GdWxseSBRdWFsaWZpZWQgSmF2YSBJbnRlcmZhY2UgTmFtZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpCi0gICAgICogQHNlZSAjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfRnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldENvbmZpZ0lkIDxlbT5Db25maWcgSWQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db25maWcgSWQ8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldENvbmZpZ0lkKCkKLSAgICAgKiBAc2VlICNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9Db25maWdJZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFRhcmdldE5hbWVzcGFjZSgpCi0gICAgICogQHNlZSAjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfVGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0RW5kcG9pbnROYW1lIDxlbT5FbmRwb2ludCBOYW1lPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW5kcG9pbnQgTmFtZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0RW5kcG9pbnROYW1lKCkKLSAgICAgKiBAc2VlICNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9FbmRwb2ludE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRTZXJ2aWNlTmFtZSA8ZW0+U2VydmljZSBOYW1lPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VydmljZSBOYW1lPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRTZXJ2aWNlTmFtZSgpCi0gICAgICogQHNlZSAjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfU2VydmljZU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRXc2RsRGVmaW5pdGlvbiA8ZW0+V3NkbCBEZWZpbml0aW9uPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3NkbCBEZWZpbml0aW9uPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRXc2RsRGVmaW5pdGlvbigpCi0gICAgICogQHNlZSAjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfV3NkbERlZmluaXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRXc2RsTG9jYXRpb24gPGVtPldzZGwgTG9jYXRpb248L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xc2RsIExvY2F0aW9uPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRXc2RsTG9jYXRpb24oKQotICAgICAqIEBzZWUgI2dldENYRkRhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX1dzZGxMb2NhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0IDxlbT5KYXZhMiBXUyBDb250ZXh0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkphdmEyIFdTIENvbnRleHQ8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUNsYXNzIGdldEphdmEyV1NDb250ZXh0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc1NvYXAxMkJpbmRpbmcgPGVtPlNvYXAxMiBCaW5kaW5nPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U29hcDEyIEJpbmRpbmc8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNTb2FwMTJCaW5kaW5nKCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0NvbnRleHRfU29hcDEyQmluZGluZygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVhTREltcG9ydHMgPGVtPkdlbmVyYXRlIFhTRCBJbXBvcnRzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2VuZXJhdGUgWFNEIEltcG9ydHM8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVhTREltcG9ydHMoKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVhTREltcG9ydHMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVXU0RMIDxlbT5HZW5lcmF0ZSBXU0RMPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2VuZXJhdGUgV1NETDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlV1NETCgpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0NvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV1NETCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zIDxlbT5HZW5lcmF0ZSBXcmFwcGVyIEZhdWx0IEJlYW5zPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2VuZXJhdGUgV3JhcHBlciBGYXVsdCBCZWFuczwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCA8ZW0+QW5ub3RhdGlvbiBQcm9jZXNzaW5nIEVuYWJsZWQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Bbm5vdGF0aW9uIFByb2Nlc3NpbmcgRW5hYmxlZDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0NvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24gPGVtPkdlbmVyYXRlIFdlYiBNZXRob2QgQW5ub3RhdGlvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdlbmVyYXRlIFdlYiBNZXRob2QgQW5ub3RhdGlvbjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0NvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbiA8ZW0+R2VuZXJhdGUgV2ViIFBhcmFtIEFubm90YXRpb248L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HZW5lcmF0ZSBXZWIgUGFyYW0gQW5ub3RhdGlvbjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24gPGVtPkdlbmVyYXRlIFJlcXVlc3QgV3JhcHBlciBBbm5vdGF0aW9uPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2VuZXJhdGUgUmVxdWVzdCBXcmFwcGVyIEFubm90YXRpb248L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0NvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbiA8ZW0+R2VuZXJhdGUgUmVzcG9uc2UgV3JhcHBlciBBbm5vdGF0aW9uPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2VuZXJhdGUgUmVzcG9uc2UgV3JhcHBlciBBbm5vdGF0aW9uPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCA8ZW0+SmF2YTIgV1MgRGF0YSBNb2RlbDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5KYXZhMiBXUyBEYXRhIE1vZGVsPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUNsYXNzIGdldEphdmEyV1NEYXRhTW9kZWwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0Q2xhc3NwYXRoIDxlbT5DbGFzc3BhdGg8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DbGFzc3BhdGg8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRDbGFzc3BhdGgoKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NEYXRhTW9kZWxfQ2xhc3NwYXRoKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldEphdmFTdGFydGluZ1BvaW50IDxlbT5KYXZhIFN0YXJ0aW5nIFBvaW50PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SmF2YSBTdGFydGluZyBQb2ludDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldEphdmFTdGFydGluZ1BvaW50KCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX0phdmFTdGFydGluZ1BvaW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2lzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIDxlbT5Vc2UgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vc2UgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNpc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0RhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0RhdGFNb2RlbF9Vc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjaXNFeHRyYWN0SW50ZXJmYWNlIDxlbT5FeHRyYWN0IEludGVyZmFjZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dHJhY3QgSW50ZXJmYWNlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjaXNFeHRyYWN0SW50ZXJmYWNlKCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX0V4dHJhY3RJbnRlcmZhY2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTmFtZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE5hbWU8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0TWV0aG9kTWFwIDxlbT5NZXRob2QgTWFwPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWV0aG9kIE1hcDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldE1ldGhvZE1hcCgpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0RhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0RhdGFNb2RlbF9NZXRob2RNYXAoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0QW5ub3RhdGlvbk1hcCA8ZW0+QW5ub3RhdGlvbiBNYXA8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Bbm5vdGF0aW9uIE1hcDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldEFubm90YXRpb25NYXAoKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NEYXRhTW9kZWxfQW5ub3RhdGlvbk1hcCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRTb3VyY2VEaXJlY3RvcnkgPGVtPlNvdXJjZSBEaXJlY3Rvcnk8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Tb3VyY2UgRGlyZWN0b3J5PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0U291cmNlRGlyZWN0b3J5KCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX1NvdXJjZURpcmVjdG9yeSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRQb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UG9ydCBOYW1lPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0UG9ydE5hbWUoKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NEYXRhTW9kZWxfUG9ydE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0IDxlbT5XU0RMMiBKYXZhIENvbnRleHQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V1NETDIgSmF2YSBDb250ZXh0PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUNsYXNzIGdldFdTREwySmF2YUNvbnRleHQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uIDxlbT5HZW5lcmF0ZSBJbXBsZW1lbnRhdGlvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdlbmVyYXRlIEltcGxlbWVudGF0aW9uPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNQcm9jZXNzU09BUEhlYWRlcnMgPGVtPlByb2Nlc3MgU09BUCBIZWFkZXJzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvY2VzcyBTT0FQIEhlYWRlcnM8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1Byb2Nlc3NTT0FQSGVhZGVycygpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9Qcm9jZXNzU09BUEhlYWRlcnMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyA8ZW0+TG9hZCBEZWZhdWx0IE5hbWVzcGFjZSBQYWNrYWdlIE5hbWUgTWFwcGluZzwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvYWQgRGVmYXVsdCBOYW1lc3BhY2UgUGFja2FnZSBOYW1lIE1hcHBpbmc8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcgPGVtPkxvYWQgRGVmYXVsdCBFeGNsdWRlcyBOYW1lcHNhY2UgTWFwcGluZzwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvYWQgRGVmYXVsdCBFeGNsdWRlcyBOYW1lcHNhY2UgTWFwcGluZzwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNWYWxpZGF0ZSA8ZW0+VmFsaWRhdGU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWxpZGF0ZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzVmFsaWRhdGUoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfVmFsaWRhdGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjZ2V0V3NkbFZlcnNpb24gPGVtPldzZGwgVmVyc2lvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldzZGwgVmVyc2lvbjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2dldFdzZGxWZXJzaW9uKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1dzZGxWZXJzaW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzVXNlRGVmYXVsdFZhbHVlcyA8ZW0+VXNlIERlZmF1bHQgVmFsdWVzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNlIERlZmF1bHQgVmFsdWVzPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNVc2VEZWZhdWx0VmFsdWVzKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1VzZURlZmF1bHRWYWx1ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjZ2V0WGpjQXJncyA8ZW0+WGpjIEFyZ3M8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5YamMgQXJnczwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2dldFhqY0FyZ3MoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjQXJncygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc05vQWRkcmVzc0JpbmRpbmcgPGVtPk5vIEFkZHJlc3MgQmluZGluZzwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vIEFkZHJlc3MgQmluZGluZzwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzTm9BZGRyZXNzQmluZGluZygpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9Ob0FkZHJlc3NCaW5kaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjVXNlRGVmYXVsdFZhbHVlcyA8ZW0+WGpjIFVzZSBEZWZhdWx0IFZhbHVlczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlhqYyBVc2UgRGVmYXVsdCBWYWx1ZXM8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY1VzZURlZmF1bHRWYWx1ZXMoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjVXNlRGVmYXVsdFZhbHVlcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY1RvU3RyaW5nIDxlbT5YamMgVG8gU3RyaW5nPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+WGpjIFRvIFN0cmluZzwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjVG9TdHJpbmcoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjVG9TdHJpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNUb1N0cmluZ011bHRpTGluZSA8ZW0+WGpjIFRvIFN0cmluZyBNdWx0aSBMaW5lPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+WGpjIFRvIFN0cmluZyBNdWx0aSBMaW5lPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNUb1N0cmluZ011bHRpTGluZSgpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9YamNUb1N0cmluZ011bHRpTGluZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY1RvU3RyaW5nU2ltcGxlIDxlbT5YamMgVG8gU3RyaW5nIFNpbXBsZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlhqYyBUbyBTdHJpbmcgU2ltcGxlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNUb1N0cmluZ1NpbXBsZSgpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9YamNUb1N0cmluZ1NpbXBsZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY0xvY2F0b3IgPGVtPlhqYyBMb2NhdG9yPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+WGpjIExvY2F0b3I8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY0xvY2F0b3IoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjTG9jYXRvcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY1N5bmNNZXRob2RzIDxlbT5YamMgU3luYyBNZXRob2RzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+WGpjIFN5bmMgTWV0aG9kczwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjU3luY01ldGhvZHMoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjU3luY01ldGhvZHMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNNYXJrR2VuZXJhdGVkIDxlbT5YamMgTWFyayBHZW5lcmF0ZWQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5YamMgTWFyayBHZW5lcmF0ZWQ8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY01hcmtHZW5lcmF0ZWQoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjTWFya0dlbmVyYXRlZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNnZXRYamNFcGlzb2RlRmlsZSA8ZW0+WGpjIEVwaXNvZGUgRmlsZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlhqYyBFcGlzb2RlIEZpbGU8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNnZXRYamNFcGlzb2RlRmlsZSgpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9YamNFcGlzb2RlRmlsZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc0F1dG9OYW1lUmVzb2x1dGlvbiA8ZW0+QXV0byBOYW1lIFJlc29sdXRpb248L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdXRvIE5hbWUgUmVzb2x1dGlvbjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzQXV0b05hbWVSZXNvbHV0aW9uKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X0F1dG9OYW1lUmVzb2x1dGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCA8ZW0+V1NETDIgSmF2YSBEYXRhIE1vZGVsPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldTREwyIEphdmEgRGF0YSBNb2RlbDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUNsYXNzIGdldFdTREwySmF2YURhdGFNb2RlbCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsI2dldEluY2x1ZGVkTmFtZXNwYWNlcyA8ZW0+SW5jbHVkZWQgTmFtZXNwYWNlczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluY2x1ZGVkIE5hbWVzcGFjZXM8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsI2dldEluY2x1ZGVkTmFtZXNwYWNlcygpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFEYXRhTW9kZWxfSW5jbHVkZWROYW1lc3BhY2VzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCNnZXRCaW5kaW5nRmlsZXMgPGVtPkJpbmRpbmcgRmlsZXM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkJpbmRpbmcgRmlsZXM8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsI2dldEJpbmRpbmdGaWxlcygpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFEYXRhTW9kZWxfQmluZGluZ0ZpbGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwjZ2V0RXhjbHVkZWROYW1lc3BhY2VzIDxlbT5FeGNsdWRlZCBOYW1lc3BhY2VzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhjbHVkZWQgTmFtZXNwYWNlczwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwjZ2V0RXhjbHVkZWROYW1lc3BhY2VzKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YURhdGFNb2RlbF9FeGNsdWRlZE5hbWVzcGFjZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCNnZXRDYXRhbG9nRmlsZSA8ZW0+Q2F0YWxvZyBGaWxlPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2F0YWxvZyBGaWxlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCNnZXRDYXRhbG9nRmlsZSgpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFEYXRhTW9kZWxfQ2F0YWxvZ0ZpbGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCNnZXRKYXZhU291cmNlRm9sZGVyIDxlbT5KYXZhIFNvdXJjZSBGb2xkZXI8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5KYXZhIFNvdXJjZSBGb2xkZXI8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsI2dldEphdmFTb3VyY2VGb2xkZXIoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YURhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0phdmFTb3VyY2VGb2xkZXIoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkZyb250ZW5kIDxlbT5Gcm9udGVuZDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkZyb250ZW5kPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkZyb250ZW5kCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVFbnVtIGdldEZyb250ZW5kKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5EYXRhQmluZGluZyA8ZW0+RGF0YSBCaW5kaW5nPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+RGF0YSBCaW5kaW5nPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkRhdGFCaW5kaW5nCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVFbnVtIGdldERhdGFCaW5kaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5uZXQuVVJMIDxlbT5VUkw8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlVSTDwvZW0+Jy4KLSAgICAgKiBAc2VlIGphdmEubmV0LlVSTAotICAgICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm5ldC5VUkwiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVEYXRhVHlwZSBnZXRVUkwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZheC53c2RsLkRlZmluaXRpb24gPGVtPkRlZmluaXRpb248L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkRlZmluaXRpb248L2VtPicuCi0gICAgICogQHNlZSBqYXZheC53c2RsLkRlZmluaXRpb24KLSAgICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5EZWZpbml0aW9uIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFRGF0YVR5cGUgZ2V0RGVmaW5pdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEudXRpbC5NYXAgPGVtPk1hcDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TWFwPC9lbT4nLgotICAgICAqIEBzZWUgamF2YS51dGlsLk1hcAotICAgICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLnV0aWwuTWFwIiB0eXBlUGFyYW1ldGVycz0iVCBUMSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRURhdGFUeXBlIGdldE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QgPGVtPklNZXRob2Q8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPklNZXRob2Q8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kCi0gICAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVEYXRhVHlwZSBnZXRJTWV0aG9kKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBDWEZGYWN0b3J5IGdldENYRkZhY3RvcnkoKTsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotICAgICAqIDx1bD4KLSAgICAgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gICAgICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAgICAgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAgICAgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludGVyZmFjZSBMaXRlcmFscyB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQgPGVtPkNvbnRleHQ8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldENYRkNvbnRleHQoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQ2xhc3MgQ1hGX0NPTlRFWFQgPSBlSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q3hmIFJ1bnRpbWUgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfQ09OVEVYVF9fQ1hGX1JVTlRJTUVfTE9DQVRJT04gPSBlSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9DeGZSdW50aW1lTG9jYXRpb24oKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkN4ZiBSdW50aW1lIEVkaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfQ09OVEVYVF9fQ1hGX1JVTlRJTUVfRURJVElPTiA9IGVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X0N4ZlJ1bnRpbWVFZGl0aW9uKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DeGYgUnVudGltZSBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0NPTlRFWFRfX0NYRl9SVU5USU1FX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9DeGZSdW50aW1lVmVyc2lvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyYm9zZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9DT05URVhUX19WRVJCT1NFID0gZUlOU1RBTkNFLmdldENYRkNvbnRleHRfVmVyYm9zZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQW50IEJ1aWxkIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfQ09OVEVYVF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUgPSBlSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9HZW5lcmF0ZUFudEJ1aWxkRmlsZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQ2xpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX0NMSUVOVCA9IGVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X0dlbmVyYXRlQ2xpZW50KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBTZXJ2ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfQ09OVEVYVF9fR0VORVJBVEVfU0VSVkVSID0gZUlOU1RBTkNFLmdldENYRkNvbnRleHRfR2VuZXJhdGVTZXJ2ZXIoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRhdGFiaW5kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0NPTlRFWFRfX0RBVEFCSU5ESU5HID0gZUlOU1RBTkNFLmdldENYRkNvbnRleHRfRGF0YWJpbmRpbmcoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZyb250ZW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0NPTlRFWFRfX0ZST05URU5EID0gZUlOU1RBTkNFLmdldENYRkNvbnRleHRfRnJvbnRlbmQoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9DT05URVhUX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQgPSBlSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9Vc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9DT05URVhUX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIgPSBlSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9FeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwgPGVtPkRhdGEgTW9kZWw8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUNsYXNzIENYRl9EQVRBX01PREVMID0gZUlOU1RBTkNFLmdldENYRkRhdGFNb2RlbCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0RBVEFfTU9ERUxfX1BST0pFQ1RfTkFNRSA9IGVJTlNUQU5DRS5nZXRDWEZEYXRhTW9kZWxfUHJvamVjdE5hbWUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIERpcmVjdG9yeTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9EQVRBX01PREVMX19SRVNPVVJDRV9ESVJFQ1RPUlkgPSBlSU5TVEFOQ0UuZ2V0Q1hGRGF0YU1vZGVsX1Jlc291cmNlRGlyZWN0b3J5KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBEaXJlY3Rvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfREFUQV9NT0RFTF9fQ0xBU1NfRElSRUNUT1JZID0gZUlOU1RBTkNFLmdldENYRkRhdGFNb2RlbF9DbGFzc0RpcmVjdG9yeSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBGaWxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfREFUQV9NT0RFTF9fV1NETF9GSUxFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0Q1hGRGF0YU1vZGVsX1dzZGxGaWxlTmFtZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBVUkw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfREFUQV9NT0RFTF9fV1NETF9VUkwgPSBlSU5TVEFOQ0UuZ2V0Q1hGRGF0YU1vZGVsX1dzZGxVUkwoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBXc2RsIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19XU0RMX0xPQ0FUSU9OID0gZUlOU1RBTkNFLmdldENYRkRhdGFNb2RlbF9Db25maWdXc2RsTG9jYXRpb24oKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZ1bGx5IFF1YWxpZmllZCBKYXZhIENsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRSA9IGVJTlNUQU5DRS5nZXRDWEZEYXRhTW9kZWxfRnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GdWxseSBRdWFsaWZpZWQgSmF2YSBJbnRlcmZhY2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9JTlRFUkZBQ0VfTkFNRSA9IGVJTlNUQU5DRS5nZXRDWEZEYXRhTW9kZWxfRnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19JRCA9IGVJTlNUQU5DRS5nZXRDWEZEYXRhTW9kZWxfQ29uZmlnSWQoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfREFUQV9NT0RFTF9fVEFSR0VUX05BTUVTUEFDRSA9IGVJTlNUQU5DRS5nZXRDWEZEYXRhTW9kZWxfVGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbmRwb2ludCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0RBVEFfTU9ERUxfX0VORFBPSU5UX05BTUUgPSBlSU5TVEFOQ0UuZ2V0Q1hGRGF0YU1vZGVsX0VuZHBvaW50TmFtZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0RBVEFfTU9ERUxfX1NFUlZJQ0VfTkFNRSA9IGVJTlNUQU5DRS5nZXRDWEZEYXRhTW9kZWxfU2VydmljZU5hbWUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldzZGwgRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9EQVRBX01PREVMX19XU0RMX0RFRklOSVRJT04gPSBlSU5TVEFOQ0UuZ2V0Q1hGRGF0YU1vZGVsX1dzZGxEZWZpbml0aW9uKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xc2RsIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0RBVEFfTU9ERUxfX1dTRExfTE9DQVRJT04gPSBlSU5TVEFOQ0UuZ2V0Q1hGRGF0YU1vZGVsX1dzZGxMb2NhdGlvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0IDxlbT5KYXZhMiBXUyBDb250ZXh0PC9lbT59JyBjbGFzcy4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0SmF2YTJXU0NvbnRleHQoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQ2xhc3MgSkFWQTJfV1NfQ09OVEVYVCA9IGVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcDEyIEJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19DT05URVhUX19TT0FQMTJfQklORElORyA9IGVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9Tb2FwMTJCaW5kaW5nKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBYU0QgSW1wb3J0czwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1hTRF9JTVBPUlRTID0gZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlWFNESW1wb3J0cygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgV1NETDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dTREwgPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXU0RMKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBXcmFwcGVyIEZhdWx0IEJlYW5zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUyA9IGVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bbm5vdGF0aW9uIFByb2Nlc3NpbmcgRW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0NPTlRFWFRfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEID0gZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgV2ViIE1ldGhvZCBBbm5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OID0gZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgV2ViIFBhcmFtIEFubm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTiA9IGVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgUmVxdWVzdCBXcmFwcGVyIEFubm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTiA9IGVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgUmVzcG9uc2UgV3JhcHBlciBBbm5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OID0gZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwgPGVtPkphdmEyIFdTIERhdGEgTW9kZWw8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldEphdmEyV1NEYXRhTW9kZWwoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQ2xhc3MgSkFWQTJfV1NfREFUQV9NT0RFTCA9IGVJTlNUQU5DRS5nZXRKYXZhMldTRGF0YU1vZGVsKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbGFzc3BhdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19EQVRBX01PREVMX19DTEFTU1BBVEggPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0RhdGFNb2RlbF9DbGFzc3BhdGgoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphdmEgU3RhcnRpbmcgUG9pbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19EQVRBX01PREVMX19KQVZBX1NUQVJUSU5HX1BPSU5UID0gZUlOU1RBTkNFLmdldEphdmEyV1NEYXRhTW9kZWxfSmF2YVN0YXJ0aW5nUG9pbnQoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0RBVEFfTU9ERUxfX1VTRV9TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRKYXZhMldTRGF0YU1vZGVsX1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXh0cmFjdCBJbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19EQVRBX01PREVMX19FWFRSQUNUX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRKYXZhMldTRGF0YU1vZGVsX0V4dHJhY3RJbnRlcmZhY2UoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19EQVRBX01PREVMX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9OQU1FID0gZUlOU1RBTkNFLmdldEphdmEyV1NEYXRhTW9kZWxfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIE1hcDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0RBVEFfTU9ERUxfX01FVEhPRF9NQVAgPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0RhdGFNb2RlbF9NZXRob2RNYXAoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFubm90YXRpb24gTWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfREFUQV9NT0RFTF9fQU5OT1RBVElPTl9NQVAgPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0RhdGFNb2RlbF9Bbm5vdGF0aW9uTWFwKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2UgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfREFUQV9NT0RFTF9fU09VUkNFX0RJUkVDVE9SWSA9IGVJTlNUQU5DRS5nZXRKYXZhMldTRGF0YU1vZGVsX1NvdXJjZURpcmVjdG9yeSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfREFUQV9NT0RFTF9fUE9SVF9OQU1FID0gZUlOU1RBTkNFLmdldEphdmEyV1NEYXRhTW9kZWxfUG9ydE5hbWUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0IDxlbT5XU0RMMiBKYXZhIENvbnRleHQ8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQ2xhc3MgV1NETDJfSkFWQV9DT05URVhUID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHQoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIEltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTiA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgU09BUCBIZWFkZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19QUk9DRVNTX1NPQVBfSEVBREVSUyA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1Byb2Nlc3NTT0FQSGVhZGVycygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9hZCBEZWZhdWx0IE5hbWVzcGFjZSBQYWNrYWdlIE5hbWUgTWFwcGluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2FkIERlZmF1bHQgRXhjbHVkZXMgTmFtZXBzYWNlIE1hcHBpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWxpZGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fVkFMSURBVEUgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9WYWxpZGF0ZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19XU0RMX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9Xc2RsVmVyc2lvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXNlIERlZmF1bHQgVmFsdWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19VU0VfREVGQVVMVF9WQUxVRVMgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9Vc2VEZWZhdWx0VmFsdWVzKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YamMgQXJnczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0FSR1MgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9YamNBcmdzKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5ObyBBZGRyZXNzIEJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0NPTlRFWFRfX05PX0FERFJFU1NfQklORElORyA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X05vQWRkcmVzc0JpbmRpbmcoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhqYyBVc2UgRGVmYXVsdCBWYWx1ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVMgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9YamNVc2VEZWZhdWx0VmFsdWVzKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YamMgVG8gU3RyaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfWGpjVG9TdHJpbmcoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhqYyBUbyBTdHJpbmcgTXVsdGkgTGluZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfWGpjVG9TdHJpbmdNdWx0aUxpbmUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhqYyBUbyBTdHJpbmcgU2ltcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX1NJTVBMRSA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY1RvU3RyaW5nU2ltcGxlKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YamMgTG9jYXRvcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0xPQ0FUT1IgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9YamNMb2NhdG9yKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YamMgU3luYyBNZXRob2RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19YSkNfU1lOQ19NRVRIT0RTID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfWGpjU3luY01ldGhvZHMoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhqYyBNYXJrIEdlbmVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX01BUktfR0VORVJBVEVEID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfWGpjTWFya0dlbmVyYXRlZCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WGpjIEVwaXNvZGUgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0VQSVNPREVfRklMRSA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY0VwaXNvZGVGaWxlKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdXRvIE5hbWUgUmVzb2x1dGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fQVVUT19OQU1FX1JFU09MVVRJT04gPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9BdXRvTmFtZVJlc29sdXRpb24oKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwgPGVtPldTREwyIEphdmEgRGF0YSBNb2RlbDwvZW0+fScgY2xhc3MuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRXU0RMMkphdmFEYXRhTW9kZWwoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQ2xhc3MgV1NETDJfSkFWQV9EQVRBX01PREVMID0gZUlOU1RBTkNFLmdldFdTREwySmF2YURhdGFNb2RlbCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZWQgTmFtZXNwYWNlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfREFUQV9NT0RFTF9fSU5DTFVERURfTkFNRVNQQUNFUyA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFEYXRhTW9kZWxfSW5jbHVkZWROYW1lc3BhY2VzKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CaW5kaW5nIEZpbGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0JJTkRJTkdfRklMRVMgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0JpbmRpbmdGaWxlcygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZWQgTmFtZXNwYWNlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfREFUQV9NT0RFTF9fRVhDTFVERURfTkFNRVNQQUNFUyA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFEYXRhTW9kZWxfRXhjbHVkZWROYW1lc3BhY2VzKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0NBVEFMT0dfRklMRSA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFEYXRhTW9kZWxfQ2F0YWxvZ0ZpbGUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphdmEgU291cmNlIEZvbGRlcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfREFUQV9NT0RFTF9fSkFWQV9TT1VSQ0VfRk9MREVSID0gZUlOU1RBTkNFLmdldFdTREwySmF2YURhdGFNb2RlbF9KYXZhU291cmNlRm9sZGVyKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRnJvbnRlbmQgPGVtPkZyb250ZW5kPC9lbT59JyBlbnVtLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRnJvbnRlbmQKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRGcm9udGVuZCgpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVFbnVtIEZST05URU5EID0gZUlOU1RBTkNFLmdldEZyb250ZW5kKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRGF0YUJpbmRpbmcgPGVtPkRhdGEgQmluZGluZzwvZW0+fScgZW51bS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkRhdGFCaW5kaW5nCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0RGF0YUJpbmRpbmcoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFRW51bSBEQVRBX0JJTkRJTkcgPSBlSU5TVEFOQ0UuZ2V0RGF0YUJpbmRpbmcoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlVSTDwvZW0+JyBkYXRhIHR5cGUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAc2VlIGphdmEubmV0LlVSTAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldFVSTCgpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVEYXRhVHlwZSBVUkwgPSBlSU5TVEFOQ0UuZ2V0VVJMKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5EZWZpbml0aW9uPC9lbT4nIGRhdGEgdHlwZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBzZWUgamF2YXgud3NkbC5EZWZpbml0aW9uCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0RGVmaW5pdGlvbigpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVEYXRhVHlwZSBERUZJTklUSU9OID0gZUlOU1RBTkNFLmdldERlZmluaXRpb24oKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPk1hcDwvZW0+JyBkYXRhIHR5cGUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAc2VlIGphdmEudXRpbC5NYXAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRNYXAoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFRGF0YVR5cGUgTUFQID0gZUlOU1RBTkNFLmdldE1hcCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+SU1ldGhvZDwvZW0+JyBkYXRhIHR5cGUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRJTWV0aG9kKCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRURhdGFUeXBlIElNRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0SU1ldGhvZCgpOwotCi0gICAgfQotCi19IC8vQ1hGUGFja2FnZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9EYXRhQmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9EYXRhQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDFmYjE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvRGF0YUJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiAkSWQ6IERhdGFCaW5kaW5nLmphdmEsdiAxLjEgMjAwOC8xMS8xMCAyMDozNzo0MyBkYXZpZF93aWxsaWFtcyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkRhdGEgQmluZGluZzwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZSNnZXREYXRhQmluZGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gRGF0YUJpbmRpbmcgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsKLSAgICAvKioKLSAgICAgKiBUaGUgJzxlbT48Yj5KQVhCPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI0pBWEJfVkFMVUUKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBKQVhCKDAsICJKQVhCIiwgImpheGIiKTsKLQotICAgIC8qKgotICAgICAqIFRoZSAnPGVtPjxiPkpBWEI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkpBWEI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjSkFYQgotICAgICAqIEBtb2RlbCBsaXRlcmFsPSJqYXhiIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBWEJfVkFMVUUgPSAwOwotCi0gICAgLyoqCi0gICAgICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkRhdGEgQmluZGluZzwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0YUJpbmRpbmdbXSBWQUxVRVNfQVJSQVkgPQotICAgICAgICBuZXcgRGF0YUJpbmRpbmdbXSB7Ci0gICAgICAgICAgICBKQVhCLAotICAgICAgICB9OwotCi0gICAgLyoqCi0gICAgICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkRhdGEgQmluZGluZzwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PERhdGFCaW5kaW5nPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRhdGEgQmluZGluZzwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERhdGFCaW5kaW5nIGdldChTdHJpbmcgbGl0ZXJhbCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgRGF0YUJpbmRpbmcgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotICAgICAgICAgICAgaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgJzxlbT48Yj5EYXRhIEJpbmRpbmc8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEYXRhQmluZGluZyBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIERhdGFCaW5kaW5nIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgJzxlbT48Yj5EYXRhIEJpbmRpbmc8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEYXRhQmluZGluZyBnZXQoaW50IHZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAodmFsdWUpIHsKLSAgICAgICAgICAgIGNhc2UgSkFYQl9WQUxVRTogcmV0dXJuIEpBWEI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotICAgIC8qKgotICAgICAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIERhdGFCaW5kaW5nKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZhbHVlKCkgewotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKLSAgICAgIHJldHVybiBsaXRlcmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGxpdGVyYWw7Ci0gICAgfQotICAgIAotfSAvL0RhdGFCaW5kaW5nCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0Zyb250ZW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0Zyb250ZW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YTlhMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9Gcm9udGVuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqICRJZDogRnJvbnRlbmQuamF2YSx2IDEuMSAyMDA4LzExLzEwIDIwOjM3OjQzIGRhdmlkX3dpbGxpYW1zIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+RnJvbnRlbmQ8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2UjZ2V0RnJvbnRlbmQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIEZyb250ZW5kIGltcGxlbWVudHMgRW51bWVyYXRvciB7Ci0gICAgLyoqCi0gICAgICogVGhlICc8ZW0+PGI+SkFYV1M8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjSkFYV1NfVkFMVUUKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBKQVhXUygwLCAiSkFYV1MiLCAiamF4d3MiKTsKLQotICAgIC8qKgotICAgICAqIFRoZSAnPGVtPjxiPkpBWFdTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KQVhXUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNKQVhXUwotICAgICAqIEBtb2RlbCBsaXRlcmFsPSJqYXh3cyIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVhXU19WQUxVRSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+RnJvbnRlbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZyb250ZW5kW10gVkFMVUVTX0FSUkFZID0KLSAgICAgICAgbmV3IEZyb250ZW5kW10gewotICAgICAgICAgICAgSkFYV1MsCi0gICAgICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+RnJvbnRlbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxGcm9udGVuZD4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgJzxlbT48Yj5Gcm9udGVuZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZyb250ZW5kIGdldChTdHJpbmcgbGl0ZXJhbCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgRnJvbnRlbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotICAgICAgICAgICAgaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgJzxlbT48Yj5Gcm9udGVuZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZyb250ZW5kIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgRnJvbnRlbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotICAgICAgICAgICAgaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkZyb250ZW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRnJvbnRlbmQgZ2V0KGludCB2YWx1ZSkgewotICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7Ci0gICAgICAgICAgICBjYXNlIEpBWFdTX1ZBTFVFOiByZXR1cm4gSkFYV1M7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotICAgIC8qKgotICAgICAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEZyb250ZW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZhbHVlKCkgewotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKLSAgICAgIHJldHVybiBsaXRlcmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGxpdGVyYWw7Ci0gICAgfQotICAgIAotfSAvL0Zyb250ZW5kCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0phdmEyV1NDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0phdmEyV1NDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNDlkN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9KYXZhMldTQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbDsKLQotLyoqCi0gKiAKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmEyV1NDb250ZXh0IGV4dGVuZHMgQ1hGQ29udGV4dCB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnZW5lcmF0ZWQgV1NETCBpcyB0byBpbmNsdWRlIGEgU09BUCAxLjIgYmluZGluZy4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1NvYXAxMkJpbmRpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc1NvYXAxMkJpbmRpbmcgPGVtPlNvYXAxMiBCaW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgZ2VuZXJhdGVkIFdTREwgaXMgdG8gaW5jbHVkZSBhIFNPQVAgMS4yIGJpbmRpbmcuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U29hcDEyIEJpbmRpbmc8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzU29hcDEyQmluZGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0U29hcDEyQmluZGluZyhib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0byBvdXRwdXQgc2NoZW1hcyB0byBzZXBhcmF0ZSBmaWxlcyBhbmQgdXNlIGltcG9ydHMgdG8KLSAgICAgKiBsb2FkIHRoZW0gaW5zdGVhZCBvZiBpbmxpbmluZyB0aGVtIGludG8gdGhlIHdzZGwuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0dlbmVyYXRlWFNESW1wb3J0cygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVYU0RJbXBvcnRzIDxlbT5HZW5lcmF0ZSBYU0QgSW1wb3J0czwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogT3V0cHV0IHNjaGVtYXMgdG8gc2VwYXJhdGUgZmlsZXMgYW5kIHVzZSBpbXBvcnRzIHRvIGxvYWQgdGhlbSBpbnN0ZWFkIG9mCi0gICAgICogaW5saW5pbmcgdGhlbSBpbnRvIHRoZSB3c2RsLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIFhTRCBJbXBvcnRzPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlWFNESW1wb3J0cygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0R2VuZXJhdGVYU0RJbXBvcnRzKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRvIGdlbmVyYXRlIHdzZGwuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0dlbmVyYXRlV1NETCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVXU0RMIDxlbT5HZW5lcmF0ZSBXU0RMPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTcGVjaWZ5IHRvIGdlbmVyYXRlIHRoZSBXU0RMIGZpbGUuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGUgV1NETDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVdTREwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEdlbmVyYXRlV1NETChib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0byBnZW5lcmF0ZSB3cmFwcGVyIGJlYW5zLgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zIDxlbT5HZW5lcmF0ZSBXcmFwcGVyIEZhdWx0IEJlYW5zPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTcGVjaWZ5IHRvIGdlbmVyYXRlIHRoZSB3cmFwcGVyIGFuZCBmYXVsdCBiZWFuLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIFdyYXBwZXIgRmF1bHQgQmVhbnM8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0R2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyhib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgQW5ub3RhdGlvbiBQcm9jZXNzaW5nIFRvb2wgKEFQVCkgaXMgZW5hYmxlZC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkIDxlbT5Bbm5vdGF0aW9uIFByb2Nlc3NpbmcgRW5hYmxlZDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0IHRvIGVuYWJsZSB0aGUgQW5ub3RhdGlvbiBQcm9jZXNzaW5nIFRvb2wgKEFQVCkgZXh0ZW5zaW9uLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFubm90YXRpb24gUHJvY2Vzc2luZyBFbmFibGVkPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0QW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSA8Y29kZT5AV2ViTWV0aG9kPC9jb2RlPiBhbm5vdGF0aW9uIGdlbmVyYXRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0LgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24gPGVtPkdlbmVyYXRlIFdlYiBNZXRob2QgQW5ub3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgZW5hYmxlbWVudCBvZiB0aGUgPGNvZGU+QFdlYk1ldGhvZDwvY29kZT4gYW5ub3RhdGlvbiBnZW5lcmF0aW9uLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIFdlYiBNZXRob2QgQW5ub3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbihib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgPGNvZGU+QFdlYlBhcmFtPC9jb2RlPiBhbm5vdGF0aW9uIGdlbmVyYXRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0LgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uIDxlbT5HZW5lcmF0ZSBXZWIgUGFyYW0gQW5ub3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgZW5hYmxlbWVudCBvZiB0aGUgPGNvZGU+QFdlYlBhcmFtPC9jb2RlPiBhbm5vdGF0aW9uIGdlbmVyYXRpb24uCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGUgV2ViIFBhcmFtIEFubm90YXRpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSA8Y29kZT5AUmVxdWVzdFdyYXBwZXI8L2NvZGU+IGFubm90YXRpb24gZ2VuZXJhdGlvbiBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24gPGVtPkdlbmVyYXRlIFJlcXVlc3QgV3JhcHBlciBBbm5vdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBlbmFibGVtZW50IG9mIHRoZSA8Y29kZT5AUmVxdWVzdFdyYXBwZXI8L2NvZGU+IGFubm90YXRpb24gZ2VuZXJhdGlvbi4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZSBSZXF1ZXN0IFdyYXBwZXIgQW5ub3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0R2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIDxjb2RlPkBSZXNwb25zZVdyYXBwZXI8L2NvZGU+IGFubm90YXRpb24gZ2VuZXJhdGlvbiBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uIDxlbT5HZW5lcmF0ZSBSZXNwb25zZSBXcmFwcGVyIEFubm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIGVuYWJsZW1lbnQgb2YgdGhlIDxjb2RlPkBSZXNwb25zZVdyYXBwZXI8L2NvZGU+IGFubm90YXRpb24gZ2VuZXJhdGlvbi4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZSBSZXNwb25zZSBXcmFwcGVyIEFubm90YXRpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oYm9vbGVhbiB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0phdmEyV1NEYXRhTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvSmF2YTJXU0RhdGFNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2Y2YzY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvSmF2YTJXU0RhdGFNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotCi0vKioKLSAqIAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YTJXU0RhdGFNb2RlbCBleHRlbmRzIENYRkRhdGFNb2RlbCwgSmF2YTJXU0NvbnRleHQgewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNsYXNzcGF0aCBzZWFyY2hlZCB3aGVuIHByb2Nlc3NpbmcuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldENsYXNzcGF0aCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0Q2xhc3NwYXRoIDxlbT5DbGFzc3BhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIGNsYXNzcGF0aCB0byBzZWFyY2ggd2hlbiBwcm9jZXNzaW5nLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzcGF0aDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0Q2xhc3NwYXRoKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRDbGFzc3BhdGgoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEphdmEgc3RhcnRpbmcgcG9pbnQgYXJ0aWZhY3QuIFRoaXMgY2FuIGJlIGVpdGhlciBhIEphdmEgQ2xhc3Mgb3IgSW50ZXJmYWNlLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRKYXZhU3RhcnRpbmdQb2ludCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0SmF2YVN0YXJ0aW5nUG9pbnQgPGVtPkphdmEgU3RhcnRpbmcgUG9pbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIEphdmEgc3RhcnRpbmcgcG9pbnQgYXJ0aWZhY3QuIEl0IG1heSBiZSBhIEphdmEgQ2xhc3Mgb3IgSW50ZXJmYWNlLgotICAgICAqIEBzZWUgI3NldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpCi0gICAgICogQHNlZSAjc2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YSBTdGFydGluZyBQb2ludDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEphdmFTdGFydGluZ1BvaW50KFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgc3RhcnRpbmcgcG9pbnQgaXMgYSBKYXZhIENsYXNzIHRoaXMgdHJhY2tzIHdoZXRoZXIgdG8gdXNlIGFuIFNFSSBoYXMgYmVlbiBzZWxlY3RlZC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBib29sZWFuIGlzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2lzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIDxlbT5Vc2UgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVzZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZShib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIElmIHRoZSBzdGFydGluZyBwb2ludCBpcyBhIEphdmEgQ2xhc3MgdGhpcyB0cmFja3Mgd2hldGhlciB0byBvcHRpb24gdG8KLSAgICAgKiBleHRyYWN0IHRoZSBTRUkgaGFzIGJlZW4gc2VsZWN0ZWQuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0V4dHJhY3RJbnRlcmZhY2UoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2lzRXh0cmFjdEludGVyZmFjZSA8ZW0+RXh0cmFjdCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIG9wdGlvbiB0byBleHRyYWN0IHRoZSBTRUkgZnJvbSB0aGUgSmF2YSBjbGFzcyBzdGFydGluZyBwb2ludC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRyYWN0IEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNFeHRyYWN0SW50ZXJmYWNlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRFeHRyYWN0SW50ZXJmYWNlKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmV3IFNFSSBuYW1lLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtYXAgb2YgdGhlIG1ldGhvZHMgdG8gdXNlIGFuZCB0aGVpciBhbm5vdGF0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBNYXA8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+IGdldE1ldGhvZE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0TWV0aG9kTWFwIDxlbT5NZXRob2QgTWFwPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBtYXAgb2YgdGhlIG1ldGhvZHMgdG8gdXNlIGFuZCB0aGUgbWV0aG9kIGFubm90YXRpb25zLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBNYXA8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldE1ldGhvZE1hcCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0TWV0aG9kTWFwKE1hcDxJTWV0aG9kLCBNYXA8U3RyaW5nLCBCb29sZWFuPj4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG1hcCBvZiBlbmFibGVkIGRlZmF1bHQgbWV0aG9kIGFubm90YXRpb25zCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgTWFwPFN0cmluZywgQm9vbGVhbj4gZ2V0QW5ub3RhdGlvbk1hcCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldEFubm90YXRpb25NYXAgPGVtPkFubm90YXRpb24gTWFwPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIGEgbWFwIG9mIHRoZSBlbmFibGVkIG1ldGhvZCBhbm5vdGF0aW9ucy4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Bbm5vdGF0aW9uIE1hcDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0QW5ub3RhdGlvbk1hcCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0QW5ub3RhdGlvbk1hcChNYXA8U3RyaW5nLCBCb29sZWFuPiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGdlbmVyYXRlZCBzb3VyY2UgZmlsZXMgYXJlIHBsYWNlZC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0U291cmNlRGlyZWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRTb3VyY2VEaXJlY3RvcnkgPGVtPlNvdXJjZSBEaXJlY3Rvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcyBhcmUgcGxhY2VkLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvdXJjZSBEaXJlY3Rvcnk8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFNvdXJjZURpcmVjdG9yeSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0U291cmNlRGlyZWN0b3J5KFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwb3J0IG5hbWUgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIHdzZGwuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldFBvcnROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRQb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBwb3J0IG5hbWUgdG8gdXNlIGluIHRoZSBnZW5lcmF0ZWQgd3NkbC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFBvcnROYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRQb3J0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL1dTREwySmF2YUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvV1NETDJKYXZhQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTZhMTZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvV1NETDJKYXZhQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbDsKLQotLyoqCi0gKiAKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdTREwySmF2YUNvbnRleHQgZXh0ZW5kcyBDWEZDb250ZXh0IHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0byBnZW5lcmF0ZSBzdGFydGluZyBwb2ludCBjb2RlIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvYmplY3QuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbiA8ZW0+R2VuZXJhdGUgSW1wbGVtZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGdlbmVyYXRlIHN0YXJ0aW5nIHBvaW50IGNvZGUgZm9yIGFuIGltcGxlbWVudGF0aW9uIG9iamVjdC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZSBJbXBsZW1lbnRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRHZW5lcmF0ZUltcGxlbWVudGF0aW9uKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHByb2Nlc3Npbmcgb2YgaW1wbGljaXQgU09BUCBoZWFkZXJzIChpLmUuIFNPQVAgaGVhZGVycwotICAgICAqIGRlZmluZWQgaW4gdGhlIHdzZGw6YmluZGluZyBidXQgbm90IHdzZGw6cG9ydFR5cGUgc2VjdGlvbi4pIGlzIGVuYWJsZWQuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNQcm9jZXNzU09BUEhlYWRlcnMoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzUHJvY2Vzc1NPQVBIZWFkZXJzIDxlbT5Qcm9jZXNzIFNPQVAgSGVhZGVyczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBwcm9jZXNzaW5nIG9mIGltcGxpY2l0IFNPQVAgaGVhZGVycyAoaS5lLiBTT0FQCi0gICAgICogaGVhZGVycyBkZWZpbmVkIGluIHRoZSB3c2RsOmJpbmRpbmcgYnV0IG5vdCB3c2RsOnBvcnRUeXBlIHNlY3Rpb24uKQotICAgICAqIERlZmF1bHQgaXMgZmFsc2UuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzcyBTT0FQIEhlYWRlcnM8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzUHJvY2Vzc1NPQVBIZWFkZXJzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRQcm9jZXNzU09BUEhlYWRlcnMoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxvYWRpbmcgb2YgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIHBhY2thZ2UgbmFtZSBtYXBwaW5nIGlzIGVuYWJsZWQuIAotICAgICAqIERlZmF1bHQgaXMgdHJ1ZS4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcgPGVtPkxvYWQgRGVmYXVsdCBOYW1lc3BhY2UgUGFja2FnZSBOYW1lIE1hcHBpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIEVuYWJsZXMgdGhlIHVzZSBvZiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgcGFja2FnZSBuYW1lIG1hcHBpbmcuCi0gICAgICogRGVmYXVsdCBpcyB0cnVlLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvYWQgRGVmYXVsdCBOYW1lc3BhY2UgUGFja2FnZSBOYW1lIE1hcHBpbmc8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldExvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBsb2FkaW5nIG9mIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzIG5hbWVzcGFjZSBtYXBwaW5nIGlzIGVuYWJsZWQuCi0gICAgICogRGVmYXVsdCBpcyB0cnVlLgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyA8ZW0+TG9hZCBEZWZhdWx0IEV4Y2x1ZGVzIE5hbWVwc2FjZSBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBFbmFibGVzIHRoZSB1c2Ugb2YgdGhlIGRlZmF1bHQgZXhjbHVkZXMgbmFtZXNwYWNlIG1hcHBpbmcuCi0gICAgICogRGVmYXVsdCBpcyB0cnVlLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvYWQgRGVmYXVsdCBFeGNsdWRlcyBOYW1lcHNhY2UgTWFwcGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdG8gdmFsaWRhdGUgdGhlIFdTREwgYmVmb3JlIGdlbmVyYXRpbmcgdGhlIGNvZGUuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1ZhbGlkYXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1ZhbGlkYXRlIDxlbT5WYWxpZGF0ZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogRW5hYmxlcyBXU0RMIHZhbGlkYXRpb24gYmVmb3JlIGNvZGUgZ2VuZXJhdGlvbi4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWxpZGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNWYWxpZGF0ZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0VmFsaWRhdGUoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB3c2RsIHZlcnNpb24gLkRlZmF1bHQgaXMgV1NETDEuMS4gQ3VycmVudGx5IHN1cHBvcnRzIG9ubHkgV1NETDEuMSB2ZXJzaW9uLgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSIxLjEiCi0gICAgICovCi0gICAgU3RyaW5nIGdldFdzZGxWZXJzaW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNnZXRXc2RsVmVyc2lvbiA8ZW0+V3NkbCBWZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIFZlcnNpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFdzZGxWZXJzaW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRXc2RsVmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSB0b29sIGlzIHNldCB0byBnZW5lcmF0ZSBkZWZhdWx0IHZhbGVzIGZvciB0aGUKLSAgICAgKiBnZW5lcmF0ZWQgY2xpZW50IGFuZCB0aGUgZ2VuZXJhdGVkIGltcGxlbWVudGF0aW9uLgotICAgICAqCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1VzZURlZmF1bHRWYWx1ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzVXNlRGVmYXVsdFZhbHVlcyA8ZW0+VXNlIERlZmF1bHQgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBHZW5lcmF0ZSBkZWZhdWx0IHZhbGVzIGZvciB0aGUgZ2VuZXJhdGVkIGNsaWVudCBhbmQgdGhlIGdlbmVyYXRlZCBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2UgRGVmYXVsdCBWYWx1ZXM8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzVXNlRGVmYXVsdFZhbHVlcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0VXNlRGVmYXVsdFZhbHVlcyhib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgZGlyZWN0bHkgdG8KLSAgICAgKiB0aGUgWEpDIHdoZW4gdGhlIEpBWEIgYmluZGluZyBpcyBiZWluZyB1c2VkLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRYamNBcmdzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNnZXRYamNBcmdzIDxlbT5YamMgQXJnczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WGpjIEFyZ3M8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFhqY0FyZ3MoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFhqY0FyZ3MoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgdG9vbCBpcyBzZXQgdG8gdXNlIHRoZSBDWEYgcHJvcHJpZXRhcnkgV1MtQWRkcmVzc2luZyAKLSAgICAgKiB0eXBlIGluc3RlYWQgb2YgdGhlIEpBWC1XUyAyLjEgY29tcGxpYW50IG1hcHBpbmcuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgYm9vbGVhbiBpc05vQWRkcmVzc0JpbmRpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzTm9BZGRyZXNzQmluZGluZyA8ZW0+Tm8gQWRkcmVzcyBCaW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBJbnN0cnVjdHMgdGhlIHRvb2wgdG8gdXNlIHRoZSBDWEYgcHJvcHJpZXRhcnkgV1MtQWRkcmVzc2luZyB0eXBlIAotICAgICAqIGluc3RlYWQgb2YgdGhlIEpBWC1XUyAyLjEgY29tcGxpYW50IG1hcHBpbmcuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm8gQWRkcmVzcyBCaW5kaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc05vQWRkcmVzc0JpbmRpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldE5vQWRkcmVzc0JpbmRpbmcoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgWEpDIHdpbGwgaW5pdGlhbGl6ZSBmaWVsZHMgbWFwcGVkIGZyb20gZWxlbWVudHMgd2l0aCB0aGVpciBkZWZhdWx0IHZhbHVlcy4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBib29sZWFuIGlzWGpjVXNlRGVmYXVsdFZhbHVlcygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNVc2VEZWZhdWx0VmFsdWVzIDxlbT5YamMgVXNlIERlZmF1bHQgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5YamMgVXNlIERlZmF1bHQgVmFsdWVzPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc1hqY1VzZURlZmF1bHRWYWx1ZXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFhqY1VzZURlZmF1bHRWYWx1ZXMoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgWEpDIHdpbGwgZ2VuZXJhdGUgYSA8Y29kZT50b1N0cmluZygpPC9jb2RlPiBtZXRob2QuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1hqY1RvU3RyaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY1RvU3RyaW5nIDxlbT5YamMgVG8gU3RyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5YamMgVG8gU3RyaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc1hqY1RvU3RyaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRYamNUb1N0cmluZyhib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBtdWx0aSBsaW5lIG91dHB1dCBpcyBlbmFibGVkIGZvciA8Y29kZT50b1N0cmluZygpPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBib29sZWFuIGlzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjVG9TdHJpbmdNdWx0aUxpbmUgPGVtPlhqYyBUbyBTdHJpbmcgTXVsdGkgTGluZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WGpjIFRvIFN0cmluZyBNdWx0aSBMaW5lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRYamNUb1N0cmluZ011bHRpTGluZShib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0ZXJzZSBvdXRwdXQgaXMgZW5hYmxlZCBmb3IgPGNvZGU+dG9TdHJpbmcoKTwvY29kZT4uCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1hqY1RvU3RyaW5nU2ltcGxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY1RvU3RyaW5nU2ltcGxlIDxlbT5YamMgVG8gU3RyaW5nIFNpbXBsZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WGpjIFRvIFN0cmluZyBTaW1wbGU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzWGpjVG9TdHJpbmdTaW1wbGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFhqY1RvU3RyaW5nU2ltcGxlKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHNvdXJjZSBsb2NhdGlvbiBzdXBwb3J0IGlzIGVuYWJsZWQuCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1hqY0xvY2F0b3IoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjTG9jYXRvciA8ZW0+WGpjIExvY2F0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlhqYyBMb2NhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc1hqY0xvY2F0b3IoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFhqY0xvY2F0b3IoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIFhKQyB3aWxsIGdlbmVyYXRlIGFjY2Vzc29yIG1ldGhvZHMgd2l0aCAnc3luY2hyb25pemVkJyBrZXl3b3JkLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIGJvb2xlYW4gaXNYamNTeW5jTWV0aG9kcygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNTeW5jTWV0aG9kcyA8ZW0+WGpjIFN5bmMgTWV0aG9kczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WGpjIFN5bmMgTWV0aG9kczwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNYamNTeW5jTWV0aG9kcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0WGpjU3luY01ldGhvZHMoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIFhKQyB3aWxsIG1hcmsgdGhlIGNvZGUgYXMgZ2VuZXJhdGVkIHVzaW5nIHRoZSBhbm5vdGF0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBib29sZWFuIGlzWGpjTWFya0dlbmVyYXRlZCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNNYXJrR2VuZXJhdGVkIDxlbT5YamMgTWFyayBHZW5lcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlhqYyBNYXJrIEdlbmVyYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNYamNNYXJrR2VuZXJhdGVkKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRYamNNYXJrR2VuZXJhdGVkKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGVwaXNvZGUgZmlsZSBsb2NhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0WGpjRXBpc29kZUZpbGUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2dldFhqY0VwaXNvZGVGaWxlIDxlbT5YamMgRXBpc29kZSBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5YamMgRXBpc29kZSBGaWxlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRYamNFcGlzb2RlRmlsZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0WGpjRXBpc29kZUZpbGUoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF1dG8gTmFtZSBSZXNvbHV0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdXRvIE5hbWUgUmVzb2x1dGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRvIE5hbWUgUmVzb2x1dGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjc2V0QXV0b05hbWVSZXNvbHV0aW9uKGJvb2xlYW4pCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZSNnZXRXU0RMMkphdmFDb250ZXh0X0F1dG9OYW1lUmVzb2x1dGlvbigpCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBib29sZWFuIGlzQXV0b05hbWVSZXNvbHV0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc0F1dG9OYW1lUmVzb2x1dGlvbiA8ZW0+QXV0byBOYW1lIFJlc29sdXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dG8gTmFtZSBSZXNvbHV0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc0F1dG9OYW1lUmVzb2x1dGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0QXV0b05hbWVSZXNvbHV0aW9uKGJvb2xlYW4gdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9XU0RMMkphdmFEYXRhTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvV1NETDJKYXZhRGF0YU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMTg5YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9XU0RMMkphdmFEYXRhTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdTREwySmF2YURhdGFNb2RlbCBleHRlbmRzIENYRkRhdGFNb2RlbCwgV1NETDJKYXZhQ29udGV4dCB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGFja2FnZSBuYW1lcyB0byB1c2UgZm9yIHRoZSBnZW5lcmF0ZWQgY29kZS4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEluY2x1ZGVkTmFtZXNwYWNlcygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCNnZXRJbmNsdWRlZE5hbWVzcGFjZXMgPGVtPkluY2x1ZGVkIE5hbWVzcGFjZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNwZWNpZmllcyB6ZXJvLCBvciBtb3JlLCBwYWNrYWdlIG5hbWVzIHRvIHVzZSBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluY2x1ZGVkIE5hbWVzcGFjZXM8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldEluY2x1ZGVkTmFtZXNwYWNlcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0SW5jbHVkZWROYW1lc3BhY2VzKE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIExpc3Qgb2YgdGhlIEpBWFdTIG9yIEpBWEIgYmluZGluZyBmaWxlcyB1c2VkLCBpZiBhbnkuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgRUxpc3Q8U3RyaW5nPiBnZXRCaW5kaW5nRmlsZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGphdmEgcGFja2FnZSB0byBleGNsdWRlZCBuYW1lc3BhY2UgbWFwcGluZ3MuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRFeGNsdWRlZE5hbWVzcGFjZXMoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwjZ2V0RXhjbHVkZWROYW1lc3BhY2VzIDxlbT5FeGNsdWRlZCBOYW1lc3BhY2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBJZ25vcmUgdGhlIHNwZWNpZmllZCBXU0RMIHNjaGVtYSBuYW1lc3BhY2Ugd2hlbiBnZW5lcmF0aW5nIGNvZGUuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZWQgTmFtZXNwYWNlczwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0RXhjbHVkZWROYW1lc3BhY2VzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRFeGNsdWRlZE5hbWVzcGFjZXMoTWFwPFN0cmluZywgU3RyaW5nPiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjYXRhbG9nIGZpbGUgdXNlZCB0byBtYXAgdGhlIGltcG9ydGVkIHdzZGwvc2NoZW1hCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldENhdGFsb2dGaWxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsI2dldENhdGFsb2dGaWxlIDxlbT5DYXRhbG9nIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNwZWNpZnkgY2F0YWxvZyBmaWxlIHRvIG1hcCB0aGUgaW1wb3J0ZWQgd3NkbC9zY2hlbWEuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0YWxvZyBGaWxlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRDYXRhbG9nRmlsZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0Q2F0YWxvZ0ZpbGUoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBKYXZhIFNvdXJjZSBEaXJlY3RvcnkgaW50byB3aGljaCB0aGUgZmlsZXMgYXJlIGdlbmVyYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SmF2YVNvdXJjZUZvbGRlcigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCNnZXRKYXZhU291cmNlRm9sZGVyIDxlbT5KYXZhIFNvdXJjZSBGb2xkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBKYXZhIFNvdXJjZSBEaXJlY3RvcnkgaW50byB3aGljaCB0aGUgZmlsZXMgYXJlIGdlbmVyYXRlZC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIFNvdXJjZSBGb2xkZXI8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldEphdmFTb3VyY2VGb2xkZXIoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEphdmFTb3VyY2VGb2xkZXIoU3RyaW5nIHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL0NYRkRhdGFNb2RlbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9DWEZEYXRhTW9kZWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYTlkYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL0NYRkRhdGFNb2RlbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NzUgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogJElkOiBDWEZEYXRhTW9kZWxJbXBsLmphdmEsdiAxLjMgMjAwOS8wMS8yOSAyMTo0Njo1OSBzY2xhcmtlIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRGF0YUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkZyb250ZW5kOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EYXRhIE1vZGVsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldEN4ZlJ1bnRpbWVMb2NhdGlvbiA8ZW0+Q3hmIFJ1bnRpbWUgTG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0Q3hmUnVudGltZUVkaXRpb24gPGVtPkN4ZiBSdW50aW1lIEVkaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0Q3hmUnVudGltZVZlcnNpb24gPGVtPkN4ZiBSdW50aW1lIFZlcnNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjaXNWZXJib3NlIDxlbT5WZXJib3NlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2lzR2VuZXJhdGVBbnRCdWlsZEZpbGUgPGVtPkdlbmVyYXRlIEFudCBCdWlsZCBGaWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2lzR2VuZXJhdGVDbGllbnQgPGVtPkdlbmVyYXRlIENsaWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNpc0dlbmVyYXRlU2VydmVyIDxlbT5HZW5lcmF0ZSBTZXJ2ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0RGF0YWJpbmRpbmcgPGVtPkRhdGFiaW5kaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldEZyb250ZW5kIDxlbT5Gcm9udGVuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNpc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCA8ZW0+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2lzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyIDxlbT5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0UHJvamVjdE5hbWUgPGVtPlByb2plY3QgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRSZXNvdXJjZURpcmVjdG9yeSA8ZW0+UmVzb3VyY2UgRGlyZWN0b3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldENsYXNzRGlyZWN0b3J5IDxlbT5DbGFzcyBEaXJlY3Rvcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0V3NkbEZpbGVOYW1lIDxlbT5Xc2RsIEZpbGUgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRXc2RsVVJMIDxlbT5Xc2RsIFVSTDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRDb25maWdXc2RsTG9jYXRpb24gPGVtPkNvbmZpZyBXc2RsIExvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSA8ZW0+RnVsbHkgUXVhbGlmaWVkIEphdmEgQ2xhc3MgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lIDxlbT5GdWxseSBRdWFsaWZpZWQgSmF2YSBJbnRlcmZhY2UgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRDb25maWdJZCA8ZW0+Q29uZmlnIElkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRFbmRwb2ludE5hbWUgPGVtPkVuZHBvaW50IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0U2VydmljZU5hbWUgPGVtPlNlcnZpY2UgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRXc2RsRGVmaW5pdGlvbiA8ZW0+V3NkbCBEZWZpbml0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldFdzZGxMb2NhdGlvbiA8ZW0+V3NkbCBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENYRkRhdGFNb2RlbEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIENYRkRhdGFNb2RlbCB7Ci0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN4ZlJ1bnRpbWVMb2NhdGlvbigpIDxlbT5DeGYgUnVudGltZSBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0Q3hmUnVudGltZUxvY2F0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDWEZfUlVOVElNRV9MT0NBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDeGZSdW50aW1lTG9jYXRpb24oKSA8ZW0+Q3hmIFJ1bnRpbWUgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEN4ZlJ1bnRpbWVMb2NhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjeGZSdW50aW1lTG9jYXRpb24gPSBDWEZfUlVOVElNRV9MT0NBVElPTl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDeGZSdW50aW1lRWRpdGlvbigpIDxlbT5DeGYgUnVudGltZSBFZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRDeGZSdW50aW1lRWRpdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1hGX1JVTlRJTUVfRURJVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDeGZSdW50aW1lRWRpdGlvbigpIDxlbT5DeGYgUnVudGltZSBFZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRDeGZSdW50aW1lRWRpdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjeGZSdW50aW1lRWRpdGlvbiA9IENYRl9SVU5USU1FX0VESVRJT05fRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3hmUnVudGltZVZlcnNpb24oKSA8ZW0+Q3hmIFJ1bnRpbWUgVmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0Q3hmUnVudGltZVZlcnNpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENYRl9SVU5USU1FX1ZFUlNJT05fRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3hmUnVudGltZVZlcnNpb24oKSA8ZW0+Q3hmIFJ1bnRpbWUgVmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0Q3hmUnVudGltZVZlcnNpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgY3hmUnVudGltZVZlcnNpb24gPSBDWEZfUlVOVElNRV9WRVJTSU9OX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVmVyYm9zZSgpIDxlbT5WZXJib3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1ZlcmJvc2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJCT1NFX0VERUZBVUxUID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVmVyYm9zZSgpIDxlbT5WZXJib3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1ZlcmJvc2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHZlcmJvc2UgPSBWRVJCT1NFX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVBbnRCdWlsZEZpbGUoKSA8ZW0+R2VuZXJhdGUgQW50IEJ1aWxkIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVBbnRCdWlsZEZpbGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBHRU5FUkFURV9BTlRfQlVJTERfRklMRV9FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZUFudEJ1aWxkRmlsZSgpIDxlbT5HZW5lcmF0ZSBBbnQgQnVpbGQgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZUFudEJ1aWxkRmlsZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVBbnRCdWlsZEZpbGUgPSBHRU5FUkFURV9BTlRfQlVJTERfRklMRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlQ2xpZW50KCkgPGVtPkdlbmVyYXRlIENsaWVudDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZUNsaWVudCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEdFTkVSQVRFX0NMSUVOVF9FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZUNsaWVudCgpIDxlbT5HZW5lcmF0ZSBDbGllbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVDbGllbnQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlQ2xpZW50ID0gR0VORVJBVEVfQ0xJRU5UX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVTZXJ2ZXIoKSA8ZW0+R2VuZXJhdGUgU2VydmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlU2VydmVyKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gR0VORVJBVEVfU0VSVkVSX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlU2VydmVyKCkgPGVtPkdlbmVyYXRlIFNlcnZlcjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVNlcnZlcigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVTZXJ2ZXIgPSBHRU5FUkFURV9TRVJWRVJfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YWJpbmRpbmcoKSA8ZW0+RGF0YWJpbmRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldERhdGFiaW5kaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERhdGFCaW5kaW5nIERBVEFCSU5ESU5HX0VERUZBVUxUID0gRGF0YUJpbmRpbmcuSkFYQjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERhdGFiaW5kaW5nKCkgPGVtPkRhdGFiaW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXREYXRhYmluZGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERhdGFCaW5kaW5nIGRhdGFiaW5kaW5nID0gREFUQUJJTkRJTkdfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnJvbnRlbmQoKSA8ZW0+RnJvbnRlbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEZyb250ZW5kKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEZyb250ZW5kIEZST05URU5EX0VERUZBVUxUID0gRnJvbnRlbmQuSkFYV1M7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGcm9udGVuZCgpIDxlbT5Gcm9udGVuZDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RnJvbnRlbmQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBGcm9udGVuZCBmcm9udGVuZCA9IEZST05URU5EX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCkgPGVtPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBVU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFRfRURFRkFVTFQgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSA8ZW0+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0ID0gVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCkgPGVtPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVJfRURFRkFVTFQgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKSA8ZW0+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyID0gRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3ROYW1lKCkgPGVtPlByb2plY3QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0UHJvamVjdE5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9qZWN0TmFtZSgpIDxlbT5Qcm9qZWN0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFByb2plY3ROYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb2plY3ROYW1lID0gUFJPSkVDVF9OQU1FX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlRGlyZWN0b3J5KCkgPGVtPlJlc291cmNlIERpcmVjdG9yeTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0UmVzb3VyY2VEaXJlY3RvcnkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0RJUkVDVE9SWV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZURpcmVjdG9yeSgpIDxlbT5SZXNvdXJjZSBEaXJlY3Rvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFJlc291cmNlRGlyZWN0b3J5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlRGlyZWN0b3J5ID0gUkVTT1VSQ0VfRElSRUNUT1JZX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzRGlyZWN0b3J5KCkgPGVtPkNsYXNzIERpcmVjdG9yeTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0Q2xhc3NEaXJlY3RvcnkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0RJUkVDVE9SWV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc0RpcmVjdG9yeSgpIDxlbT5DbGFzcyBEaXJlY3Rvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldENsYXNzRGlyZWN0b3J5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzRGlyZWN0b3J5ID0gQ0xBU1NfRElSRUNUT1JZX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxGaWxlTmFtZSgpIDxlbT5Xc2RsIEZpbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0V3NkbEZpbGVOYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0ZJTEVfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsRmlsZU5hbWUoKSA8ZW0+V3NkbCBGaWxlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFdzZGxGaWxlTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyB3c2RsRmlsZU5hbWUgPSBXU0RMX0ZJTEVfTkFNRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsVVJMKCkgPGVtPldzZGwgVVJMPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRXc2RsVVJMKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVSTCBXU0RMX1VSTF9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsVVJMKCkgPGVtPldzZGwgVVJMPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRXc2RsVVJMKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVVJMIHdzZGxVUkwgPSBXU0RMX1VSTF9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25maWdXc2RsTG9jYXRpb24oKSA8ZW0+Q29uZmlnIFdzZGwgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldENvbmZpZ1dzZGxMb2NhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX1dTRExfTE9DQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uZmlnV3NkbExvY2F0aW9uKCkgPGVtPkNvbmZpZyBXc2RsIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRDb25maWdXc2RsTG9jYXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgY29uZmlnV3NkbExvY2F0aW9uID0gQ09ORklHX1dTRExfTE9DQVRJT05fRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkgPGVtPkZ1bGx5IFF1YWxpZmllZCBKYXZhIENsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKSA8ZW0+RnVsbHkgUXVhbGlmaWVkIEphdmEgQ2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSA9IEZVTExZX1FVQUxJRklFRF9KQVZBX0NMQVNTX05BTUVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpIDxlbT5GdWxseSBRdWFsaWZpZWQgSmF2YSBJbnRlcmZhY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpIDxlbT5GdWxseSBRdWFsaWZpZWQgSmF2YSBJbnRlcmZhY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBmdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lID0gRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uZmlnSWQoKSA8ZW0+Q29uZmlnIElkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRDb25maWdJZCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0lEX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbmZpZ0lkKCkgPGVtPkNvbmZpZyBJZDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0Q29uZmlnSWQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgY29uZmlnSWQgPSBDT05GSUdfSURfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXROYW1lc3BhY2UoKSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5kcG9pbnROYW1lKCkgPGVtPkVuZHBvaW50IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEVuZHBvaW50TmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EUE9JTlRfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbmRwb2ludE5hbWUoKSA8ZW0+RW5kcG9pbnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RW5kcG9pbnROYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGVuZHBvaW50TmFtZSA9IEVORFBPSU5UX05BTUVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZU5hbWUoKSA8ZW0+U2VydmljZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRTZXJ2aWNlTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VOYW1lKCkgPGVtPlNlcnZpY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0U2VydmljZU5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgc2VydmljZU5hbWUgPSBTRVJWSUNFX05BTUVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbERlZmluaXRpb24oKSA8ZW0+V3NkbCBEZWZpbml0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRXc2RsRGVmaW5pdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEZWZpbml0aW9uIFdTRExfREVGSU5JVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsRGVmaW5pdGlvbigpIDxlbT5Xc2RsIERlZmluaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFdzZGxEZWZpbml0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiA9IFdTRExfREVGSU5JVElPTl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsTG9jYXRpb24oKSA8ZW0+V3NkbCBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0V3NkbExvY2F0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0xPQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxMb2NhdGlvbigpIDxlbT5Xc2RsIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRXc2RsTG9jYXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgd3NkbExvY2F0aW9uID0gV1NETF9MT0NBVElPTl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBDWEZEYXRhTW9kZWxJbXBsKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotICAgICAgICByZXR1cm4gQ1hGUGFja2FnZS5MaXRlcmFscy5DWEZfREFUQV9NT0RFTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEN4ZlJ1bnRpbWVMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGN4ZlJ1bnRpbWVMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDeGZSdW50aW1lTG9jYXRpb24oU3RyaW5nIG5ld0N4ZlJ1bnRpbWVMb2NhdGlvbikgewotICAgICAgICBTdHJpbmcgb2xkQ3hmUnVudGltZUxvY2F0aW9uID0gY3hmUnVudGltZUxvY2F0aW9uOwotICAgICAgICBjeGZSdW50aW1lTG9jYXRpb24gPSBuZXdDeGZSdW50aW1lTG9jYXRpb247Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NYRl9SVU5USU1FX0xPQ0FUSU9OLCBvbGRDeGZSdW50aW1lTG9jYXRpb24sIGN4ZlJ1bnRpbWVMb2NhdGlvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3hmUnVudGltZUVkaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBjeGZSdW50aW1lRWRpdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDeGZSdW50aW1lRWRpdGlvbihTdHJpbmcgbmV3Q3hmUnVudGltZUVkaXRpb24pIHsKLSAgICAgICAgU3RyaW5nIG9sZEN4ZlJ1bnRpbWVFZGl0aW9uID0gY3hmUnVudGltZUVkaXRpb247Ci0gICAgICAgIGN4ZlJ1bnRpbWVFZGl0aW9uID0gbmV3Q3hmUnVudGltZUVkaXRpb247Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NYRl9SVU5USU1FX0VESVRJT04sIG9sZEN4ZlJ1bnRpbWVFZGl0aW9uLCBjeGZSdW50aW1lRWRpdGlvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3hmUnVudGltZVZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBjeGZSdW50aW1lVmVyc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDeGZSdW50aW1lVmVyc2lvbihTdHJpbmcgbmV3Q3hmUnVudGltZVZlcnNpb24pIHsKLSAgICAgICAgU3RyaW5nIG9sZEN4ZlJ1bnRpbWVWZXJzaW9uID0gY3hmUnVudGltZVZlcnNpb247Ci0gICAgICAgIGN4ZlJ1bnRpbWVWZXJzaW9uID0gbmV3Q3hmUnVudGltZVZlcnNpb247Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NYRl9SVU5USU1FX1ZFUlNJT04sIG9sZEN4ZlJ1bnRpbWVWZXJzaW9uLCBjeGZSdW50aW1lVmVyc2lvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmVyYm9zZSgpIHsKLSAgICAgICAgcmV0dXJuIHZlcmJvc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIG5ld1ZlcmJvc2UpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRWZXJib3NlID0gdmVyYm9zZTsKLSAgICAgICAgdmVyYm9zZSA9IG5ld1ZlcmJvc2U7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1ZFUkJPU0UsIG9sZFZlcmJvc2UsIHZlcmJvc2UpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlQW50QnVpbGRGaWxlKCkgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVBbnRCdWlsZEZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVBbnRCdWlsZEZpbGUoYm9vbGVhbiBuZXdHZW5lcmF0ZUFudEJ1aWxkRmlsZSkgewotICAgICAgICBib29sZWFuIG9sZEdlbmVyYXRlQW50QnVpbGRGaWxlID0gZ2VuZXJhdGVBbnRCdWlsZEZpbGU7Ci0gICAgICAgIGdlbmVyYXRlQW50QnVpbGRGaWxlID0gbmV3R2VuZXJhdGVBbnRCdWlsZEZpbGU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFLCBvbGRHZW5lcmF0ZUFudEJ1aWxkRmlsZSwgZ2VuZXJhdGVBbnRCdWlsZEZpbGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlQ2xpZW50KCkgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVDbGllbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVDbGllbnQoYm9vbGVhbiBuZXdHZW5lcmF0ZUNsaWVudCkgewotICAgICAgICBib29sZWFuIG9sZEdlbmVyYXRlQ2xpZW50ID0gZ2VuZXJhdGVDbGllbnQ7Ci0gICAgICAgIGdlbmVyYXRlQ2xpZW50ID0gbmV3R2VuZXJhdGVDbGllbnQ7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0NMSUVOVCwgb2xkR2VuZXJhdGVDbGllbnQsIGdlbmVyYXRlQ2xpZW50KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVNlcnZlcigpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlU2VydmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlU2VydmVyKGJvb2xlYW4gbmV3R2VuZXJhdGVTZXJ2ZXIpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRHZW5lcmF0ZVNlcnZlciA9IGdlbmVyYXRlU2VydmVyOwotICAgICAgICBnZW5lcmF0ZVNlcnZlciA9IG5ld0dlbmVyYXRlU2VydmVyOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19HRU5FUkFURV9TRVJWRVIsIG9sZEdlbmVyYXRlU2VydmVyLCBnZW5lcmF0ZVNlcnZlcikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBEYXRhQmluZGluZyBnZXREYXRhYmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIGRhdGFiaW5kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERhdGFiaW5kaW5nKERhdGFCaW5kaW5nIG5ld0RhdGFiaW5kaW5nKSB7Ci0gICAgICAgIERhdGFCaW5kaW5nIG9sZERhdGFiaW5kaW5nID0gZGF0YWJpbmRpbmc7Ci0gICAgICAgIGRhdGFiaW5kaW5nID0gbmV3RGF0YWJpbmRpbmcgPT0gbnVsbCA/IERBVEFCSU5ESU5HX0VERUZBVUxUIDogbmV3RGF0YWJpbmRpbmc7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0RBVEFCSU5ESU5HLCBvbGREYXRhYmluZGluZywgZGF0YWJpbmRpbmcpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRnJvbnRlbmQgZ2V0RnJvbnRlbmQoKSB7Ci0gICAgICAgIHJldHVybiBmcm9udGVuZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGcm9udGVuZChGcm9udGVuZCBuZXdGcm9udGVuZCkgewotICAgICAgICBGcm9udGVuZCBvbGRGcm9udGVuZCA9IGZyb250ZW5kOwotICAgICAgICBmcm9udGVuZCA9IG5ld0Zyb250ZW5kID09IG51bGwgPyBGUk9OVEVORF9FREVGQVVMVCA6IG5ld0Zyb250ZW5kOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19GUk9OVEVORCwgb2xkRnJvbnRlbmQsIGZyb250ZW5kKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiB1c2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KGJvb2xlYW4gbmV3VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0ID0gdXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0OwotICAgICAgICB1c2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQgPSBuZXdVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQ7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVCwgb2xkVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0LCB1c2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpIHsKLSAgICAgICAgcmV0dXJuIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoYm9vbGVhbiBuZXdFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIgPSBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXI7Ci0gICAgICAgIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lciA9IG5ld0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSLCBvbGRFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIsIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwcm9qZWN0TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0TmFtZShTdHJpbmcgbmV3UHJvamVjdE5hbWUpIHsKLSAgICAgICAgU3RyaW5nIG9sZFByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7Ci0gICAgICAgIHByb2plY3ROYW1lID0gbmV3UHJvamVjdE5hbWU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1BST0pFQ1RfTkFNRSwgb2xkUHJvamVjdE5hbWUsIHByb2plY3ROYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZURpcmVjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIHJlc291cmNlRGlyZWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlRGlyZWN0b3J5KFN0cmluZyBuZXdSZXNvdXJjZURpcmVjdG9yeSkgewotICAgICAgICBTdHJpbmcgb2xkUmVzb3VyY2VEaXJlY3RvcnkgPSByZXNvdXJjZURpcmVjdG9yeTsKLSAgICAgICAgcmVzb3VyY2VEaXJlY3RvcnkgPSBuZXdSZXNvdXJjZURpcmVjdG9yeTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fUkVTT1VSQ0VfRElSRUNUT1JZLCBvbGRSZXNvdXJjZURpcmVjdG9yeSwgcmVzb3VyY2VEaXJlY3RvcnkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzRGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gY2xhc3NEaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NEaXJlY3RvcnkoU3RyaW5nIG5ld0NsYXNzRGlyZWN0b3J5KSB7Ci0gICAgICAgIFN0cmluZyBvbGRDbGFzc0RpcmVjdG9yeSA9IGNsYXNzRGlyZWN0b3J5OwotICAgICAgICBjbGFzc0RpcmVjdG9yeSA9IG5ld0NsYXNzRGlyZWN0b3J5OwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DTEFTU19ESVJFQ1RPUlksIG9sZENsYXNzRGlyZWN0b3J5LCBjbGFzc0RpcmVjdG9yeSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbEZpbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gd3NkbEZpbGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdzZGxGaWxlTmFtZShTdHJpbmcgbmV3V3NkbEZpbGVOYW1lKSB7Ci0gICAgICAgIFN0cmluZyBvbGRXc2RsRmlsZU5hbWUgPSB3c2RsRmlsZU5hbWU7Ci0gICAgICAgIHdzZGxGaWxlTmFtZSA9IG5ld1dzZGxGaWxlTmFtZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9GSUxFX05BTUUsIG9sZFdzZGxGaWxlTmFtZSwgd3NkbEZpbGVOYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFVSTCBnZXRXc2RsVVJMKCkgewotICAgICAgICByZXR1cm4gd3NkbFVSTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsVVJMKFVSTCBuZXdXc2RsVVJMKSB7Ci0gICAgICAgIFVSTCBvbGRXc2RsVVJMID0gd3NkbFVSTDsKLSAgICAgICAgd3NkbFVSTCA9IG5ld1dzZGxVUkw7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfVVJMLCBvbGRXc2RsVVJMLCB3c2RsVVJMKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb25maWdXc2RsTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBjb25maWdXc2RsTG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlnV3NkbExvY2F0aW9uKFN0cmluZyBuZXdDb25maWdXc2RsTG9jYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIG9sZENvbmZpZ1dzZGxMb2NhdGlvbiA9IGNvbmZpZ1dzZGxMb2NhdGlvbjsKLSAgICAgICAgY29uZmlnV3NkbExvY2F0aW9uID0gbmV3Q29uZmlnV3NkbExvY2F0aW9uOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DT05GSUdfV1NETF9MT0NBVElPTiwgb2xkQ29uZmlnV3NkbExvY2F0aW9uLCBjb25maWdXc2RsTG9jYXRpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoU3RyaW5nIG5ld0Z1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSkgewotICAgICAgICBTdHJpbmcgb2xkRnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lID0gZnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lOwotICAgICAgICBmdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUgPSBuZXdGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0NMQVNTX05BTUUsIG9sZEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSwgZnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gZnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKFN0cmluZyBuZXdGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKSB7Ci0gICAgICAgIFN0cmluZyBvbGRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lID0gZnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZTsKLSAgICAgICAgZnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSA9IG5ld0Z1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FLCBvbGRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lLCBmdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb25maWdJZCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ0lkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ0lkKFN0cmluZyBuZXdDb25maWdJZCkgewotICAgICAgICBTdHJpbmcgb2xkQ29uZmlnSWQgPSBjb25maWdJZDsKLSAgICAgICAgY29uZmlnSWQgPSBuZXdDb25maWdJZDsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ09ORklHX0lELCBvbGRDb25maWdJZCwgY29uZmlnSWQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIG5ld1RhcmdldE5hbWVzcGFjZSkgewotICAgICAgICBTdHJpbmcgb2xkVGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSBuZXdUYXJnZXROYW1lc3BhY2U7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1RBUkdFVF9OQU1FU1BBQ0UsIG9sZFRhcmdldE5hbWVzcGFjZSwgdGFyZ2V0TmFtZXNwYWNlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmRwb2ludE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBlbmRwb2ludE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnROYW1lKFN0cmluZyBuZXdFbmRwb2ludE5hbWUpIHsKLSAgICAgICAgU3RyaW5nIG9sZEVuZHBvaW50TmFtZSA9IGVuZHBvaW50TmFtZTsKLSAgICAgICAgZW5kcG9pbnROYW1lID0gbmV3RW5kcG9pbnROYW1lOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19FTkRQT0lOVF9OQU1FLCBvbGRFbmRwb2ludE5hbWUsIGVuZHBvaW50TmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgbmV3U2VydmljZU5hbWUpIHsKLSAgICAgICAgU3RyaW5nIG9sZFNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0gICAgICAgIHNlcnZpY2VOYW1lID0gbmV3U2VydmljZU5hbWU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1NFUlZJQ0VfTkFNRSwgb2xkU2VydmljZU5hbWUsIHNlcnZpY2VOYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIERlZmluaXRpb24gZ2V0V3NkbERlZmluaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsRGVmaW5pdGlvbihEZWZpbml0aW9uIG5ld1dzZGxEZWZpbml0aW9uKSB7Ci0gICAgICAgIERlZmluaXRpb24gb2xkV3NkbERlZmluaXRpb24gPSB3c2RsRGVmaW5pdGlvbjsKLSAgICAgICAgd3NkbERlZmluaXRpb24gPSBuZXdXc2RsRGVmaW5pdGlvbjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9ERUZJTklUSU9OLCBvbGRXc2RsRGVmaW5pdGlvbiwgd3NkbERlZmluaXRpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdzZGxMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHdzZGxMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsTG9jYXRpb24oU3RyaW5nIG5ld1dzZGxMb2NhdGlvbikgewotICAgICAgICBTdHJpbmcgb2xkV3NkbExvY2F0aW9uID0gd3NkbExvY2F0aW9uOwotICAgICAgICB3c2RsTG9jYXRpb24gPSBuZXdXc2RsTG9jYXRpb247Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfTE9DQVRJT04sIG9sZFdzZGxMb2NhdGlvbiwgd3NkbExvY2F0aW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DWEZfUlVOVElNRV9MT0NBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q3hmUnVudGltZUxvY2F0aW9uKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NYRl9SVU5USU1FX0VESVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEN4ZlJ1bnRpbWVFZGl0aW9uKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NYRl9SVU5USU1FX1ZFUlNJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEN4ZlJ1bnRpbWVWZXJzaW9uKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1ZFUkJPU0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzVmVyYm9zZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzR2VuZXJhdGVBbnRCdWlsZEZpbGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0NMSUVOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNHZW5lcmF0ZUNsaWVudCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfU0VSVkVSOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0dlbmVyYXRlU2VydmVyKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19EQVRBQklORElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGF0YWJpbmRpbmcoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRlJPTlRFTkQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEZyb250ZW5kKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1BST0pFQ1RfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJvamVjdE5hbWUoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fUkVTT1VSQ0VfRElSRUNUT1JZOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRSZXNvdXJjZURpcmVjdG9yeSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DTEFTU19ESVJFQ1RPUlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldENsYXNzRGlyZWN0b3J5KCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfRklMRV9OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRXc2RsRmlsZU5hbWUoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9VUkw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFdzZGxVUkwoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ09ORklHX1dTRExfTE9DQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldENvbmZpZ1dzZGxMb2NhdGlvbigpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ09ORklHX0lEOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRDb25maWdJZCgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19UQVJHRVRfTkFNRVNQQUNFOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRU5EUE9JTlRfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RW5kcG9pbnROYW1lKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1NFUlZJQ0VfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U2VydmljZU5hbWUoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9ERUZJTklUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRXc2RsRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX0xPQ0FUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRXc2RsTG9jYXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DWEZfUlVOVElNRV9MT0NBVElPTjoKLSAgICAgICAgICAgICAgICBzZXRDeGZSdW50aW1lTG9jYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DWEZfUlVOVElNRV9FRElUSU9OOgotICAgICAgICAgICAgICAgIHNldEN4ZlJ1bnRpbWVFZGl0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ1hGX1JVTlRJTUVfVkVSU0lPTjoKLSAgICAgICAgICAgICAgICBzZXRDeGZSdW50aW1lVmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1ZFUkJPU0U6Ci0gICAgICAgICAgICAgICAgc2V0VmVyYm9zZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlQW50QnVpbGRGaWxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfQ0xJRU5UOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlQ2xpZW50KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfU0VSVkVSOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlU2VydmVyKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fREFUQUJJTkRJTkc6Ci0gICAgICAgICAgICAgICAgc2V0RGF0YWJpbmRpbmcoKERhdGFCaW5kaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0ZST05URU5EOgotICAgICAgICAgICAgICAgIHNldEZyb250ZW5kKChGcm9udGVuZCluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQ6Ci0gICAgICAgICAgICAgICAgc2V0VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSOgotICAgICAgICAgICAgICAgIHNldEV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1BST0pFQ1RfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRQcm9qZWN0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1JFU09VUkNFX0RJUkVDVE9SWToKLSAgICAgICAgICAgICAgICBzZXRSZXNvdXJjZURpcmVjdG9yeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NMQVNTX0RJUkVDVE9SWToKLSAgICAgICAgICAgICAgICBzZXRDbGFzc0RpcmVjdG9yeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfRklMRV9OQU1FOgotICAgICAgICAgICAgICAgIHNldFdzZGxGaWxlTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfVVJMOgotICAgICAgICAgICAgICAgIHNldFdzZGxVUkwoKFVSTCluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DT05GSUdfV1NETF9MT0NBVElPTjoKLSAgICAgICAgICAgICAgICBzZXRDb25maWdXc2RsTG9jYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FOgotICAgICAgICAgICAgICAgIHNldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FOgotICAgICAgICAgICAgICAgIHNldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DT05GSUdfSUQ6Ci0gICAgICAgICAgICAgICAgc2V0Q29uZmlnSWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19UQVJHRVRfTkFNRVNQQUNFOgotICAgICAgICAgICAgICAgIHNldFRhcmdldE5hbWVzcGFjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0VORFBPSU5UX05BTUU6Ci0gICAgICAgICAgICAgICAgc2V0RW5kcG9pbnROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fU0VSVklDRV9OQU1FOgotICAgICAgICAgICAgICAgIHNldFNlcnZpY2VOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9ERUZJTklUSU9OOgotICAgICAgICAgICAgICAgIHNldFdzZGxEZWZpbml0aW9uKChEZWZpbml0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfTE9DQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0V3NkbExvY2F0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NYRl9SVU5USU1FX0xPQ0FUSU9OOgotICAgICAgICAgICAgICAgIHNldEN4ZlJ1bnRpbWVMb2NhdGlvbihDWEZfUlVOVElNRV9MT0NBVElPTl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DWEZfUlVOVElNRV9FRElUSU9OOgotICAgICAgICAgICAgICAgIHNldEN4ZlJ1bnRpbWVFZGl0aW9uKENYRl9SVU5USU1FX0VESVRJT05fRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ1hGX1JVTlRJTUVfVkVSU0lPTjoKLSAgICAgICAgICAgICAgICBzZXRDeGZSdW50aW1lVmVyc2lvbihDWEZfUlVOVElNRV9WRVJTSU9OX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1ZFUkJPU0U6Ci0gICAgICAgICAgICAgICAgc2V0VmVyYm9zZShWRVJCT1NFX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlQW50QnVpbGRGaWxlKEdFTkVSQVRFX0FOVF9CVUlMRF9GSUxFX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0NMSUVOVDoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZUNsaWVudChHRU5FUkFURV9DTElFTlRfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfU0VSVkVSOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlU2VydmVyKEdFTkVSQVRFX1NFUlZFUl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19EQVRBQklORElORzoKLSAgICAgICAgICAgICAgICBzZXREYXRhYmluZGluZyhEQVRBQklORElOR19FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19GUk9OVEVORDoKLSAgICAgICAgICAgICAgICBzZXRGcm9udGVuZChGUk9OVEVORF9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQ6Ci0gICAgICAgICAgICAgICAgc2V0VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KFVTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVF9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVI6Ci0gICAgICAgICAgICAgICAgc2V0RXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKEVYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19QUk9KRUNUX05BTUU6Ci0gICAgICAgICAgICAgICAgc2V0UHJvamVjdE5hbWUoUFJPSkVDVF9OQU1FX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1JFU09VUkNFX0RJUkVDVE9SWToKLSAgICAgICAgICAgICAgICBzZXRSZXNvdXJjZURpcmVjdG9yeShSRVNPVVJDRV9ESVJFQ1RPUllfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ0xBU1NfRElSRUNUT1JZOgotICAgICAgICAgICAgICAgIHNldENsYXNzRGlyZWN0b3J5KENMQVNTX0RJUkVDVE9SWV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX0ZJTEVfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRXc2RsRmlsZU5hbWUoV1NETF9GSUxFX05BTUVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9VUkw6Ci0gICAgICAgICAgICAgICAgc2V0V3NkbFVSTChXU0RMX1VSTF9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DT05GSUdfV1NETF9MT0NBVElPTjoKLSAgICAgICAgICAgICAgICBzZXRDb25maWdXc2RsTG9jYXRpb24oQ09ORklHX1dTRExfTE9DQVRJT05fRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9JTlRFUkZBQ0VfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKEZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19JRDoKLSAgICAgICAgICAgICAgICBzZXRDb25maWdJZChDT05GSUdfSURfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fVEFSR0VUX05BTUVTUEFDRToKLSAgICAgICAgICAgICAgICBzZXRUYXJnZXROYW1lc3BhY2UoVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19FTkRQT0lOVF9OQU1FOgotICAgICAgICAgICAgICAgIHNldEVuZHBvaW50TmFtZShFTkRQT0lOVF9OQU1FX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1NFUlZJQ0VfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRTZXJ2aWNlTmFtZShTRVJWSUNFX05BTUVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9ERUZJTklUSU9OOgotICAgICAgICAgICAgICAgIHNldFdzZGxEZWZpbml0aW9uKFdTRExfREVGSU5JVElPTl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX0xPQ0FUSU9OOgotICAgICAgICAgICAgICAgIHNldFdzZGxMb2NhdGlvbihXU0RMX0xPQ0FUSU9OX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ1hGX1JVTlRJTUVfTE9DQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENYRl9SVU5USU1FX0xPQ0FUSU9OX0VERUZBVUxUID09IG51bGwgPyBjeGZSdW50aW1lTG9jYXRpb24gIT0gbnVsbCA6ICFDWEZfUlVOVElNRV9MT0NBVElPTl9FREVGQVVMVC5lcXVhbHMoY3hmUnVudGltZUxvY2F0aW9uKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ1hGX1JVTlRJTUVfRURJVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gQ1hGX1JVTlRJTUVfRURJVElPTl9FREVGQVVMVCA9PSBudWxsID8gY3hmUnVudGltZUVkaXRpb24gIT0gbnVsbCA6ICFDWEZfUlVOVElNRV9FRElUSU9OX0VERUZBVUxULmVxdWFscyhjeGZSdW50aW1lRWRpdGlvbik7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NYRl9SVU5USU1FX1ZFUlNJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENYRl9SVU5USU1FX1ZFUlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IGN4ZlJ1bnRpbWVWZXJzaW9uICE9IG51bGwgOiAhQ1hGX1JVTlRJTUVfVkVSU0lPTl9FREVGQVVMVC5lcXVhbHMoY3hmUnVudGltZVZlcnNpb24pOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19WRVJCT1NFOgotICAgICAgICAgICAgICAgIHJldHVybiB2ZXJib3NlICE9IFZFUkJPU0VfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFOgotICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUFudEJ1aWxkRmlsZSAhPSBHRU5FUkFURV9BTlRfQlVJTERfRklMRV9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfQ0xJRU5UOgotICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUNsaWVudCAhPSBHRU5FUkFURV9DTElFTlRfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1NFUlZFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVTZXJ2ZXIgIT0gR0VORVJBVEVfU0VSVkVSX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19EQVRBQklORElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZGF0YWJpbmRpbmcgIT0gREFUQUJJTkRJTkdfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0ZST05URU5EOgotICAgICAgICAgICAgICAgIHJldHVybiBmcm9udGVuZCAhPSBGUk9OVEVORF9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUOgotICAgICAgICAgICAgICAgIHJldHVybiB1c2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQgIT0gVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lciAhPSBFWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVJfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1BST0pFQ1RfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gUFJPSkVDVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwcm9qZWN0TmFtZSAhPSBudWxsIDogIVBST0pFQ1RfTkFNRV9FREVGQVVMVC5lcXVhbHMocHJvamVjdE5hbWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19SRVNPVVJDRV9ESVJFQ1RPUlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFJFU09VUkNFX0RJUkVDVE9SWV9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VEaXJlY3RvcnkgIT0gbnVsbCA6ICFSRVNPVVJDRV9ESVJFQ1RPUllfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlRGlyZWN0b3J5KTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ0xBU1NfRElSRUNUT1JZOgotICAgICAgICAgICAgICAgIHJldHVybiBDTEFTU19ESVJFQ1RPUllfRURFRkFVTFQgPT0gbnVsbCA/IGNsYXNzRGlyZWN0b3J5ICE9IG51bGwgOiAhQ0xBU1NfRElSRUNUT1JZX0VERUZBVUxULmVxdWFscyhjbGFzc0RpcmVjdG9yeSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfRklMRV9OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBXU0RMX0ZJTEVfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gd3NkbEZpbGVOYW1lICE9IG51bGwgOiAhV1NETF9GSUxFX05BTUVfRURFRkFVTFQuZXF1YWxzKHdzZGxGaWxlTmFtZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfVVJMOgotICAgICAgICAgICAgICAgIHJldHVybiBXU0RMX1VSTF9FREVGQVVMVCA9PSBudWxsID8gd3NkbFVSTCAhPSBudWxsIDogIVdTRExfVVJMX0VERUZBVUxULmVxdWFscyh3c2RsVVJMKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ09ORklHX1dTRExfTE9DQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENPTkZJR19XU0RMX0xPQ0FUSU9OX0VERUZBVUxUID09IG51bGwgPyBjb25maWdXc2RsTG9jYXRpb24gIT0gbnVsbCA6ICFDT05GSUdfV1NETF9MT0NBVElPTl9FREVGQVVMVC5lcXVhbHMoY29uZmlnV3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lICE9IG51bGwgOiAhRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRV9FREVGQVVMVC5lcXVhbHMoZnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBmdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lICE9IG51bGwgOiAhRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUVfRURFRkFVTFQuZXF1YWxzKGZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DT05GSUdfSUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENPTkZJR19JRF9FREVGQVVMVCA9PSBudWxsID8gY29uZmlnSWQgIT0gbnVsbCA6ICFDT05GSUdfSURfRURFRkFVTFQuZXF1YWxzKGNvbmZpZ0lkKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fVEFSR0VUX05BTUVTUEFDRToKLSAgICAgICAgICAgICAgICByZXR1cm4gVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCA9PSBudWxsID8gdGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgOiAhVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVC5lcXVhbHModGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRU5EUE9JTlRfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gRU5EUE9JTlRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZW5kcG9pbnROYW1lICE9IG51bGwgOiAhRU5EUE9JTlRfTkFNRV9FREVGQVVMVC5lcXVhbHMoZW5kcG9pbnROYW1lKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fU0VSVklDRV9OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBTRVJWSUNFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHNlcnZpY2VOYW1lICE9IG51bGwgOiAhU0VSVklDRV9OQU1FX0VERUZBVUxULmVxdWFscyhzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfREVGSU5JVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gV1NETF9ERUZJTklUSU9OX0VERUZBVUxUID09IG51bGwgPyB3c2RsRGVmaW5pdGlvbiAhPSBudWxsIDogIVdTRExfREVGSU5JVElPTl9FREVGQVVMVC5lcXVhbHMod3NkbERlZmluaXRpb24pOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX0xPQ0FUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBXU0RMX0xPQ0FUSU9OX0VERUZBVUxUID09IG51bGwgPyB3c2RsTG9jYXRpb24gIT0gbnVsbCA6ICFXU0RMX0xPQ0FUSU9OX0VERUZBVUxULmVxdWFscyh3c2RsTG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiAoY3hmUnVudGltZUxvY2F0aW9uOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChjeGZSdW50aW1lTG9jYXRpb24pOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGN4ZlJ1bnRpbWVFZGl0aW9uOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChjeGZSdW50aW1lRWRpdGlvbik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY3hmUnVudGltZVZlcnNpb246ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGN4ZlJ1bnRpbWVWZXJzaW9uKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB2ZXJib3NlOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh2ZXJib3NlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBnZW5lcmF0ZUFudEJ1aWxkRmlsZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZ2VuZXJhdGVBbnRCdWlsZEZpbGUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGdlbmVyYXRlQ2xpZW50OiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChnZW5lcmF0ZUNsaWVudCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZ2VuZXJhdGVTZXJ2ZXI6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGdlbmVyYXRlU2VydmVyKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBkYXRhYmluZGluZzogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZGF0YWJpbmRpbmcpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGZyb250ZW5kOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChmcm9udGVuZCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0OiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh1c2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBwcm9qZWN0TmFtZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQocHJvamVjdE5hbWUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlRGlyZWN0b3J5OiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChyZXNvdXJjZURpcmVjdG9yeSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY2xhc3NEaXJlY3Rvcnk6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGNsYXNzRGlyZWN0b3J5KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB3c2RsRmlsZU5hbWU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHdzZGxGaWxlTmFtZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgd3NkbFVSTDogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQod3NkbFVSTCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29uZmlnV3NkbExvY2F0aW9uOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChjb25maWdXc2RsTG9jYXRpb24pOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBmdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChmdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjb25maWdJZDogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoY29uZmlnSWQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHRhcmdldE5hbWVzcGFjZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBlbmRwb2ludE5hbWU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGVuZHBvaW50TmFtZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgc2VydmljZU5hbWU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB3c2RsRGVmaW5pdGlvbjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQod3NkbERlZmluaXRpb24pOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHdzZGxMb2NhdGlvbjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQod3NkbExvY2F0aW9uKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi19IC8vQ1hGRGF0YU1vZGVsSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL0NYRkZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL2ltcGwvQ1hGRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1MTYzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL2ltcGwvQ1hGRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiAkSWQ6IENYRkZhY3RvcnlJbXBsLmphdmEsdiAxLjEgMjAwOC8xMS8xMCAyMDozNzo0MiBkYXZpZF93aWxsaWFtcyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuKjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENYRkZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgQ1hGRmFjdG9yeSB7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ1hGRmFjdG9yeSBpbml0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ1hGRmFjdG9yeSB0aGVDWEZGYWN0b3J5ID0gKENYRkZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly8vb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsLmVjb3JlIik7IAotICAgICAgICAgICAgaWYgKHRoZUNYRkZhY3RvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGVDWEZGYWN0b3J5OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICBFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IENYRkZhY3RvcnlJbXBsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ1hGRmFjdG9yeUltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLSAgICAgICAgc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlSmF2YTJXU0RhdGFNb2RlbCgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdTREwySmF2YURhdGFNb2RlbCgpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLSAgICAgICAgc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5GUk9OVEVORDoKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlRnJvbnRlbmRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5EQVRBX0JJTkRJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZURhdGFCaW5kaW5nRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuVVJMOgotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVVUkxGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5ERUZJTklUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVEZWZpbml0aW9uRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuTUFQOgotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVNYXBGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5JTUVUSE9EOgotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVJTWV0aG9kRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotICAgICAgICBzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkZST05URU5EOgotICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0RnJvbnRlbmRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkRBVEFfQklORElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydERhdGFCaW5kaW5nVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5VUkw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRVUkxUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkRFRklOSVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnREZWZpbml0aW9uVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5NQVA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRNYXBUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLklNRVRIT0Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRJTWV0aG9kVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBKYXZhMldTRGF0YU1vZGVsIGNyZWF0ZUphdmEyV1NEYXRhTW9kZWwoKSB7Ci0gICAgICAgIEphdmEyV1NEYXRhTW9kZWxJbXBsIGphdmEyV1NEYXRhTW9kZWwgPSBuZXcgSmF2YTJXU0RhdGFNb2RlbEltcGwoKTsKLSAgICAgICAgcmV0dXJuIGphdmEyV1NEYXRhTW9kZWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFdTREwySmF2YURhdGFNb2RlbCBjcmVhdGVXU0RMMkphdmFEYXRhTW9kZWwoKSB7Ci0gICAgICAgIFdTREwySmF2YURhdGFNb2RlbEltcGwgd3NkbDJKYXZhRGF0YU1vZGVsID0gbmV3IFdTREwySmF2YURhdGFNb2RlbEltcGwoKTsKLSAgICAgICAgcmV0dXJuIHdzZGwySmF2YURhdGFNb2RlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRnJvbnRlbmQgY3JlYXRlRnJvbnRlbmRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLSAgICAgICAgRnJvbnRlbmQgcmVzdWx0ID0gRnJvbnRlbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydEZyb250ZW5kVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIERhdGFCaW5kaW5nIGNyZWF0ZURhdGFCaW5kaW5nRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0gICAgICAgIERhdGFCaW5kaW5nIHJlc3VsdCA9IERhdGFCaW5kaW5nLmdldChpbml0aWFsVmFsdWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnREYXRhQmluZGluZ1RvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBVUkwgY3JlYXRlVVJMRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0gICAgICAgIHJldHVybiAoVVJMKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydFVSTFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmaW5pdGlvbiBjcmVhdGVEZWZpbml0aW9uRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0gICAgICAgIHJldHVybiAoRGVmaW5pdGlvbilzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnREZWZpbml0aW9uVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBNYXA8PywgPz4gY3JlYXRlTWFwRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0gICAgICAgIHJldHVybiAoTWFwPD8sID8+KXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoaW5pdGlhbFZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRNYXBUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotICAgICAgICByZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGluc3RhbmNlVmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJTWV0aG9kIGNyZWF0ZUlNZXRob2RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIChJTWV0aG9kKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydElNZXRob2RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotICAgICAgICByZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIENYRlBhY2thZ2UgZ2V0Q1hGUGFja2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIChDWEZQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBzdGF0aWMgQ1hGUGFja2FnZSBnZXRQYWNrYWdlKCkgewotICAgICAgICByZXR1cm4gQ1hGUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgfQotCi19IC8vQ1hGRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9DWEZQYWNrYWdlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL0NYRlBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NjZiZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL0NYRlBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTc3ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqICRJZDogQ1hGUGFja2FnZUltcGwuamF2YSx2IDEuNSAyMDA5LzA4LzIzIDIyOjUxOjU3IHNjbGFya2UgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FR2VuZXJpY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5EYXRhQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRnJvbnRlbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDWEZQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIENYRlBhY2thZ2UgewotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGN4ZkNvbnRleHRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgY3hmRGF0YU1vZGVsRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGphdmEyV1NDb250ZXh0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGphdmEyV1NEYXRhTW9kZWxFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgd3NkbDJKYXZhQ29udGV4dEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyB3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFRW51bSBmcm9udGVuZEVFbnVtID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUVudW0gZGF0YUJpbmRpbmdFRW51bSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVEYXRhVHlwZSB1cmxFRGF0YVR5cGUgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFRGF0YVR5cGUgZGVmaW5pdGlvbkVEYXRhVHlwZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVEYXRhVHlwZSBtYXBFRGF0YVR5cGUgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFRGF0YVR5cGUgaU1ldGhvZEVEYXRhVHlwZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0gICAgICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLSAgICAgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLSAgICAgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0gICAgICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLSAgICAgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotICAgICAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZSNlTlNfVVJJCi0gICAgICogQHNlZSAjaW5pdCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgQ1hGUGFja2FnZUltcGwoKSB7Ci0gICAgICAgIHN1cGVyKGVOU19VUkksIENYRkZhY3RvcnkuZUlOU1RBTkNFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLSAgICAgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotICAgICAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0gICAgICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0gICAgICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotICAgICAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0gICAgICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotICAgICAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotICAgICAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLSAgICAgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotICAgICAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0gICAgICogdGhvc2Ugb2YgYW5vdGhlci4KLSAgICAgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0gICAgICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZU5TX1VSSQotICAgICAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0gICAgICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ1hGUGFja2FnZSBpbml0KCkgewotICAgICAgICBpZiAoaXNJbml0ZWQpIHJldHVybiAoQ1hGUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDWEZQYWNrYWdlLmVOU19VUkkpOwotCi0gICAgICAgIC8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLSAgICAgICAgQ1hGUGFja2FnZUltcGwgdGhlQ1hGUGFja2FnZSA9IChDWEZQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBDWEZQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IENYRlBhY2thZ2VJbXBsKCkpOwotCi0gICAgICAgIGlzSW5pdGVkID0gdHJ1ZTsKLQotICAgICAgICAvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotICAgICAgICB0aGVDWEZQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0gICAgICAgIC8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLSAgICAgICAgdGhlQ1hGUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLSAgICAgICAgLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotICAgICAgICB0aGVDWEZQYWNrYWdlLmZyZWV6ZSgpOwotCi0gICAgICAgIHJldHVybiB0aGVDWEZQYWNrYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0Q1hGQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGN4ZkNvbnRleHRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9DeGZSdW50aW1lTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9DeGZSdW50aW1lRWRpdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0N4ZlJ1bnRpbWVWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfVmVyYm9zZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0dlbmVyYXRlQW50QnVpbGRGaWxlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfR2VuZXJhdGVDbGllbnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9HZW5lcmF0ZVNlcnZlcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0RhdGFiaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfRnJvbnRlbmQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9Vc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9FeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+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+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YURhdGFNb2RlbF9CaW5kaW5nRmlsZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFEYXRhTW9kZWxfRXhjbHVkZWROYW1lc3BhY2VzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0NhdGFsb2dGaWxlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0phdmFTb3VyY2VGb2xkZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUVudW0gZ2V0RnJvbnRlbmQoKSB7Ci0gICAgICAgIHJldHVybiBmcm9udGVuZEVFbnVtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFRW51bSBnZXREYXRhQmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIGRhdGFCaW5kaW5nRUVudW07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVEYXRhVHlwZSBnZXRVUkwoKSB7Ci0gICAgICAgIHJldHVybiB1cmxFRGF0YVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVEYXRhVHlwZSBnZXREZWZpbml0aW9uKCkgewotICAgICAgICByZXR1cm4gZGVmaW5pdGlvbkVEYXRhVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRURhdGFUeXBlIGdldE1hcCgpIHsKLSAgICAgICAgcmV0dXJuIG1hcEVEYXRhVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRURhdGFUeXBlIGdldElNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiBpTWV0aG9kRURhdGFUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBDWEZGYWN0b3J5IGdldENYRkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiAoQ1hGRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0gICAgICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLSAgICAgICAgaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotICAgICAgICBpc0NyZWF0ZWQgPSB0cnVlOwotCi0gICAgICAgIC8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotICAgICAgICBjeGZDb250ZXh0RUNsYXNzID0gY3JlYXRlRUNsYXNzKENYRl9DT05URVhUKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZDb250ZXh0RUNsYXNzLCBDWEZfQ09OVEVYVF9fQ1hGX1JVTlRJTUVfTE9DQVRJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkNvbnRleHRFQ2xhc3MsIENYRl9DT05URVhUX19DWEZfUlVOVElNRV9FRElUSU9OKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZDb250ZXh0RUNsYXNzLCBDWEZfQ09OVEVYVF9fQ1hGX1JVTlRJTUVfVkVSU0lPTik7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmQ29udGV4dEVDbGFzcywgQ1hGX0NPTlRFWFRfX1ZFUkJPU0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkNvbnRleHRFQ2xhc3MsIENYRl9DT05URVhUX19HRU5FUkFURV9BTlRfQlVJTERfRklMRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmQ29udGV4dEVDbGFzcywgQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX0NMSUVOVCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmQ29udGV4dEVDbGFzcywgQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX1NFUlZFUik7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmQ29udGV4dEVDbGFzcywgQ1hGX0NPTlRFWFRfX0RBVEFCSU5ESU5HKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZDb250ZXh0RUNsYXNzLCBDWEZfQ09OVEVYVF9fRlJPTlRFTkQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkNvbnRleHRFQ2xhc3MsIENYRl9DT05URVhUX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkNvbnRleHRFQ2xhc3MsIENYRl9DT05URVhUX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIpOwotCi0gICAgICAgIGN4ZkRhdGFNb2RlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDWEZfREFUQV9NT0RFTCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZfREFUQV9NT0RFTF9fUFJPSkVDVF9OQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZEYXRhTW9kZWxFQ2xhc3MsIENYRl9EQVRBX01PREVMX19SRVNPVVJDRV9ESVJFQ1RPUlkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkRhdGFNb2RlbEVDbGFzcywgQ1hGX0RBVEFfTU9ERUxfX0NMQVNTX0RJUkVDVE9SWSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZfREFUQV9NT0RFTF9fV1NETF9GSUxFX05BTUUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkRhdGFNb2RlbEVDbGFzcywgQ1hGX0RBVEFfTU9ERUxfX1dTRExfVVJMKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZEYXRhTW9kZWxFQ2xhc3MsIENYRl9EQVRBX01PREVMX19DT05GSUdfV1NETF9MT0NBVElPTik7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkRhdGFNb2RlbEVDbGFzcywgQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19JRCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZfREFUQV9NT0RFTF9fVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZfREFUQV9NT0RFTF9fRU5EUE9JTlRfTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZfREFUQV9NT0RFTF9fU0VSVklDRV9OQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZEYXRhTW9kZWxFQ2xhc3MsIENYRl9EQVRBX01PREVMX19XU0RMX0RFRklOSVRJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkRhdGFNb2RlbEVDbGFzcywgQ1hGX0RBVEFfTU9ERUxfX1dTRExfTE9DQVRJT04pOwotCi0gICAgICAgIGphdmEyV1NDb250ZXh0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEpBVkEyX1dTX0NPTlRFWFQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NDb250ZXh0RUNsYXNzLCBKQVZBMl9XU19DT05URVhUX19TT0FQMTJfQklORElORyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0NvbnRleHRFQ2xhc3MsIEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1hTRF9JTVBPUlRTKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTQ29udGV4dEVDbGFzcywgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1NETCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0NvbnRleHRFQ2xhc3MsIEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlMpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NDb250ZXh0RUNsYXNzLCBKQVZBMl9XU19DT05URVhUX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0NvbnRleHRFQ2xhc3MsIEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTik7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0NvbnRleHRFQ2xhc3MsIEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTQ29udGV4dEVDbGFzcywgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NDb250ZXh0RUNsYXNzLCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT04pOwotCi0gICAgICAgIGphdmEyV1NEYXRhTW9kZWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSkFWQTJfV1NfREFUQV9NT0RFTCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0RhdGFNb2RlbEVDbGFzcywgSkFWQTJfV1NfREFUQV9NT0RFTF9fQ0xBU1NQQVRIKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTRGF0YU1vZGVsRUNsYXNzLCBKQVZBMl9XU19EQVRBX01PREVMX19KQVZBX1NUQVJUSU5HX1BPSU5UKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTRGF0YU1vZGVsRUNsYXNzLCBKQVZBMl9XU19EQVRBX01PREVMX19VU0VfU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NEYXRhTW9kZWxFQ2xhc3MsIEpBVkEyX1dTX0RBVEFfTU9ERUxfX0VYVFJBQ1RfSU5URVJGQUNFKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTRGF0YU1vZGVsRUNsYXNzLCBKQVZBMl9XU19EQVRBX01PREVMX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9OQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTRGF0YU1vZGVsRUNsYXNzLCBKQVZBMl9XU19EQVRBX01PREVMX19NRVRIT0RfTUFQKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTRGF0YU1vZGVsRUNsYXNzLCBKQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX01BUCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0RhdGFNb2RlbEVDbGFzcywgSkFWQTJfV1NfREFUQV9NT0RFTF9fU09VUkNFX0RJUkVDVE9SWSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0RhdGFNb2RlbEVDbGFzcywgSkFWQTJfV1NfREFUQV9NT0RFTF9fUE9SVF9OQU1FKTsKLQotICAgICAgICB3c2RsMkphdmFDb250ZXh0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFdTREwyX0pBVkFfQ09OVEVYVCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTik7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19QUk9DRVNTX1NPQVBfSEVBREVSUyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19WQUxJREFURSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19XU0RMX1ZFUlNJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fVVNFX0RFRkFVTFRfVkFMVUVTKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19BUkdTKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX05PX0FERFJFU1NfQklORElORyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19YSkNfVVNFX0RFRkFVTFRfVkFMVUVTKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkcpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfU0lNUExFKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19MT0NBVE9SKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19TWU5DX01FVEhPRFMpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX01BUktfR0VORVJBVEVEKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19FUElTT0RFX0ZJTEUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fQVVUT19OQU1FX1JFU09MVVRJT04pOwotCi0gICAgICAgIHdzZGwySmF2YURhdGFNb2RlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXU0RMMl9KQVZBX0RBVEFfTU9ERUwpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YURhdGFNb2RlbEVDbGFzcywgV1NETDJfSkFWQV9EQVRBX01PREVMX19JTkNMVURFRF9OQU1FU1BBQ0VTKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3MsIFdTREwyX0pBVkFfREFUQV9NT0RFTF9fQklORElOR19GSUxFUyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhRGF0YU1vZGVsRUNsYXNzLCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0VYQ0xVREVEX05BTUVTUEFDRVMpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YURhdGFNb2RlbEVDbGFzcywgV1NETDJfSkFWQV9EQVRBX01PREVMX19DQVRBTE9HX0ZJTEUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YURhdGFNb2RlbEVDbGFzcywgV1NETDJfSkFWQV9EQVRBX01PREVMX19KQVZBX1NPVVJDRV9GT0xERVIpOwotCi0gICAgICAgIC8vIENyZWF0ZSBlbnVtcwotICAgICAgICBmcm9udGVuZEVFbnVtID0gY3JlYXRlRUVudW0oRlJPTlRFTkQpOwotICAgICAgICBkYXRhQmluZGluZ0VFbnVtID0gY3JlYXRlRUVudW0oREFUQV9CSU5ESU5HKTsKLQotICAgICAgICAvLyBDcmVhdGUgZGF0YSB0eXBlcwotICAgICAgICB1cmxFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoVVJMKTsKLSAgICAgICAgZGVmaW5pdGlvbkVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShERUZJTklUSU9OKTsKLSAgICAgICAgbWFwRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKE1BUCk7Ci0gICAgICAgIGlNZXRob2RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoSU1FVEhPRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0gICAgICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotICAgICAgICBpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotICAgICAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotICAgICAgICAvLyBJbml0aWFsaXplIHBhY2thZ2UKLSAgICAgICAgc2V0TmFtZShlTkFNRSk7Ci0gICAgICAgIHNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotICAgICAgICBzZXROc1VSSShlTlNfVVJJKTsKLQotICAgICAgICAvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCi0gICAgICAgIGFkZEVUeXBlUGFyYW1ldGVyKG1hcEVEYXRhVHlwZSwgIlQiKTsKLSAgICAgICAgYWRkRVR5cGVQYXJhbWV0ZXIobWFwRURhdGFUeXBlLCAiVDEiKTsKLQotICAgICAgICAvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKLQotICAgICAgICAvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0gICAgICAgIGN4ZkRhdGFNb2RlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENYRkNvbnRleHQoKSk7Ci0gICAgICAgIGphdmEyV1NDb250ZXh0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q1hGQ29udGV4dCgpKTsKLSAgICAgICAgamF2YTJXU0RhdGFNb2RlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENYRkRhdGFNb2RlbCgpKTsKLSAgICAgICAgamF2YTJXU0RhdGFNb2RlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEphdmEyV1NDb250ZXh0KCkpOwotICAgICAgICB3c2RsMkphdmFDb250ZXh0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q1hGQ29udGV4dCgpKTsKLSAgICAgICAgd3NkbDJKYXZhRGF0YU1vZGVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q1hGRGF0YU1vZGVsKCkpOwotICAgICAgICB3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXU0RMMkphdmFDb250ZXh0KCkpOwotCi0gICAgICAgIC8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0gICAgICAgIGluaXRFQ2xhc3MoY3hmQ29udGV4dEVDbGFzcywgQ1hGQ29udGV4dC5jbGFzcywgIkNYRkNvbnRleHQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZDb250ZXh0X0N4ZlJ1bnRpbWVMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY3hmUnVudGltZUxvY2F0aW9uIiwgbnVsbCwgMCwgMSwgQ1hGQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGQ29udGV4dF9DeGZSdW50aW1lRWRpdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY3hmUnVudGltZUVkaXRpb24iLCBudWxsLCAwLCAxLCBDWEZDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZDb250ZXh0X0N4ZlJ1bnRpbWVWZXJzaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjeGZSdW50aW1lVmVyc2lvbiIsIG51bGwsIDAsIDEsIENYRkNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkNvbnRleHRfVmVyYm9zZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInZlcmJvc2UiLCAidHJ1ZSIsIDAsIDEsIENYRkNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkNvbnRleHRfR2VuZXJhdGVBbnRCdWlsZEZpbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJnZW5lcmF0ZUFudEJ1aWxkRmlsZSIsICJmYWxzZSIsIDAsIDEsIENYRkNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkNvbnRleHRfR2VuZXJhdGVDbGllbnQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJnZW5lcmF0ZUNsaWVudCIsICJmYWxzZSIsIDAsIDEsIENYRkNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkNvbnRleHRfR2VuZXJhdGVTZXJ2ZXIoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJnZW5lcmF0ZVNlcnZlciIsICJmYWxzZSIsIDAsIDEsIENYRkNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkNvbnRleHRfRGF0YWJpbmRpbmcoKSwgdGhpcy5nZXREYXRhQmluZGluZygpLCAiZGF0YWJpbmRpbmciLCAiamF4YiIsIDAsIDEsIENYRkNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkNvbnRleHRfRnJvbnRlbmQoKSwgdGhpcy5nZXRGcm9udGVuZCgpLCAiZnJvbnRlbmQiLCAiamF4d3MiLCAwLCAxLCBDWEZDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZDb250ZXh0X1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCIsICJ0cnVlIiwgMCwgMSwgQ1hGQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGQ29udGV4dF9FeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIiLCAidHJ1ZSIsIDAsIDEsIENYRkNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhjeGZEYXRhTW9kZWxFQ2xhc3MsIENYRkRhdGFNb2RlbC5jbGFzcywgIkNYRkRhdGFNb2RlbCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZEYXRhTW9kZWxfUHJvamVjdE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInByb2plY3ROYW1lIiwgbnVsbCwgMCwgMSwgQ1hGRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZEYXRhTW9kZWxfUmVzb3VyY2VEaXJlY3RvcnkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJlc291cmNlRGlyZWN0b3J5IiwgbnVsbCwgMCwgMSwgQ1hGRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZEYXRhTW9kZWxfQ2xhc3NEaXJlY3RvcnkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNsYXNzRGlyZWN0b3J5IiwgbnVsbCwgMCwgMSwgQ1hGRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZEYXRhTW9kZWxfV3NkbEZpbGVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3c2RsRmlsZU5hbWUiLCBudWxsLCAwLCAxLCBDWEZEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkRhdGFNb2RlbF9Xc2RsVVJMKCksIHRoaXMuZ2V0VVJMKCksICJ3c2RsVVJMIiwgbnVsbCwgMCwgMSwgQ1hGRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZEYXRhTW9kZWxfQ29uZmlnV3NkbExvY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb25maWdXc2RsTG9jYXRpb24iLCBudWxsLCAwLCAxLCBDWEZEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkRhdGFNb2RlbF9GdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSIsIG51bGwsIDAsIDEsIENYRkRhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGRGF0YU1vZGVsX0Z1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUiLCBudWxsLCAwLCAxLCBDWEZEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkRhdGFNb2RlbF9Db25maWdJZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29uZmlnSWQiLCBudWxsLCAwLCAxLCBDWEZEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkRhdGFNb2RlbF9UYXJnZXROYW1lc3BhY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInRhcmdldE5hbWVzcGFjZSIsIG51bGwsIDAsIDEsIENYRkRhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGRGF0YU1vZGVsX0VuZHBvaW50TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZW5kcG9pbnROYW1lIiwgbnVsbCwgMCwgMSwgQ1hGRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZEYXRhTW9kZWxfU2VydmljZU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNlcnZpY2VOYW1lIiwgbnVsbCwgMCwgMSwgQ1hGRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZEYXRhTW9kZWxfV3NkbERlZmluaXRpb24oKSwgdGhpcy5nZXREZWZpbml0aW9uKCksICJ3c2RsRGVmaW5pdGlvbiIsIG51bGwsIDAsIDEsIENYRkRhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGRGF0YU1vZGVsX1dzZGxMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid3NkbExvY2F0aW9uIiwgbnVsbCwgMCwgMSwgQ1hGRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoamF2YTJXU0NvbnRleHRFQ2xhc3MsIEphdmEyV1NDb250ZXh0LmNsYXNzLCAiSmF2YTJXU0NvbnRleHQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTQ29udGV4dF9Tb2FwMTJCaW5kaW5nKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAic29hcDEyQmluZGluZyIsICJmYWxzZSIsIDAsIDEsIEphdmEyV1NDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVhTREltcG9ydHMoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJnZW5lcmF0ZVhTREltcG9ydHMiLCAidHJ1ZSIsIDAsIDEsIEphdmEyV1NDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdTREwoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJnZW5lcmF0ZVdTREwiLCAidHJ1ZSIsIDAsIDEsIEphdmEyV1NDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyIsICJ0cnVlIiwgMCwgMSwgSmF2YTJXU0NvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NDb250ZXh0X0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCIsICJmYWxzZSIsIDAsIDEsIEphdmEyV1NDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJnZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24iLCAiZmFsc2UiLCAwLCAxLCBKYXZhMldTQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJnZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbiIsICJmYWxzZSIsIDAsIDEsIEphdmEyV1NDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uIiwgImZhbHNlIiwgMCwgMSwgSmF2YTJXU0NvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbiIsICJmYWxzZSIsIDAsIDEsIEphdmEyV1NDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoamF2YTJXU0RhdGFNb2RlbEVDbGFzcywgSmF2YTJXU0RhdGFNb2RlbC5jbGFzcywgIkphdmEyV1NEYXRhTW9kZWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NEYXRhTW9kZWxfQ2xhc3NwYXRoKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjbGFzc3BhdGgiLCBudWxsLCAwLCAxLCBKYXZhMldTRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTRGF0YU1vZGVsX0phdmFTdGFydGluZ1BvaW50KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJqYXZhU3RhcnRpbmdQb2ludCIsIG51bGwsIDAsIDEsIEphdmEyV1NEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NEYXRhTW9kZWxfVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgSmF2YTJXU0RhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YTJXU0RhdGFNb2RlbF9FeHRyYWN0SW50ZXJmYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZXh0cmFjdEludGVyZmFjZSIsIG51bGwsIDAsIDEsIEphdmEyV1NEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NEYXRhTW9kZWxfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSIsIG51bGwsIDAsIDEsIEphdmEyV1NEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIEVHZW5lcmljVHlwZSBnMSA9IGNyZWF0ZUVHZW5lcmljVHlwZSh0aGlzLmdldE1hcCgpKTsKLSAgICAgICAgRUdlbmVyaWNUeXBlIGcyID0gY3JlYXRlRUdlbmVyaWNUeXBlKHRoaXMuZ2V0SU1ldGhvZCgpKTsKLSAgICAgICAgZzEuZ2V0RVR5cGVBcmd1bWVudHMoKS5hZGQoZzIpOwotICAgICAgICBnMiA9IGNyZWF0ZUVHZW5lcmljVHlwZSh0aGlzLmdldE1hcCgpKTsKLSAgICAgICAgZzEuZ2V0RVR5cGVBcmd1bWVudHMoKS5hZGQoZzIpOwotICAgICAgICBFR2VuZXJpY1R5cGUgZzMgPSBjcmVhdGVFR2VuZXJpY1R5cGUoZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSk7Ci0gICAgICAgIGcyLmdldEVUeXBlQXJndW1lbnRzKCkuYWRkKGczKTsKLSAgICAgICAgZzMgPSBjcmVhdGVFR2VuZXJpY1R5cGUoZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuT2JqZWN0KCkpOwotICAgICAgICBnMi5nZXRFVHlwZUFyZ3VtZW50cygpLmFkZChnMyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NEYXRhTW9kZWxfTWV0aG9kTWFwKCksIGcxLCAibWV0aG9kTWFwIiwgbnVsbCwgMCwgMSwgSmF2YTJXU0RhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgZzEgPSBjcmVhdGVFR2VuZXJpY1R5cGUodGhpcy5nZXRNYXAoKSk7Ci0gICAgICAgIGcyID0gY3JlYXRlRUdlbmVyaWNUeXBlKGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCkpOwotICAgICAgICBnMS5nZXRFVHlwZUFyZ3VtZW50cygpLmFkZChnMik7Ci0gICAgICAgIGcyID0gY3JlYXRlRUdlbmVyaWNUeXBlKGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbk9iamVjdCgpKTsKLSAgICAgICAgZzEuZ2V0RVR5cGVBcmd1bWVudHMoKS5hZGQoZzIpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTRGF0YU1vZGVsX0Fubm90YXRpb25NYXAoKSwgZzEsICJhbm5vdGF0aW9uTWFwIiwgbnVsbCwgMCwgMSwgSmF2YTJXU0RhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YTJXU0RhdGFNb2RlbF9Tb3VyY2VEaXJlY3RvcnkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNvdXJjZURpcmVjdG9yeSIsIG51bGwsIDAsIDEsIEphdmEyV1NEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NEYXRhTW9kZWxfUG9ydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBvcnROYW1lIiwgbnVsbCwgMCwgMSwgSmF2YTJXU0RhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICJXU0RMMkphdmFDb250ZXh0IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9HZW5lcmF0ZUltcGxlbWVudGF0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbiIsICJ0cnVlIiwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9Qcm9jZXNzU09BUEhlYWRlcnMoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwcm9jZXNzU09BUEhlYWRlcnMiLCAiZmFsc2UiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAibG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmciLCAidHJ1ZSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyIsICJ0cnVlIiwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9WYWxpZGF0ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInZhbGlkYXRlIiwgInRydWUiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X1dzZGxWZXJzaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3c2RsVmVyc2lvbiIsICIxLjEiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X1VzZURlZmF1bHRWYWx1ZXMoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ1c2VEZWZhdWx0VmFsdWVzIiwgInRydWUiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X1hqY0FyZ3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInhqY0FyZ3MiLCBudWxsLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X05vQWRkcmVzc0JpbmRpbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJub0FkZHJlc3NCaW5kaW5nIiwgImZhbHNlIiwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9YamNVc2VEZWZhdWx0VmFsdWVzKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAieGpjVXNlRGVmYXVsdFZhbHVlcyIsICJmYWxzZSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfWGpjVG9TdHJpbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ4amNUb1N0cmluZyIsICJmYWxzZSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfWGpjVG9TdHJpbmdNdWx0aUxpbmUoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ4amNUb1N0cmluZ011bHRpTGluZSIsICJmYWxzZSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfWGpjVG9TdHJpbmdTaW1wbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ4amNUb1N0cmluZ1NpbXBsZSIsICJmYWxzZSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfWGpjTG9jYXRvcigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInhqY0xvY2F0b3IiLCAiZmFsc2UiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X1hqY1N5bmNNZXRob2RzKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAieGpjU3luY01ldGhvZHMiLCAiZmFsc2UiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X1hqY01hcmtHZW5lcmF0ZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ4amNNYXJrR2VuZXJhdGVkIiwgImZhbHNlIiwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9YamNFcGlzb2RlRmlsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAieGpjRXBpc29kZUZpbGUiLCBudWxsLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X0F1dG9OYW1lUmVzb2x1dGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImF1dG9OYW1lUmVzb2x1dGlvbiIsICJmYWxzZSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyh3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3MsIFdTREwySmF2YURhdGFNb2RlbC5jbGFzcywgIldTREwySmF2YURhdGFNb2RlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgZzEgPSBjcmVhdGVFR2VuZXJpY1R5cGUodGhpcy5nZXRNYXAoKSk7Ci0gICAgICAgIGcyID0gY3JlYXRlRUdlbmVyaWNUeXBlKGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCkpOwotICAgICAgICBnMS5nZXRFVHlwZUFyZ3VtZW50cygpLmFkZChnMik7Ci0gICAgICAgIGcyID0gY3JlYXRlRUdlbmVyaWNUeXBlKGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCkpOwotICAgICAgICBnMS5nZXRFVHlwZUFyZ3VtZW50cygpLmFkZChnMik7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YURhdGFNb2RlbF9JbmNsdWRlZE5hbWVzcGFjZXMoKSwgZzEsICJpbmNsdWRlZE5hbWVzcGFjZXMiLCBudWxsLCAwLCAxLCBXU0RMMkphdmFEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YURhdGFNb2RlbF9CaW5kaW5nRmlsZXMoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImJpbmRpbmdGaWxlcyIsIG51bGwsIDAsIC0xLCBXU0RMMkphdmFEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGcxID0gY3JlYXRlRUdlbmVyaWNUeXBlKHRoaXMuZ2V0TWFwKCkpOwotICAgICAgICBnMiA9IGNyZWF0ZUVHZW5lcmljVHlwZShlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpKTsKLSAgICAgICAgZzEuZ2V0RVR5cGVBcmd1bWVudHMoKS5hZGQoZzIpOwotICAgICAgICBnMiA9IGNyZWF0ZUVHZW5lcmljVHlwZShlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpKTsKLSAgICAgICAgZzEuZ2V0RVR5cGVBcmd1bWVudHMoKS5hZGQoZzIpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFEYXRhTW9kZWxfRXhjbHVkZWROYW1lc3BhY2VzKCksIGcxLCAiZXhjbHVkZWROYW1lc3BhY2VzIiwgbnVsbCwgMCwgMSwgV1NETDJKYXZhRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFEYXRhTW9kZWxfQ2F0YWxvZ0ZpbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNhdGFsb2dGaWxlIiwgbnVsbCwgMCwgMSwgV1NETDJKYXZhRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFEYXRhTW9kZWxfSmF2YVNvdXJjZUZvbGRlcigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiamF2YVNvdXJjZUZvbGRlciIsIG51bGwsIDAsIDEsIFdTREwySmF2YURhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICAvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotICAgICAgICBpbml0RUVudW0oZnJvbnRlbmRFRW51bSwgRnJvbnRlbmQuY2xhc3MsICJGcm9udGVuZCIpOwotICAgICAgICBhZGRFRW51bUxpdGVyYWwoZnJvbnRlbmRFRW51bSwgRnJvbnRlbmQuSkFYV1MpOwotCi0gICAgICAgIGluaXRFRW51bShkYXRhQmluZGluZ0VFbnVtLCBEYXRhQmluZGluZy5jbGFzcywgIkRhdGFCaW5kaW5nIik7Ci0gICAgICAgIGFkZEVFbnVtTGl0ZXJhbChkYXRhQmluZGluZ0VFbnVtLCBEYXRhQmluZGluZy5KQVhCKTsKLQotICAgICAgICAvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKLSAgICAgICAgaW5pdEVEYXRhVHlwZSh1cmxFRGF0YVR5cGUsIGphdmEubmV0LlVSTC5jbGFzcywgIlVSTCIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFRGF0YVR5cGUoZGVmaW5pdGlvbkVEYXRhVHlwZSwgRGVmaW5pdGlvbi5jbGFzcywgIkRlZmluaXRpb24iLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RURhdGFUeXBlKG1hcEVEYXRhVHlwZSwgTWFwLmNsYXNzLCAiTWFwIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVEYXRhVHlwZShpTWV0aG9kRURhdGFUeXBlLCBJTWV0aG9kLmNsYXNzLCAiSU1ldGhvZCIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHJlc291cmNlCi0gICAgICAgIGNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotICAgIH0KLQotfSAvL0NYRlBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL2ltcGwvSmF2YTJXU0RhdGFNb2RlbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9KYXZhMldTRGF0YU1vZGVsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTlmMDdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9KYXZhMldTRGF0YU1vZGVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyNCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiAkSWQ6IEphdmEyV1NEYXRhTW9kZWxJbXBsLmphdmEsdiAxLjIgMjAwOS8wOC8yMyAyMjo1MTo1NyBzY2xhcmtlIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkphdmEyIFdTIERhdGEgTW9kZWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2lzU29hcDEyQmluZGluZyA8ZW0+U29hcDEyIEJpbmRpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2lzR2VuZXJhdGVYU0RJbXBvcnRzIDxlbT5HZW5lcmF0ZSBYU0QgSW1wb3J0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjaXNHZW5lcmF0ZVdTREwgPGVtPkdlbmVyYXRlIFdTREw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2lzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyA8ZW0+R2VuZXJhdGUgV3JhcHBlciBGYXVsdCBCZWFuczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQgPGVtPkFubm90YXRpb24gUHJvY2Vzc2luZyBFbmFibGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNpc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbiA8ZW0+R2VuZXJhdGUgV2ViIE1ldGhvZCBBbm5vdGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNpc0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uIDxlbT5HZW5lcmF0ZSBXZWIgUGFyYW0gQW5ub3RhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbiA8ZW0+R2VuZXJhdGUgUmVxdWVzdCBXcmFwcGVyIEFubm90YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2lzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uIDxlbT5HZW5lcmF0ZSBSZXNwb25zZSBXcmFwcGVyIEFubm90YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2dldENsYXNzcGF0aCA8ZW0+Q2xhc3NwYXRoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNnZXRKYXZhU3RhcnRpbmdQb2ludCA8ZW0+SmF2YSBTdGFydGluZyBQb2ludDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPGVtPlVzZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjaXNFeHRyYWN0SW50ZXJmYWNlIDxlbT5FeHRyYWN0IEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjZ2V0TWV0aG9kTWFwIDxlbT5NZXRob2QgTWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNnZXRBbm5vdGF0aW9uTWFwIDxlbT5Bbm5vdGF0aW9uIE1hcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjZ2V0U291cmNlRGlyZWN0b3J5IDxlbT5Tb3VyY2UgRGlyZWN0b3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNnZXRQb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YTJXU0RhdGFNb2RlbEltcGwgZXh0ZW5kcyBDWEZEYXRhTW9kZWxJbXBsIGltcGxlbWVudHMgSmF2YTJXU0RhdGFNb2RlbCB7Ci0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU29hcDEyQmluZGluZygpIDxlbT5Tb2FwMTIgQmluZGluZzwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNTb2FwMTJCaW5kaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU09BUDEyX0JJTkRJTkdfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU29hcDEyQmluZGluZygpIDxlbT5Tb2FwMTIgQmluZGluZzwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNTb2FwMTJCaW5kaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzb2FwMTJCaW5kaW5nID0gU09BUDEyX0JJTkRJTkdfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVhTREltcG9ydHMoKSA8ZW0+R2VuZXJhdGUgWFNEIEltcG9ydHM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVYU0RJbXBvcnRzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gR0VORVJBVEVfWFNEX0lNUE9SVFNfRURFRkFVTFQgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVhTREltcG9ydHMoKSA8ZW0+R2VuZXJhdGUgWFNEIEltcG9ydHM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVYU0RJbXBvcnRzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0ZVhTREltcG9ydHMgPSBHRU5FUkFURV9YU0RfSU1QT1JUU19FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlV1NETCgpIDxlbT5HZW5lcmF0ZSBXU0RMPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlV1NETCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEdFTkVSQVRFX1dTRExfRURFRkFVTFQgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVdTREwoKSA8ZW0+R2VuZXJhdGUgV1NETDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVdTREwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlV1NETCA9IEdFTkVSQVRFX1dTRExfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkgPGVtPkdlbmVyYXRlIFdyYXBwZXIgRmF1bHQgQmVhbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEdFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlNfRURFRkFVTFQgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkgPGVtPkdlbmVyYXRlIFdyYXBwZXIgRmF1bHQgQmVhbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyA9IEdFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlNfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKSA8ZW0+QW5ub3RhdGlvbiBQcm9jZXNzaW5nIEVuYWJsZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRURfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkgPGVtPkFubm90YXRpb24gUHJvY2Vzc2luZyBFbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkID0gQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRURfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKSA8ZW0+R2VuZXJhdGUgV2ViIE1ldGhvZCBBbm5vdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEdFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTl9FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKSA8ZW0+R2VuZXJhdGUgV2ViIE1ldGhvZCBBbm5vdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uID0gR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKSA8ZW0+R2VuZXJhdGUgV2ViIFBhcmFtIEFubm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBHRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTl9FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpIDxlbT5HZW5lcmF0ZSBXZWIgUGFyYW0gQW5ub3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24gPSBHRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCkgPGVtPkdlbmVyYXRlIFJlcXVlc3QgV3JhcHBlciBBbm5vdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT05fRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKSA8ZW0+R2VuZXJhdGUgUmVxdWVzdCBXcmFwcGVyIEFubm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uID0gR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT05fRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKSA8ZW0+R2VuZXJhdGUgUmVzcG9uc2UgV3JhcHBlciBBbm5vdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEdFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTl9FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKSA8ZW0+R2VuZXJhdGUgUmVzcG9uc2UgV3JhcHBlciBBbm5vdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uID0gR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzcGF0aCgpIDxlbT5DbGFzc3BhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldENsYXNzcGF0aCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzcGF0aCgpIDxlbT5DbGFzc3BhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldENsYXNzcGF0aCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjbGFzc3BhdGggPSBDTEFTU1BBVEhfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKSA8ZW0+SmF2YSBTdGFydGluZyBQb2ludDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfU1RBUlRJTkdfUE9JTlRfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKSA8ZW0+SmF2YSBTdGFydGluZyBQb2ludDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgamF2YVN0YXJ0aW5nUG9pbnQgPSBKQVZBX1NUQVJUSU5HX1BPSU5UX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgPGVtPlVzZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBVU0VfU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgPGVtPlVzZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IFVTRV9TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4dHJhY3RJbnRlcmZhY2UoKSA8ZW0+RXh0cmFjdCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzRXh0cmFjdEludGVyZmFjZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVYVFJBQ1RfSU5URVJGQUNFX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4dHJhY3RJbnRlcmZhY2UoKSA8ZW0+RXh0cmFjdCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzRXh0cmFjdEludGVyZmFjZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXh0cmFjdEludGVyZmFjZSA9IEVYVFJBQ1RfSU5URVJGQUNFX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSA9IFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX05BTUVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RNYXAoKSA8ZW0+TWV0aG9kIE1hcDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0TWV0aG9kTWFwKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiBtZXRob2RNYXA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbm5vdGF0aW9uTWFwKCkgPGVtPkFubm90YXRpb24gTWFwPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRBbm5vdGF0aW9uTWFwKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgQm9vbGVhbj4gYW5ub3RhdGlvbk1hcDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb3VyY2VEaXJlY3RvcnkoKSA8ZW0+U291cmNlIERpcmVjdG9yeTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0U291cmNlRGlyZWN0b3J5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfRElSRUNUT1JZX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvdXJjZURpcmVjdG9yeSgpIDxlbT5Tb3VyY2UgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRTb3VyY2VEaXJlY3RvcnkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgc291cmNlRGlyZWN0b3J5ID0gU09VUkNFX0RJUkVDVE9SWV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0TmFtZSgpIDxlbT5Qb3J0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFBvcnROYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9ydE5hbWUoKSA8ZW0+UG9ydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRQb3J0TmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBwb3J0TmFtZSA9IFBPUlRfTkFNRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBKYXZhMldTRGF0YU1vZGVsSW1wbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIENYRlBhY2thZ2UuTGl0ZXJhbHMuSkFWQTJfV1NfREFUQV9NT0RFTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NvYXAxMkJpbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiBzb2FwMTJCaW5kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNvYXAxMkJpbmRpbmcoYm9vbGVhbiBuZXdTb2FwMTJCaW5kaW5nKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkU29hcDEyQmluZGluZyA9IHNvYXAxMkJpbmRpbmc7Ci0gICAgICAgIHNvYXAxMkJpbmRpbmcgPSBuZXdTb2FwMTJCaW5kaW5nOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NPQVAxMl9CSU5ESU5HLCBvbGRTb2FwMTJCaW5kaW5nLCBzb2FwMTJCaW5kaW5nKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVhTREltcG9ydHMoKSB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZVhTREltcG9ydHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVYU0RJbXBvcnRzKGJvb2xlYW4gbmV3R2VuZXJhdGVYU0RJbXBvcnRzKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkR2VuZXJhdGVYU0RJbXBvcnRzID0gZ2VuZXJhdGVYU0RJbXBvcnRzOwotICAgICAgICBnZW5lcmF0ZVhTREltcG9ydHMgPSBuZXdHZW5lcmF0ZVhTREltcG9ydHM7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfWFNEX0lNUE9SVFMsIG9sZEdlbmVyYXRlWFNESW1wb3J0cywgZ2VuZXJhdGVYU0RJbXBvcnRzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVdTREwoKSB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZVdTREw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVXU0RMKGJvb2xlYW4gbmV3R2VuZXJhdGVXU0RMKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkR2VuZXJhdGVXU0RMID0gZ2VuZXJhdGVXU0RMOwotICAgICAgICBnZW5lcmF0ZVdTREwgPSBuZXdHZW5lcmF0ZVdTREw7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1NETCwgb2xkR2VuZXJhdGVXU0RMLCBnZW5lcmF0ZVdTREwpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKSB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoYm9vbGVhbiBuZXdHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyA9IGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnM7Ci0gICAgICAgIGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMgPSBuZXdHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlMsIG9sZEdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMsIGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoYm9vbGVhbiBuZXdBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQgPSBhbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQ7Ci0gICAgICAgIGFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCA9IG5ld0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZDsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRCwgb2xkQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkLCBhbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oYm9vbGVhbiBuZXdHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24pIHsKLSAgICAgICAgYm9vbGVhbiBvbGRHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24gPSBnZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb247Ci0gICAgICAgIGdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbiA9IG5ld0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT04sIG9sZEdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbiwgZ2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKGJvb2xlYW4gbmV3R2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24pIHsKLSAgICAgICAgYm9vbGVhbiBvbGRHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbiA9IGdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uOwotICAgICAgICBnZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbiA9IG5ld0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OLCBvbGRHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbiwgZ2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oYm9vbGVhbiBuZXdHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbikgewotICAgICAgICBib29sZWFuIG9sZEdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uID0gZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb247Ci0gICAgICAgIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uID0gbmV3R2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb247Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT04sIG9sZEdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uLCBnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbihib29sZWFuIG5ld0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbikgewotICAgICAgICBib29sZWFuIG9sZEdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbiA9IGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbjsKLSAgICAgICAgZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uID0gbmV3R2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTiwgb2xkR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uLCBnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzcGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzcGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoU3RyaW5nIG5ld0NsYXNzcGF0aCkgewotICAgICAgICBTdHJpbmcgb2xkQ2xhc3NwYXRoID0gY2xhc3NwYXRoOwotICAgICAgICBjbGFzc3BhdGggPSBuZXdDbGFzc3BhdGg7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQ0xBU1NQQVRILCBvbGRDbGFzc3BhdGgsIGNsYXNzcGF0aCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKSB7Ci0gICAgICAgIHJldHVybiBqYXZhU3RhcnRpbmdQb2ludDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhU3RhcnRpbmdQb2ludChTdHJpbmcgbmV3SmF2YVN0YXJ0aW5nUG9pbnQpIHsKLSAgICAgICAgU3RyaW5nIG9sZEphdmFTdGFydGluZ1BvaW50ID0gamF2YVN0YXJ0aW5nUG9pbnQ7Ci0gICAgICAgIGphdmFTdGFydGluZ1BvaW50ID0gbmV3SmF2YVN0YXJ0aW5nUG9pbnQ7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fSkFWQV9TVEFSVElOR19QT0lOVCwgb2xkSmF2YVN0YXJ0aW5nUG9pbnQsIGphdmFTdGFydGluZ1BvaW50KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7Ci0gICAgICAgIHJldHVybiB1c2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKGJvb2xlYW4gbmV3VXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gdXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotICAgICAgICB1c2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSBuZXdVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fVVNFX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFLCBvbGRVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UsIHVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRXh0cmFjdEludGVyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGV4dHJhY3RJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXh0cmFjdEludGVyZmFjZShib29sZWFuIG5ld0V4dHJhY3RJbnRlcmZhY2UpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRFeHRyYWN0SW50ZXJmYWNlID0gZXh0cmFjdEludGVyZmFjZTsKLSAgICAgICAgZXh0cmFjdEludGVyZmFjZSA9IG5ld0V4dHJhY3RJbnRlcmZhY2U7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fRVhUUkFDVF9JTlRFUkZBQ0UsIG9sZEV4dHJhY3RJbnRlcmZhY2UsIGV4dHJhY3RJbnRlcmZhY2UpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoU3RyaW5nIG5ld1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUpIHsKLSAgICAgICAgU3RyaW5nIG9sZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUgPSBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lOwotICAgICAgICBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lID0gbmV3U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9OQU1FLCBvbGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lLCBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIE1hcDxJTWV0aG9kLCBNYXA8U3RyaW5nLCBCb29sZWFuPj4gZ2V0TWV0aG9kTWFwKCkgewotICAgICAgICByZXR1cm4gbWV0aG9kTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1ldGhvZE1hcChNYXA8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+IG5ld01ldGhvZE1hcCkgewotICAgICAgICBNYXA8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+IG9sZE1ldGhvZE1hcCA9IG1ldGhvZE1hcDsKLSAgICAgICAgbWV0aG9kTWFwID0gbmV3TWV0aG9kTWFwOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX01FVEhPRF9NQVAsIG9sZE1ldGhvZE1hcCwgbWV0aG9kTWFwKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIEJvb2xlYW4+IGdldEFubm90YXRpb25NYXAoKSB7Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFubm90YXRpb25NYXAoTWFwPFN0cmluZywgQm9vbGVhbj4gbmV3QW5ub3RhdGlvbk1hcCkgewotICAgICAgICBNYXA8U3RyaW5nLCBCb29sZWFuPiBvbGRBbm5vdGF0aW9uTWFwID0gYW5ub3RhdGlvbk1hcDsKLSAgICAgICAgYW5ub3RhdGlvbk1hcCA9IG5ld0Fubm90YXRpb25NYXA7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQU5OT1RBVElPTl9NQVAsIG9sZEFubm90YXRpb25NYXAsIGFubm90YXRpb25NYXApKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZURpcmVjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZURpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VEaXJlY3RvcnkoU3RyaW5nIG5ld1NvdXJjZURpcmVjdG9yeSkgewotICAgICAgICBTdHJpbmcgb2xkU291cmNlRGlyZWN0b3J5ID0gc291cmNlRGlyZWN0b3J5OwotICAgICAgICBzb3VyY2VEaXJlY3RvcnkgPSBuZXdTb3VyY2VEaXJlY3Rvcnk7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU09VUkNFX0RJUkVDVE9SWSwgb2xkU291cmNlRGlyZWN0b3J5LCBzb3VyY2VEaXJlY3RvcnkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKCkgewotICAgICAgICByZXR1cm4gcG9ydE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIG5ld1BvcnROYW1lKSB7Ci0gICAgICAgIFN0cmluZyBvbGRQb3J0TmFtZSA9IHBvcnROYW1lOwotICAgICAgICBwb3J0TmFtZSA9IG5ld1BvcnROYW1lOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1BPUlRfTkFNRSwgb2xkUG9ydE5hbWUsIHBvcnROYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NPQVAxMl9CSU5ESU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBpc1NvYXAxMkJpbmRpbmcoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfWFNEX0lNUE9SVFM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzR2VuZXJhdGVYU0RJbXBvcnRzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dTREw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzR2VuZXJhdGVXU0RMKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0NMQVNTUEFUSDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2xhc3NwYXRoKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fSkFWQV9TVEFSVElOR19QT0lOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19VU0VfU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0VYVFJBQ1RfSU5URVJGQUNFOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0V4dHJhY3RJbnRlcmZhY2UoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX01FVEhPRF9NQVA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldE1ldGhvZE1hcCgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0FOTk9UQVRJT05fTUFQOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRBbm5vdGF0aW9uTWFwKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU09VUkNFX0RJUkVDVE9SWToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U291cmNlRGlyZWN0b3J5KCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fUE9SVF9OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRQb3J0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU09BUDEyX0JJTkRJTkc6Ci0gICAgICAgICAgICAgICAgc2V0U29hcDEyQmluZGluZygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfWFNEX0lNUE9SVFM6Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVYU0RJbXBvcnRzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XU0RMOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlV1NETCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUzoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRDoKLSAgICAgICAgICAgICAgICBzZXRBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQ0xBU1NQQVRIOgotICAgICAgICAgICAgICAgIHNldENsYXNzcGF0aCgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fSkFWQV9TVEFSVElOR19QT0lOVDoKLSAgICAgICAgICAgICAgICBzZXRKYXZhU3RhcnRpbmdQb2ludCgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fVVNFX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOgotICAgICAgICAgICAgICAgIHNldFVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fRVhUUkFDVF9JTlRFUkZBQ0U6Ci0gICAgICAgICAgICAgICAgc2V0RXh0cmFjdEludGVyZmFjZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19NRVRIT0RfTUFQOgotICAgICAgICAgICAgICAgIHNldE1ldGhvZE1hcCgoTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0FOTk9UQVRJT05fTUFQOgotICAgICAgICAgICAgICAgIHNldEFubm90YXRpb25NYXAoKE1hcDxTdHJpbmcsIEJvb2xlYW4+KW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU09VUkNFX0RJUkVDVE9SWToKLSAgICAgICAgICAgICAgICBzZXRTb3VyY2VEaXJlY3RvcnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1BPUlRfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRQb3J0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NPQVAxMl9CSU5ESU5HOgotICAgICAgICAgICAgICAgIHNldFNvYXAxMkJpbmRpbmcoU09BUDEyX0JJTkRJTkdfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9YU0RfSU1QT1JUUzoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZVhTREltcG9ydHMoR0VORVJBVEVfWFNEX0lNUE9SVFNfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XU0RMOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlV1NETChHRU5FUkFURV9XU0RMX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUzoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKEdFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlNfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRDoKLSAgICAgICAgICAgICAgICBzZXRBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRURfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKEdFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKEdFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT05fRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKEdFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0NMQVNTUEFUSDoKLSAgICAgICAgICAgICAgICBzZXRDbGFzc3BhdGgoQ0xBU1NQQVRIX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fSkFWQV9TVEFSVElOR19QT0lOVDoKLSAgICAgICAgICAgICAgICBzZXRKYXZhU3RhcnRpbmdQb2ludChKQVZBX1NUQVJUSU5HX1BPSU5UX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fVVNFX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOgotICAgICAgICAgICAgICAgIHNldFVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZShVU0VfU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19FWFRSQUNUX0lOVEVSRkFDRToKLSAgICAgICAgICAgICAgICBzZXRFeHRyYWN0SW50ZXJmYWNlKEVYVFJBQ1RfSU5URVJGQUNFX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX05BTUVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19NRVRIT0RfTUFQOgotICAgICAgICAgICAgICAgIHNldE1ldGhvZE1hcCgoTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiludWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQU5OT1RBVElPTl9NQVA6Ci0gICAgICAgICAgICAgICAgc2V0QW5ub3RhdGlvbk1hcCgoTWFwPFN0cmluZywgQm9vbGVhbj4pbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NPVVJDRV9ESVJFQ1RPUlk6Ci0gICAgICAgICAgICAgICAgc2V0U291cmNlRGlyZWN0b3J5KFNPVVJDRV9ESVJFQ1RPUllfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19QT1JUX05BTUU6Ci0gICAgICAgICAgICAgICAgc2V0UG9ydE5hbWUoUE9SVF9OQU1FX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TT0FQMTJfQklORElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gc29hcDEyQmluZGluZyAhPSBTT0FQMTJfQklORElOR19FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9YU0RfSU1QT1JUUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVYU0RJbXBvcnRzICE9IEdFTkVSQVRFX1hTRF9JTVBPUlRTX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dTREw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlV1NETCAhPSBHRU5FUkFURV9XU0RMX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMgIT0gR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOU19FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkICE9IEFOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uICE9IEdFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTl9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24gIT0gR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT05fRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uICE9IEdFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uICE9IEdFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTl9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19DTEFTU1BBVEg6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENMQVNTUEFUSF9FREVGQVVMVCA9PSBudWxsID8gY2xhc3NwYXRoICE9IG51bGwgOiAhQ0xBU1NQQVRIX0VERUZBVUxULmVxdWFscyhjbGFzc3BhdGgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0pBVkFfU1RBUlRJTkdfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEpBVkFfU1RBUlRJTkdfUE9JTlRfRURFRkFVTFQgPT0gbnVsbCA/IGphdmFTdGFydGluZ1BvaW50ICE9IG51bGwgOiAhSkFWQV9TVEFSVElOR19QT0lOVF9FREVGQVVMVC5lcXVhbHMoamF2YVN0YXJ0aW5nUG9pbnQpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1VTRV9TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLSAgICAgICAgICAgICAgICByZXR1cm4gdXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlICE9IFVTRV9TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19FWFRSQUNUX0lOVEVSRkFDRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFjdEludGVyZmFjZSAhPSBFWFRSQUNUX0lOVEVSRkFDRV9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lICE9IG51bGwgOiAhU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTkFNRV9FREVGQVVMVC5lcXVhbHMoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fTUVUSE9EX01BUDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kTWFwICE9IG51bGw7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQU5OT1RBVElPTl9NQVA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25NYXAgIT0gbnVsbDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TT1VSQ0VfRElSRUNUT1JZOgotICAgICAgICAgICAgICAgIHJldHVybiBTT1VSQ0VfRElSRUNUT1JZX0VERUZBVUxUID09IG51bGwgPyBzb3VyY2VEaXJlY3RvcnkgIT0gbnVsbCA6ICFTT1VSQ0VfRElSRUNUT1JZX0VERUZBVUxULmVxdWFscyhzb3VyY2VEaXJlY3RvcnkpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1BPUlRfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gUE9SVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwb3J0TmFtZSAhPSBudWxsIDogIVBPUlRfTkFNRV9FREVGQVVMVC5lcXVhbHMocG9ydE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0gICAgICAgIGlmIChiYXNlQ2xhc3MgPT0gSmF2YTJXU0NvbnRleHQuY2xhc3MpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TT0FQMTJfQklORElORzogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fU09BUDEyX0JJTkRJTkc7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1hTRF9JTVBPUlRTOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9YU0RfSU1QT1JUUzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1NETDogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1NETDsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUzogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRUQ6IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT046IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTjsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT046IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTjogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT047Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTjogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotICAgICAgICBpZiAoYmFzZUNsYXNzID09IEphdmEyV1NDb250ZXh0LmNsYXNzKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fU09BUDEyX0JJTkRJTkc6IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NPQVAxMl9CSU5ESU5HOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9YU0RfSU1QT1JUUzogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfWFNEX0lNUE9SVFM7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dTREw6IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dTREw7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlM6IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlM7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRDsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT047Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTjsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT046IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT046IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIChzb2FwMTJCaW5kaW5nOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChzb2FwMTJCaW5kaW5nKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBnZW5lcmF0ZVhTREltcG9ydHM6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGdlbmVyYXRlWFNESW1wb3J0cyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZ2VuZXJhdGVXU0RMOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChnZW5lcmF0ZVdTREwpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnM6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZDogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBnZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb246ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZ2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb246ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24pOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjbGFzc3BhdGg6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGNsYXNzcGF0aCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgamF2YVN0YXJ0aW5nUG9pbnQ6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGphdmFTdGFydGluZ1BvaW50KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB1c2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZXh0cmFjdEludGVyZmFjZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZXh0cmFjdEludGVyZmFjZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbWV0aG9kTWFwOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChtZXRob2RNYXApOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGFubm90YXRpb25NYXA6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGFubm90YXRpb25NYXApOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHNvdXJjZURpcmVjdG9yeTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoc291cmNlRGlyZWN0b3J5KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBwb3J0TmFtZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQocG9ydE5hbWUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0gLy9KYXZhMldTRGF0YU1vZGVsSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL1dTREwySmF2YURhdGFNb2RlbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9XU0RMMkphdmFEYXRhTW9kZWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYTcwNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL1dTREwySmF2YURhdGFNb2RlbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOTcgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogJElkOiBXU0RMMkphdmFEYXRhTW9kZWxJbXBsLmphdmEsdiAxLjIgMjAwOS8wNC8wNiAyMTozMzoxNCBzY2xhcmtlIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETDIgSmF2YSBEYXRhIE1vZGVsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2lzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbiA8ZW0+R2VuZXJhdGUgSW1wbGVtZW50YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNQcm9jZXNzU09BUEhlYWRlcnMgPGVtPlByb2Nlc3MgU09BUCBIZWFkZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2lzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcgPGVtPkxvYWQgRGVmYXVsdCBOYW1lc3BhY2UgUGFja2FnZSBOYW1lIE1hcHBpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyA8ZW0+TG9hZCBEZWZhdWx0IEV4Y2x1ZGVzIE5hbWVwc2FjZSBNYXBwaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2lzVmFsaWRhdGUgPGVtPlZhbGlkYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2dldFdzZGxWZXJzaW9uIDxlbT5Xc2RsIFZlcnNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNVc2VEZWZhdWx0VmFsdWVzIDxlbT5Vc2UgRGVmYXVsdCBWYWx1ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjZ2V0WGpjQXJncyA8ZW0+WGpjIEFyZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNOb0FkZHJlc3NCaW5kaW5nIDxlbT5ObyBBZGRyZXNzIEJpbmRpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNYamNVc2VEZWZhdWx0VmFsdWVzIDxlbT5YamMgVXNlIERlZmF1bHQgVmFsdWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2lzWGpjVG9TdHJpbmcgPGVtPlhqYyBUbyBTdHJpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNYamNUb1N0cmluZ011bHRpTGluZSA8ZW0+WGpjIFRvIFN0cmluZyBNdWx0aSBMaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2lzWGpjVG9TdHJpbmdTaW1wbGUgPGVtPlhqYyBUbyBTdHJpbmcgU2ltcGxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2lzWGpjTG9jYXRvciA8ZW0+WGpjIExvY2F0b3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNYamNTeW5jTWV0aG9kcyA8ZW0+WGpjIFN5bmMgTWV0aG9kczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNpc1hqY01hcmtHZW5lcmF0ZWQgPGVtPlhqYyBNYXJrIEdlbmVyYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNnZXRYamNFcGlzb2RlRmlsZSA8ZW0+WGpjIEVwaXNvZGUgRmlsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNpc0F1dG9OYW1lUmVzb2x1dGlvbiA8ZW0+QXV0byBOYW1lIFJlc29sdXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjZ2V0SW5jbHVkZWROYW1lc3BhY2VzIDxlbT5JbmNsdWRlZCBOYW1lc3BhY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2dldEJpbmRpbmdGaWxlcyA8ZW0+QmluZGluZyBGaWxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNnZXRFeGNsdWRlZE5hbWVzcGFjZXMgPGVtPkV4Y2x1ZGVkIE5hbWVzcGFjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjZ2V0Q2F0YWxvZ0ZpbGUgPGVtPkNhdGFsb2cgRmlsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNnZXRKYXZhU291cmNlRm9sZGVyIDxlbT5KYXZhIFNvdXJjZSBGb2xkZXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFEYXRhTW9kZWxJbXBsIGV4dGVuZHMgQ1hGRGF0YU1vZGVsSW1wbCBpbXBsZW1lbnRzIFdTREwySmF2YURhdGFNb2RlbCB7Ci0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpIDxlbT5HZW5lcmF0ZSBJbXBsZW1lbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gR0VORVJBVEVfSU1QTEVNRU5UQVRJT05fRURFRkFVTFQgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkgPGVtPkdlbmVyYXRlIEltcGxlbWVudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlSW1wbGVtZW50YXRpb24gPSBHRU5FUkFURV9JTVBMRU1FTlRBVElPTl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb2Nlc3NTT0FQSGVhZGVycygpIDxlbT5Qcm9jZXNzIFNPQVAgSGVhZGVyczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNQcm9jZXNzU09BUEhlYWRlcnMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUk9DRVNTX1NPQVBfSEVBREVSU19FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQcm9jZXNzU09BUEhlYWRlcnMoKSA8ZW0+UHJvY2VzcyBTT0FQIEhlYWRlcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzUHJvY2Vzc1NPQVBIZWFkZXJzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzU09BUEhlYWRlcnMgPSBQUk9DRVNTX1NPQVBfSEVBREVSU19FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkgPGVtPkxvYWQgRGVmYXVsdCBOYW1lc3BhY2UgUGFja2FnZSBOYW1lIE1hcHBpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HX0VERUZBVUxUID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKSA8ZW0+TG9hZCBEZWZhdWx0IE5hbWVzcGFjZSBQYWNrYWdlIE5hbWUgTWFwcGluZzwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcgPSBMT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKSA8ZW0+TG9hZCBEZWZhdWx0IEV4Y2x1ZGVzIE5hbWVwc2FjZSBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HX0VERUZBVUxUID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKSA8ZW0+TG9hZCBEZWZhdWx0IEV4Y2x1ZGVzIE5hbWVwc2FjZSBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyA9IExPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElOR19FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ZhbGlkYXRlKCkgPGVtPlZhbGlkYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1ZhbGlkYXRlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkFMSURBVEVfRURFRkFVTFQgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNWYWxpZGF0ZSgpIDxlbT5WYWxpZGF0ZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNWYWxpZGF0ZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUgPSBWQUxJREFURV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsVmVyc2lvbigpIDxlbT5Xc2RsIFZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFdzZGxWZXJzaW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX1ZFUlNJT05fRURFRkFVTFQgPSAiMS4xIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxWZXJzaW9uKCkgPGVtPldzZGwgVmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0V3NkbFZlcnNpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgd3NkbFZlcnNpb24gPSBXU0RMX1ZFUlNJT05fRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVc2VEZWZhdWx0VmFsdWVzKCkgPGVtPlVzZSBEZWZhdWx0IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNVc2VEZWZhdWx0VmFsdWVzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVNFX0RFRkFVTFRfVkFMVUVTX0VERUZBVUxUID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXNlRGVmYXVsdFZhbHVlcygpIDxlbT5Vc2UgRGVmYXVsdCBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzVXNlRGVmYXVsdFZhbHVlcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlRGVmYXVsdFZhbHVlcyA9IFVTRV9ERUZBVUxUX1ZBTFVFU19FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYamNBcmdzKCkgPGVtPlhqYyBBcmdzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRYamNBcmdzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfQVJHU19FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYamNBcmdzKCkgPGVtPlhqYyBBcmdzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRYamNBcmdzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHhqY0FyZ3MgPSBYSkNfQVJHU19FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05vQWRkcmVzc0JpbmRpbmcoKSA8ZW0+Tm8gQWRkcmVzcyBCaW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc05vQWRkcmVzc0JpbmRpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBOT19BRERSRVNTX0JJTkRJTkdfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTm9BZGRyZXNzQmluZGluZygpIDxlbT5ObyBBZGRyZXNzIEJpbmRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzTm9BZGRyZXNzQmluZGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbm9BZGRyZXNzQmluZGluZyA9IE5PX0FERFJFU1NfQklORElOR19FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1hqY1VzZURlZmF1bHRWYWx1ZXMoKSA8ZW0+WGpjIFVzZSBEZWZhdWx0IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gWEpDX1VTRV9ERUZBVUxUX1ZBTFVFU19FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkgPGVtPlhqYyBVc2UgRGVmYXVsdCBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzWGpjVXNlRGVmYXVsdFZhbHVlcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4geGpjVXNlRGVmYXVsdFZhbHVlcyA9IFhKQ19VU0VfREVGQVVMVF9WQUxVRVNfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYamNUb1N0cmluZygpIDxlbT5YamMgVG8gU3RyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1hqY1RvU3RyaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gWEpDX1RPX1NUUklOR19FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYamNUb1N0cmluZygpIDxlbT5YamMgVG8gU3RyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1hqY1RvU3RyaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB4amNUb1N0cmluZyA9IFhKQ19UT19TVFJJTkdfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYamNUb1N0cmluZ011bHRpTGluZSgpIDxlbT5YamMgVG8gU3RyaW5nIE11bHRpIExpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBYSkNfVE9fU1RSSU5HX01VTFRJX0xJTkVfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKSA8ZW0+WGpjIFRvIFN0cmluZyBNdWx0aSBMaW5lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB4amNUb1N0cmluZ011bHRpTGluZSA9IFhKQ19UT19TVFJJTkdfTVVMVElfTElORV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1hqY1RvU3RyaW5nU2ltcGxlKCkgPGVtPlhqYyBUbyBTdHJpbmcgU2ltcGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1hqY1RvU3RyaW5nU2ltcGxlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gWEpDX1RPX1NUUklOR19TSU1QTEVfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzWGpjVG9TdHJpbmdTaW1wbGUoKSA8ZW0+WGpjIFRvIFN0cmluZyBTaW1wbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzWGpjVG9TdHJpbmdTaW1wbGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHhqY1RvU3RyaW5nU2ltcGxlID0gWEpDX1RPX1NUUklOR19TSU1QTEVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYamNMb2NhdG9yKCkgPGVtPlhqYyBMb2NhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1hqY0xvY2F0b3IoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBYSkNfTE9DQVRPUl9FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYamNMb2NhdG9yKCkgPGVtPlhqYyBMb2NhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1hqY0xvY2F0b3IoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHhqY0xvY2F0b3IgPSBYSkNfTE9DQVRPUl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1hqY1N5bmNNZXRob2RzKCkgPGVtPlhqYyBTeW5jIE1ldGhvZHM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzWGpjU3luY01ldGhvZHMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBYSkNfU1lOQ19NRVRIT0RTX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1hqY1N5bmNNZXRob2RzKCkgPGVtPlhqYyBTeW5jIE1ldGhvZHM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzWGpjU3luY01ldGhvZHMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHhqY1N5bmNNZXRob2RzID0gWEpDX1NZTkNfTUVUSE9EU19FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1hqY01hcmtHZW5lcmF0ZWQoKSA8ZW0+WGpjIE1hcmsgR2VuZXJhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1hqY01hcmtHZW5lcmF0ZWQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBYSkNfTUFSS19HRU5FUkFURURfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzWGpjTWFya0dlbmVyYXRlZCgpIDxlbT5YamMgTWFyayBHZW5lcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzWGpjTWFya0dlbmVyYXRlZCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4geGpjTWFya0dlbmVyYXRlZCA9IFhKQ19NQVJLX0dFTkVSQVRFRF9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYamNFcGlzb2RlRmlsZSgpIDxlbT5YamMgRXBpc29kZSBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRYamNFcGlzb2RlRmlsZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX0VQSVNPREVfRklMRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYamNFcGlzb2RlRmlsZSgpIDxlbT5YamMgRXBpc29kZSBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRYamNFcGlzb2RlRmlsZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyB4amNFcGlzb2RlRmlsZSA9IFhKQ19FUElTT0RFX0ZJTEVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBdXRvTmFtZVJlc29sdXRpb24oKSA8ZW0+QXV0byBOYW1lIFJlc29sdXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzQXV0b05hbWVSZXNvbHV0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQVVUT19OQU1FX1JFU09MVVRJT05fRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQXV0b05hbWVSZXNvbHV0aW9uKCkgPGVtPkF1dG8gTmFtZSBSZXNvbHV0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0F1dG9OYW1lUmVzb2x1dGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYXV0b05hbWVSZXNvbHV0aW9uID0gQVVUT19OQU1FX1JFU09MVVRJT05fRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmNsdWRlZE5hbWVzcGFjZXMoKSA8ZW0+SW5jbHVkZWQgTmFtZXNwYWNlczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgU3RyaW5nPiBpbmNsdWRlZE5hbWVzcGFjZXM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCaW5kaW5nRmlsZXMoKSA8ZW0+QmluZGluZyBGaWxlczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRCaW5kaW5nRmlsZXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IGJpbmRpbmdGaWxlczsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4Y2x1ZGVkTmFtZXNwYWNlcygpIDxlbT5FeGNsdWRlZCBOYW1lc3BhY2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRFeGNsdWRlZE5hbWVzcGFjZXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBTdHJpbmc+IGV4Y2x1ZGVkTmFtZXNwYWNlczsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXRhbG9nRmlsZSgpIDxlbT5DYXRhbG9nIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldENhdGFsb2dGaWxlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRBTE9HX0ZJTEVfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0YWxvZ0ZpbGUoKSA8ZW0+Q2F0YWxvZyBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRDYXRhbG9nRmlsZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjYXRhbG9nRmlsZSA9IENBVEFMT0dfRklMRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXZhU291cmNlRm9sZGVyKCkgPGVtPkphdmEgU291cmNlIEZvbGRlcjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0SmF2YVNvdXJjZUZvbGRlcigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9TT1VSQ0VfRk9MREVSX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphdmFTb3VyY2VGb2xkZXIoKSA8ZW0+SmF2YSBTb3VyY2UgRm9sZGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRKYXZhU291cmNlRm9sZGVyKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGphdmFTb3VyY2VGb2xkZXIgPSBKQVZBX1NPVVJDRV9GT0xERVJfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgV1NETDJKYXZhRGF0YU1vZGVsSW1wbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIENYRlBhY2thZ2UuTGl0ZXJhbHMuV1NETDJfSkFWQV9EQVRBX01PREVMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlSW1wbGVtZW50YXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVJbXBsZW1lbnRhdGlvbihib29sZWFuIG5ld0dlbmVyYXRlSW1wbGVtZW50YXRpb24pIHsKLSAgICAgICAgYm9vbGVhbiBvbGRHZW5lcmF0ZUltcGxlbWVudGF0aW9uID0gZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbjsKLSAgICAgICAgZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbiA9IG5ld0dlbmVyYXRlSW1wbGVtZW50YXRpb247Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTiwgb2xkR2VuZXJhdGVJbXBsZW1lbnRhdGlvbiwgZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUHJvY2Vzc1NPQVBIZWFkZXJzKCkgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1NPQVBIZWFkZXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NTT0FQSGVhZGVycyhib29sZWFuIG5ld1Byb2Nlc3NTT0FQSGVhZGVycykgewotICAgICAgICBib29sZWFuIG9sZFByb2Nlc3NTT0FQSGVhZGVycyA9IHByb2Nlc3NTT0FQSGVhZGVyczsKLSAgICAgICAgcHJvY2Vzc1NPQVBIZWFkZXJzID0gbmV3UHJvY2Vzc1NPQVBIZWFkZXJzOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fUFJPQ0VTU19TT0FQX0hFQURFUlMsIG9sZFByb2Nlc3NTT0FQSGVhZGVycywgcHJvY2Vzc1NPQVBIZWFkZXJzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpIHsKLSAgICAgICAgcmV0dXJuIGxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKGJvb2xlYW4gbmV3TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyA9IGxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nOwotICAgICAgICBsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyA9IG5ld0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElORywgb2xkTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcsIGxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpIHsKLSAgICAgICAgcmV0dXJuIGxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKGJvb2xlYW4gbmV3TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyA9IGxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nOwotICAgICAgICBsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyA9IG5ld0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HLCBvbGRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZywgbG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRlKCkgewotICAgICAgICByZXR1cm4gdmFsaWRhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGUoYm9vbGVhbiBuZXdWYWxpZGF0ZSkgewotICAgICAgICBib29sZWFuIG9sZFZhbGlkYXRlID0gdmFsaWRhdGU7Ci0gICAgICAgIHZhbGlkYXRlID0gbmV3VmFsaWRhdGU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19WQUxJREFURSwgb2xkVmFsaWRhdGUsIHZhbGlkYXRlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRXc2RsVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHdzZGxWZXJzaW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdzZGxWZXJzaW9uKFN0cmluZyBuZXdXc2RsVmVyc2lvbikgewotICAgICAgICBTdHJpbmcgb2xkV3NkbFZlcnNpb24gPSB3c2RsVmVyc2lvbjsKLSAgICAgICAgd3NkbFZlcnNpb24gPSBuZXdXc2RsVmVyc2lvbjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1dTRExfVkVSU0lPTiwgb2xkV3NkbFZlcnNpb24sIHdzZGxWZXJzaW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VEZWZhdWx0VmFsdWVzKCkgewotICAgICAgICByZXR1cm4gdXNlRGVmYXVsdFZhbHVlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VEZWZhdWx0VmFsdWVzKGJvb2xlYW4gbmV3VXNlRGVmYXVsdFZhbHVlcykgewotICAgICAgICBib29sZWFuIG9sZFVzZURlZmF1bHRWYWx1ZXMgPSB1c2VEZWZhdWx0VmFsdWVzOwotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzID0gbmV3VXNlRGVmYXVsdFZhbHVlczsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1VTRV9ERUZBVUxUX1ZBTFVFUywgb2xkVXNlRGVmYXVsdFZhbHVlcywgdXNlRGVmYXVsdFZhbHVlcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WGpjQXJncygpIHsKLSAgICAgICAgcmV0dXJuIHhqY0FyZ3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0WGpjQXJncyhTdHJpbmcgbmV3WGpjQXJncykgewotICAgICAgICBTdHJpbmcgb2xkWGpjQXJncyA9IHhqY0FyZ3M7Ci0gICAgICAgIHhqY0FyZ3MgPSBuZXdYamNBcmdzOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0FSR1MsIG9sZFhqY0FyZ3MsIHhqY0FyZ3MpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05vQWRkcmVzc0JpbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiBub0FkZHJlc3NCaW5kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5vQWRkcmVzc0JpbmRpbmcoYm9vbGVhbiBuZXdOb0FkZHJlc3NCaW5kaW5nKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkTm9BZGRyZXNzQmluZGluZyA9IG5vQWRkcmVzc0JpbmRpbmc7Ci0gICAgICAgIG5vQWRkcmVzc0JpbmRpbmcgPSBuZXdOb0FkZHJlc3NCaW5kaW5nOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTk9fQUREUkVTU19CSU5ESU5HLCBvbGROb0FkZHJlc3NCaW5kaW5nLCBub0FkZHJlc3NCaW5kaW5nKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkgewotICAgICAgICByZXR1cm4geGpjVXNlRGVmYXVsdFZhbHVlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNVc2VEZWZhdWx0VmFsdWVzKGJvb2xlYW4gbmV3WGpjVXNlRGVmYXVsdFZhbHVlcykgewotICAgICAgICBib29sZWFuIG9sZFhqY1VzZURlZmF1bHRWYWx1ZXMgPSB4amNVc2VEZWZhdWx0VmFsdWVzOwotICAgICAgICB4amNVc2VEZWZhdWx0VmFsdWVzID0gbmV3WGpjVXNlRGVmYXVsdFZhbHVlczsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVMsIG9sZFhqY1VzZURlZmF1bHRWYWx1ZXMsIHhqY1VzZURlZmF1bHRWYWx1ZXMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY1RvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4geGpjVG9TdHJpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVG9TdHJpbmcoYm9vbGVhbiBuZXdYamNUb1N0cmluZykgewotICAgICAgICBib29sZWFuIG9sZFhqY1RvU3RyaW5nID0geGpjVG9TdHJpbmc7Ci0gICAgICAgIHhqY1RvU3RyaW5nID0gbmV3WGpjVG9TdHJpbmc7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HLCBvbGRYamNUb1N0cmluZywgeGpjVG9TdHJpbmcpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkgewotICAgICAgICByZXR1cm4geGpjVG9TdHJpbmdNdWx0aUxpbmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVG9TdHJpbmdNdWx0aUxpbmUoYm9vbGVhbiBuZXdYamNUb1N0cmluZ011bHRpTGluZSkgewotICAgICAgICBib29sZWFuIG9sZFhqY1RvU3RyaW5nTXVsdGlMaW5lID0geGpjVG9TdHJpbmdNdWx0aUxpbmU7Ci0gICAgICAgIHhqY1RvU3RyaW5nTXVsdGlMaW5lID0gbmV3WGpjVG9TdHJpbmdNdWx0aUxpbmU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkUsIG9sZFhqY1RvU3RyaW5nTXVsdGlMaW5lLCB4amNUb1N0cmluZ011bHRpTGluZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzWGpjVG9TdHJpbmdTaW1wbGUoKSB7Ci0gICAgICAgIHJldHVybiB4amNUb1N0cmluZ1NpbXBsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNUb1N0cmluZ1NpbXBsZShib29sZWFuIG5ld1hqY1RvU3RyaW5nU2ltcGxlKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkWGpjVG9TdHJpbmdTaW1wbGUgPSB4amNUb1N0cmluZ1NpbXBsZTsKLSAgICAgICAgeGpjVG9TdHJpbmdTaW1wbGUgPSBuZXdYamNUb1N0cmluZ1NpbXBsZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfU0lNUExFLCBvbGRYamNUb1N0cmluZ1NpbXBsZSwgeGpjVG9TdHJpbmdTaW1wbGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY0xvY2F0b3IoKSB7Ci0gICAgICAgIHJldHVybiB4amNMb2NhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhqY0xvY2F0b3IoYm9vbGVhbiBuZXdYamNMb2NhdG9yKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkWGpjTG9jYXRvciA9IHhqY0xvY2F0b3I7Ci0gICAgICAgIHhqY0xvY2F0b3IgPSBuZXdYamNMb2NhdG9yOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0xPQ0FUT1IsIG9sZFhqY0xvY2F0b3IsIHhqY0xvY2F0b3IpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY1N5bmNNZXRob2RzKCkgewotICAgICAgICByZXR1cm4geGpjU3luY01ldGhvZHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0WGpjU3luY01ldGhvZHMoYm9vbGVhbiBuZXdYamNTeW5jTWV0aG9kcykgewotICAgICAgICBib29sZWFuIG9sZFhqY1N5bmNNZXRob2RzID0geGpjU3luY01ldGhvZHM7Ci0gICAgICAgIHhqY1N5bmNNZXRob2RzID0gbmV3WGpjU3luY01ldGhvZHM7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfU1lOQ19NRVRIT0RTLCBvbGRYamNTeW5jTWV0aG9kcywgeGpjU3luY01ldGhvZHMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY01hcmtHZW5lcmF0ZWQoKSB7Ci0gICAgICAgIHJldHVybiB4amNNYXJrR2VuZXJhdGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhqY01hcmtHZW5lcmF0ZWQoYm9vbGVhbiBuZXdYamNNYXJrR2VuZXJhdGVkKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkWGpjTWFya0dlbmVyYXRlZCA9IHhqY01hcmtHZW5lcmF0ZWQ7Ci0gICAgICAgIHhqY01hcmtHZW5lcmF0ZWQgPSBuZXdYamNNYXJrR2VuZXJhdGVkOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX01BUktfR0VORVJBVEVELCBvbGRYamNNYXJrR2VuZXJhdGVkLCB4amNNYXJrR2VuZXJhdGVkKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRYamNFcGlzb2RlRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIHhqY0VwaXNvZGVGaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhqY0VwaXNvZGVGaWxlKFN0cmluZyBuZXdYamNFcGlzb2RlRmlsZSkgewotICAgICAgICBTdHJpbmcgb2xkWGpjRXBpc29kZUZpbGUgPSB4amNFcGlzb2RlRmlsZTsKLSAgICAgICAgeGpjRXBpc29kZUZpbGUgPSBuZXdYamNFcGlzb2RlRmlsZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19FUElTT0RFX0ZJTEUsIG9sZFhqY0VwaXNvZGVGaWxlLCB4amNFcGlzb2RlRmlsZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQXV0b05hbWVSZXNvbHV0aW9uKCkgewotICAgICAgICByZXR1cm4gYXV0b05hbWVSZXNvbHV0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEF1dG9OYW1lUmVzb2x1dGlvbihib29sZWFuIG5ld0F1dG9OYW1lUmVzb2x1dGlvbikgewotICAgICAgICBib29sZWFuIG9sZEF1dG9OYW1lUmVzb2x1dGlvbiA9IGF1dG9OYW1lUmVzb2x1dGlvbjsKLSAgICAgICAgYXV0b05hbWVSZXNvbHV0aW9uID0gbmV3QXV0b05hbWVSZXNvbHV0aW9uOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQVVUT19OQU1FX1JFU09MVVRJT04sIG9sZEF1dG9OYW1lUmVzb2x1dGlvbiwgYXV0b05hbWVSZXNvbHV0aW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkgewotICAgICAgICByZXR1cm4gaW5jbHVkZWROYW1lc3BhY2VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVkTmFtZXNwYWNlcyhNYXA8U3RyaW5nLCBTdHJpbmc+IG5ld0luY2x1ZGVkTmFtZXNwYWNlcykgewotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG9sZEluY2x1ZGVkTmFtZXNwYWNlcyA9IGluY2x1ZGVkTmFtZXNwYWNlczsKLSAgICAgICAgaW5jbHVkZWROYW1lc3BhY2VzID0gbmV3SW5jbHVkZWROYW1lc3BhY2VzOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fSU5DTFVERURfTkFNRVNQQUNFUywgb2xkSW5jbHVkZWROYW1lc3BhY2VzLCBpbmNsdWRlZE5hbWVzcGFjZXMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRCaW5kaW5nRmlsZXMoKSB7Ci0gICAgICAgIGlmIChiaW5kaW5nRmlsZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgYmluZGluZ0ZpbGVzID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQklORElOR19GSUxFUyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJpbmRpbmdGaWxlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRFeGNsdWRlZE5hbWVzcGFjZXMoKSB7Ci0gICAgICAgIHJldHVybiBleGNsdWRlZE5hbWVzcGFjZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZWROYW1lc3BhY2VzKE1hcDxTdHJpbmcsIFN0cmluZz4gbmV3RXhjbHVkZWROYW1lc3BhY2VzKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gb2xkRXhjbHVkZWROYW1lc3BhY2VzID0gZXhjbHVkZWROYW1lc3BhY2VzOwotICAgICAgICBleGNsdWRlZE5hbWVzcGFjZXMgPSBuZXdFeGNsdWRlZE5hbWVzcGFjZXM7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19FWENMVURFRF9OQU1FU1BBQ0VTLCBvbGRFeGNsdWRlZE5hbWVzcGFjZXMsIGV4Y2x1ZGVkTmFtZXNwYWNlcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZ0ZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBjYXRhbG9nRmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDYXRhbG9nRmlsZShTdHJpbmcgbmV3Q2F0YWxvZ0ZpbGUpIHsKLSAgICAgICAgU3RyaW5nIG9sZENhdGFsb2dGaWxlID0gY2F0YWxvZ0ZpbGU7Ci0gICAgICAgIGNhdGFsb2dGaWxlID0gbmV3Q2F0YWxvZ0ZpbGU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19DQVRBTE9HX0ZJTEUsIG9sZENhdGFsb2dGaWxlLCBjYXRhbG9nRmlsZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YVNvdXJjZUZvbGRlcigpIHsKLSAgICAgICAgcmV0dXJuIGphdmFTb3VyY2VGb2xkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YVNvdXJjZUZvbGRlcihTdHJpbmcgbmV3SmF2YVNvdXJjZUZvbGRlcikgewotICAgICAgICBTdHJpbmcgb2xkSmF2YVNvdXJjZUZvbGRlciA9IGphdmFTb3VyY2VGb2xkZXI7Ci0gICAgICAgIGphdmFTb3VyY2VGb2xkZXIgPSBuZXdKYXZhU291cmNlRm9sZGVyOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fSkFWQV9TT1VSQ0VfRk9MREVSLCBvbGRKYXZhU291cmNlRm9sZGVyLCBqYXZhU291cmNlRm9sZGVyKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1BST0NFU1NfU09BUF9IRUFERVJTOgotICAgICAgICAgICAgICAgIHJldHVybiBpc1Byb2Nlc3NTT0FQSGVhZGVycygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19WQUxJREFURToKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZGF0ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1dTRExfVkVSU0lPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0V3NkbFZlcnNpb24oKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1VTRV9ERUZBVUxUX1ZBTFVFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNVc2VEZWZhdWx0VmFsdWVzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0FSR1M6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFhqY0FyZ3MoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX05PX0FERFJFU1NfQklORElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNOb0FkZHJlc3NCaW5kaW5nKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNYamNUb1N0cmluZygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORToKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNYamNUb1N0cmluZ011bHRpTGluZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfU0lNUExFOgotICAgICAgICAgICAgICAgIHJldHVybiBpc1hqY1RvU3RyaW5nU2ltcGxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0xPQ0FUT1I6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzWGpjTG9jYXRvcigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19TWU5DX01FVEhPRFM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzWGpjU3luY01ldGhvZHMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfTUFSS19HRU5FUkFURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzWGpjTWFya0dlbmVyYXRlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19FUElTT0RFX0ZJTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFhqY0VwaXNvZGVGaWxlKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19BVVRPX05BTUVfUkVTT0xVVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNBdXRvTmFtZVJlc29sdXRpb24oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19JTkNMVURFRF9OQU1FU1BBQ0VTOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRJbmNsdWRlZE5hbWVzcGFjZXMoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0JJTkRJTkdfRklMRVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEJpbmRpbmdGaWxlcygpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fRVhDTFVERURfTkFNRVNQQUNFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RXhjbHVkZWROYW1lc3BhY2VzKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19DQVRBTE9HX0ZJTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldENhdGFsb2dGaWxlKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19KQVZBX1NPVVJDRV9GT0xERVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEphdmFTb3VyY2VGb2xkZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVJbXBsZW1lbnRhdGlvbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19QUk9DRVNTX1NPQVBfSEVBREVSUzoKLSAgICAgICAgICAgICAgICBzZXRQcm9jZXNzU09BUEhlYWRlcnMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElORzoKLSAgICAgICAgICAgICAgICBzZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkc6Ci0gICAgICAgICAgICAgICAgc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fVkFMSURBVEU6Ci0gICAgICAgICAgICAgICAgc2V0VmFsaWRhdGUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fV1NETF9WRVJTSU9OOgotICAgICAgICAgICAgICAgIHNldFdzZGxWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1VTRV9ERUZBVUxUX1ZBTFVFUzoKLSAgICAgICAgICAgICAgICBzZXRVc2VEZWZhdWx0VmFsdWVzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19BUkdTOgotICAgICAgICAgICAgICAgIHNldFhqY0FyZ3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTk9fQUREUkVTU19CSU5ESU5HOgotICAgICAgICAgICAgICAgIHNldE5vQWRkcmVzc0JpbmRpbmcoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUzoKLSAgICAgICAgICAgICAgICBzZXRYamNVc2VEZWZhdWx0VmFsdWVzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkc6Ci0gICAgICAgICAgICAgICAgc2V0WGpjVG9TdHJpbmcoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FOgotICAgICAgICAgICAgICAgIHNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfU0lNUExFOgotICAgICAgICAgICAgICAgIHNldFhqY1RvU3RyaW5nU2ltcGxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19MT0NBVE9SOgotICAgICAgICAgICAgICAgIHNldFhqY0xvY2F0b3IoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1NZTkNfTUVUSE9EUzoKLSAgICAgICAgICAgICAgICBzZXRYamNTeW5jTWV0aG9kcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfTUFSS19HRU5FUkFURUQ6Ci0gICAgICAgICAgICAgICAgc2V0WGpjTWFya0dlbmVyYXRlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfRVBJU09ERV9GSUxFOgotICAgICAgICAgICAgICAgIHNldFhqY0VwaXNvZGVGaWxlKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0FVVE9fTkFNRV9SRVNPTFVUSU9OOgotICAgICAgICAgICAgICAgIHNldEF1dG9OYW1lUmVzb2x1dGlvbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19JTkNMVURFRF9OQU1FU1BBQ0VTOgotICAgICAgICAgICAgICAgIHNldEluY2x1ZGVkTmFtZXNwYWNlcygoTWFwPFN0cmluZywgU3RyaW5nPiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQklORElOR19GSUxFUzoKLSAgICAgICAgICAgICAgICBnZXRCaW5kaW5nRmlsZXMoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIGdldEJpbmRpbmdGaWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fRVhDTFVERURfTkFNRVNQQUNFUzoKLSAgICAgICAgICAgICAgICBzZXRFeGNsdWRlZE5hbWVzcGFjZXMoKE1hcDxTdHJpbmcsIFN0cmluZz4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0NBVEFMT0dfRklMRToKLSAgICAgICAgICAgICAgICBzZXRDYXRhbG9nRmlsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19KQVZBX1NPVVJDRV9GT0xERVI6Ci0gICAgICAgICAgICAgICAgc2V0SmF2YVNvdXJjZUZvbGRlcigoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVJbXBsZW1lbnRhdGlvbihHRU5FUkFURV9JTVBMRU1FTlRBVElPTl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fUFJPQ0VTU19TT0FQX0hFQURFUlM6Ci0gICAgICAgICAgICAgICAgc2V0UHJvY2Vzc1NPQVBIZWFkZXJzKFBST0NFU1NfU09BUF9IRUFERVJTX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HOgotICAgICAgICAgICAgICAgIHNldExvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKExPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkdfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORzoKLSAgICAgICAgICAgICAgICBzZXRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyhMT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkdfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1ZBTElEQVRFOgotICAgICAgICAgICAgICAgIHNldFZhbGlkYXRlKFZBTElEQVRFX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19XU0RMX1ZFUlNJT046Ci0gICAgICAgICAgICAgICAgc2V0V3NkbFZlcnNpb24oV1NETF9WRVJTSU9OX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19VU0VfREVGQVVMVF9WQUxVRVM6Ci0gICAgICAgICAgICAgICAgc2V0VXNlRGVmYXVsdFZhbHVlcyhVU0VfREVGQVVMVF9WQUxVRVNfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19BUkdTOgotICAgICAgICAgICAgICAgIHNldFhqY0FyZ3MoWEpDX0FSR1NfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX05PX0FERFJFU1NfQklORElORzoKLSAgICAgICAgICAgICAgICBzZXROb0FkZHJlc3NCaW5kaW5nKE5PX0FERFJFU1NfQklORElOR19FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUzoKLSAgICAgICAgICAgICAgICBzZXRYamNVc2VEZWZhdWx0VmFsdWVzKFhKQ19VU0VfREVGQVVMVF9WQUxVRVNfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkc6Ci0gICAgICAgICAgICAgICAgc2V0WGpjVG9TdHJpbmcoWEpDX1RPX1NUUklOR19FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FOgotICAgICAgICAgICAgICAgIHNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKFhKQ19UT19TVFJJTkdfTVVMVElfTElORV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19TSU1QTEU6Ci0gICAgICAgICAgICAgICAgc2V0WGpjVG9TdHJpbmdTaW1wbGUoWEpDX1RPX1NUUklOR19TSU1QTEVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19MT0NBVE9SOgotICAgICAgICAgICAgICAgIHNldFhqY0xvY2F0b3IoWEpDX0xPQ0FUT1JfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19TWU5DX01FVEhPRFM6Ci0gICAgICAgICAgICAgICAgc2V0WGpjU3luY01ldGhvZHMoWEpDX1NZTkNfTUVUSE9EU19FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX01BUktfR0VORVJBVEVEOgotICAgICAgICAgICAgICAgIHNldFhqY01hcmtHZW5lcmF0ZWQoWEpDX01BUktfR0VORVJBVEVEX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfRVBJU09ERV9GSUxFOgotICAgICAgICAgICAgICAgIHNldFhqY0VwaXNvZGVGaWxlKFhKQ19FUElTT0RFX0ZJTEVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0FVVE9fTkFNRV9SRVNPTFVUSU9OOgotICAgICAgICAgICAgICAgIHNldEF1dG9OYW1lUmVzb2x1dGlvbihBVVRPX05BTUVfUkVTT0xVVElPTl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fSU5DTFVERURfTkFNRVNQQUNFUzoKLSAgICAgICAgICAgICAgICBzZXRJbmNsdWRlZE5hbWVzcGFjZXMoKE1hcDxTdHJpbmcsIFN0cmluZz4pbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQklORElOR19GSUxFUzoKLSAgICAgICAgICAgICAgICBnZXRCaW5kaW5nRmlsZXMoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0VYQ0xVREVEX05BTUVTUEFDRVM6Ci0gICAgICAgICAgICAgICAgc2V0RXhjbHVkZWROYW1lc3BhY2VzKChNYXA8U3RyaW5nLCBTdHJpbmc+KW51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0NBVEFMT0dfRklMRToKLSAgICAgICAgICAgICAgICBzZXRDYXRhbG9nRmlsZShDQVRBTE9HX0ZJTEVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0pBVkFfU09VUkNFX0ZPTERFUjoKLSAgICAgICAgICAgICAgICBzZXRKYXZhU291cmNlRm9sZGVyKEpBVkFfU09VUkNFX0ZPTERFUl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbiAhPSBHRU5FUkFURV9JTVBMRU1FTlRBVElPTl9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1BST0NFU1NfU09BUF9IRUFERVJTOgotICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzU09BUEhlYWRlcnMgIT0gUFJPQ0VTU19TT0FQX0hFQURFUlNfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyAhPSBMT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyAhPSBMT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkdfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19WQUxJREFURToKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGUgIT0gVkFMSURBVEVfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19XU0RMX1ZFUlNJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFdTRExfVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gd3NkbFZlcnNpb24gIT0gbnVsbCA6ICFXU0RMX1ZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHdzZGxWZXJzaW9uKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1VTRV9ERUZBVUxUX1ZBTFVFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gdXNlRGVmYXVsdFZhbHVlcyAhPSBVU0VfREVGQVVMVF9WQUxVRVNfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfQVJHUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gWEpDX0FSR1NfRURFRkFVTFQgPT0gbnVsbCA/IHhqY0FyZ3MgIT0gbnVsbCA6ICFYSkNfQVJHU19FREVGQVVMVC5lcXVhbHMoeGpjQXJncyk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19OT19BRERSRVNTX0JJTkRJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5vQWRkcmVzc0JpbmRpbmcgIT0gTk9fQUREUkVTU19CSU5ESU5HX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4geGpjVXNlRGVmYXVsdFZhbHVlcyAhPSBYSkNfVVNFX0RFRkFVTFRfVkFMVUVTX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4geGpjVG9TdHJpbmcgIT0gWEpDX1RPX1NUUklOR19FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORToKLSAgICAgICAgICAgICAgICByZXR1cm4geGpjVG9TdHJpbmdNdWx0aUxpbmUgIT0gWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19TSU1QTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHhqY1RvU3RyaW5nU2ltcGxlICE9IFhKQ19UT19TVFJJTkdfU0lNUExFX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0xPQ0FUT1I6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHhqY0xvY2F0b3IgIT0gWEpDX0xPQ0FUT1JfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfU1lOQ19NRVRIT0RTOgotICAgICAgICAgICAgICAgIHJldHVybiB4amNTeW5jTWV0aG9kcyAhPSBYSkNfU1lOQ19NRVRIT0RTX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX01BUktfR0VORVJBVEVEOgotICAgICAgICAgICAgICAgIHJldHVybiB4amNNYXJrR2VuZXJhdGVkICE9IFhKQ19NQVJLX0dFTkVSQVRFRF9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19FUElTT0RFX0ZJTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFhKQ19FUElTT0RFX0ZJTEVfRURFRkFVTFQgPT0gbnVsbCA/IHhqY0VwaXNvZGVGaWxlICE9IG51bGwgOiAhWEpDX0VQSVNPREVfRklMRV9FREVGQVVMVC5lcXVhbHMoeGpjRXBpc29kZUZpbGUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQVVUT19OQU1FX1JFU09MVVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGF1dG9OYW1lUmVzb2x1dGlvbiAhPSBBVVRPX05BTUVfUkVTT0xVVElPTl9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0lOQ0xVREVEX05BTUVTUEFDRVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluY2x1ZGVkTmFtZXNwYWNlcyAhPSBudWxsOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQklORElOR19GSUxFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gYmluZGluZ0ZpbGVzICE9IG51bGwgJiYgIWJpbmRpbmdGaWxlcy5pc0VtcHR5KCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19FWENMVURFRF9OQU1FU1BBQ0VTOgotICAgICAgICAgICAgICAgIHJldHVybiBleGNsdWRlZE5hbWVzcGFjZXMgIT0gbnVsbDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0NBVEFMT0dfRklMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gQ0FUQUxPR19GSUxFX0VERUZBVUxUID09IG51bGwgPyBjYXRhbG9nRmlsZSAhPSBudWxsIDogIUNBVEFMT0dfRklMRV9FREVGQVVMVC5lcXVhbHMoY2F0YWxvZ0ZpbGUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fSkFWQV9TT1VSQ0VfRk9MREVSOgotICAgICAgICAgICAgICAgIHJldHVybiBKQVZBX1NPVVJDRV9GT0xERVJfRURFRkFVTFQgPT0gbnVsbCA/IGphdmFTb3VyY2VGb2xkZXIgIT0gbnVsbCA6ICFKQVZBX1NPVVJDRV9GT0xERVJfRURFRkFVTFQuZXF1YWxzKGphdmFTb3VyY2VGb2xkZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0gICAgICAgIGlmIChiYXNlQ2xhc3MgPT0gV1NETDJKYXZhQ29udGV4dC5jbGFzcykgewotICAgICAgICAgICAgc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT046IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT047Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fUFJPQ0VTU19TT0FQX0hFQURFUlM6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fUFJPQ0VTU19TT0FQX0hFQURFUlM7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElORzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkc7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fVkFMSURBVEU6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fVkFMSURBVEU7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fV1NETF9WRVJTSU9OOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1dTRExfVkVSU0lPTjsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19VU0VfREVGQVVMVF9WQUxVRVM6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fVVNFX0RFRkFVTFRfVkFMVUVTOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19BUkdTOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19BUkdTOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX05PX0FERFJFU1NfQklORElORzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19OT19BRERSRVNTX0JJTkRJTkc7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVVNFX0RFRkFVTFRfVkFMVUVTOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkc6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklORzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkU6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfU0lNUExFOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfU0lNUExFOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19MT0NBVE9SOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19MT0NBVE9SOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19TWU5DX01FVEhPRFM6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1NZTkNfTUVUSE9EUzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfTUFSS19HRU5FUkFURUQ6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX01BUktfR0VORVJBVEVEOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19FUElTT0RFX0ZJTEU6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0VQSVNPREVfRklMRTsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19BVVRPX05BTUVfUkVTT0xVVElPTjogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19BVVRPX05BTUVfUkVTT0xVVElPTjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLSAgICAgICAgaWYgKGJhc2VDbGFzcyA9PSBXU0RMMkphdmFDb250ZXh0LmNsYXNzKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTjogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTjsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19QUk9DRVNTX1NPQVBfSEVBREVSUzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19QUk9DRVNTX1NPQVBfSEVBREVSUzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkc7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19WQUxJREFURTogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19WQUxJREFURTsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19XU0RMX1ZFUlNJT046IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fV1NETF9WRVJTSU9OOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1VTRV9ERUZBVUxUX1ZBTFVFUzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19VU0VfREVGQVVMVF9WQUxVRVM7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0FSR1M6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0FSR1M7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTk9fQUREUkVTU19CSU5ESU5HOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX05PX0FERFJFU1NfQklORElORzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVVNFX0RFRkFVTFRfVkFMVUVTOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVM7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklORzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORTogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkU7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19TSU1QTEU6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19TSU1QTEU7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0xPQ0FUT1I6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0xPQ0FUT1I7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1NZTkNfTUVUSE9EUzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfU1lOQ19NRVRIT0RTOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19NQVJLX0dFTkVSQVRFRDogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfTUFSS19HRU5FUkFURUQ7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0VQSVNPREVfRklMRTogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfRVBJU09ERV9GSUxFOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0FVVE9fTkFNRV9SRVNPTFVUSU9OOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0FVVE9fTkFNRV9SRVNPTFVUSU9OOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgKGdlbmVyYXRlSW1wbGVtZW50YXRpb246ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGdlbmVyYXRlSW1wbGVtZW50YXRpb24pOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHByb2Nlc3NTT0FQSGVhZGVyczogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQocHJvY2Vzc1NPQVBIZWFkZXJzKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZzogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQobG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdmFsaWRhdGU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHZhbGlkYXRlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB3c2RsVmVyc2lvbjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQod3NkbFZlcnNpb24pOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHVzZURlZmF1bHRWYWx1ZXM6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHVzZURlZmF1bHRWYWx1ZXMpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHhqY0FyZ3M6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHhqY0FyZ3MpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIG5vQWRkcmVzc0JpbmRpbmc6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKG5vQWRkcmVzc0JpbmRpbmcpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHhqY1VzZURlZmF1bHRWYWx1ZXM6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHhqY1VzZURlZmF1bHRWYWx1ZXMpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHhqY1RvU3RyaW5nOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh4amNUb1N0cmluZyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgeGpjVG9TdHJpbmdNdWx0aUxpbmU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHhqY1RvU3RyaW5nTXVsdGlMaW5lKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB4amNUb1N0cmluZ1NpbXBsZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoeGpjVG9TdHJpbmdTaW1wbGUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHhqY0xvY2F0b3I6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHhqY0xvY2F0b3IpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHhqY1N5bmNNZXRob2RzOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh4amNTeW5jTWV0aG9kcyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgeGpjTWFya0dlbmVyYXRlZDogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoeGpjTWFya0dlbmVyYXRlZCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgeGpjRXBpc29kZUZpbGU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHhqY0VwaXNvZGVGaWxlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBhdXRvTmFtZVJlc29sdXRpb246ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGF1dG9OYW1lUmVzb2x1dGlvbik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaW5jbHVkZWROYW1lc3BhY2VzOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChpbmNsdWRlZE5hbWVzcGFjZXMpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGJpbmRpbmdGaWxlczogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYmluZGluZ0ZpbGVzKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBleGNsdWRlZE5hbWVzcGFjZXM6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGV4Y2x1ZGVkTmFtZXNwYWNlcyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY2F0YWxvZ0ZpbGU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGNhdGFsb2dGaWxlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBqYXZhU291cmNlRm9sZGVyOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChqYXZhU291cmNlRm9sZGVyKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi19IC8vV1NETDJKYXZhRGF0YU1vZGVsSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC91dGlsL0NYRkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL3V0aWwvQ1hGQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFiODA0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL3V0aWwvQ1hGQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiAkSWQ6IENYRkFkYXB0ZXJGYWN0b3J5LmphdmEsdiAxLjIgMjAwOS8wMS8yNiAxNToyODoxNCBzY2xhcmtlIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuKjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENYRkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBDWEZQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ1hGQWRhcHRlckZhY3RvcnkoKSB7Ci0gICAgICAgIGlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgbW9kZWxQYWNrYWdlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIGlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc3dpdGNoIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENYRlN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9Ci0gICAgICAgIG5ldyBDWEZTd2l0Y2g8QWRhcHRlcj4oKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VDWEZDb250ZXh0KENYRkNvbnRleHQgb2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNYRkNvbnRleHRBZGFwdGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VDWEZEYXRhTW9kZWwoQ1hGRGF0YU1vZGVsIG9iamVjdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVDWEZEYXRhTW9kZWxBZGFwdGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VKYXZhMldTQ29udGV4dChKYXZhMldTQ29udGV4dCBvYmplY3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlSmF2YTJXU0NvbnRleHRBZGFwdGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VKYXZhMldTRGF0YU1vZGVsKEphdmEyV1NEYXRhTW9kZWwgb2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUphdmEyV1NEYXRhTW9kZWxBZGFwdGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VXU0RMMkphdmFDb250ZXh0KFdTREwySmF2YUNvbnRleHQgb2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVdTREwySmF2YUNvbnRleHRBZGFwdGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VXU0RMMkphdmFEYXRhTW9kZWwoV1NETDJKYXZhRGF0YU1vZGVsIG9iamVjdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVXU0RMMkphdmFEYXRhTW9kZWxBZGFwdGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotICAgICAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotICAgICAgICByZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQgPGVtPkNvbnRleHQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQ1hGQ29udGV4dEFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCA8ZW0+RGF0YSBNb2RlbDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNYRkRhdGFNb2RlbEFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0IDxlbT5KYXZhMiBXUyBDb250ZXh0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhMldTQ29udGV4dEFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwgPGVtPkphdmEyIFdTIERhdGEgTW9kZWw8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSmF2YTJXU0RhdGFNb2RlbEFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQgPGVtPldTREwyIEphdmEgQ29udGV4dDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMMkphdmFDb250ZXh0QWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsIDxlbT5XU0RMMiBKYXZhIERhdGEgTW9kZWw8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMMkphdmFEYXRhTW9kZWxBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19IC8vQ1hGQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvdXRpbC9DWEZTd2l0Y2guamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvdXRpbC9DWEZTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwZjg0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL3V0aWwvQ1hGU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogJElkOiBDWEZTd2l0Y2guamF2YSx2IDEuMSAyMDA4LzExLzEwIDIwOjM3OjQ1IGRhdmlkX3dpbGxpYW1zIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLio7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ1hGU3dpdGNoPFQ+IHsKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIENYRlBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBDWEZTd2l0Y2goKSB7Ci0gICAgICAgIGlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgbW9kZWxQYWNrYWdlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotICAgICAgICByZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLSAgICAgICAgaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIExpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotICAgICAgICAgICAgICAgICAgICBkb1N3aXRjaChlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLSAgICAgICAgc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVDogewotICAgICAgICAgICAgICAgIENYRkNvbnRleHQgY3hmQ29udGV4dCA9IChDWEZDb250ZXh0KXRoZUVPYmplY3Q7Ci0gICAgICAgICAgICAgICAgVCByZXN1bHQgPSBjYXNlQ1hGQ29udGV4dChjeGZDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUw6IHsKLSAgICAgICAgICAgICAgICBDWEZEYXRhTW9kZWwgY3hmRGF0YU1vZGVsID0gKENYRkRhdGFNb2RlbCl0aGVFT2JqZWN0OwotICAgICAgICAgICAgICAgIFQgcmVzdWx0ID0gY2FzZUNYRkRhdGFNb2RlbChjeGZEYXRhTW9kZWwpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNYRkNvbnRleHQoY3hmRGF0YU1vZGVsKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVDogewotICAgICAgICAgICAgICAgIEphdmEyV1NDb250ZXh0IGphdmEyV1NDb250ZXh0ID0gKEphdmEyV1NDb250ZXh0KXRoZUVPYmplY3Q7Ci0gICAgICAgICAgICAgICAgVCByZXN1bHQgPSBjYXNlSmF2YTJXU0NvbnRleHQoamF2YTJXU0NvbnRleHQpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNYRkNvbnRleHQoamF2YTJXU0NvbnRleHQpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMOiB7Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RhdGFNb2RlbCBqYXZhMldTRGF0YU1vZGVsID0gKEphdmEyV1NEYXRhTW9kZWwpdGhlRU9iamVjdDsKLSAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VKYXZhMldTRGF0YU1vZGVsKGphdmEyV1NEYXRhTW9kZWwpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNYRkRhdGFNb2RlbChqYXZhMldTRGF0YU1vZGVsKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKYXZhMldTQ29udGV4dChqYXZhMldTRGF0YU1vZGVsKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDWEZDb250ZXh0KGphdmEyV1NEYXRhTW9kZWwpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQ6IHsKLSAgICAgICAgICAgICAgICBXU0RMMkphdmFDb250ZXh0IHdzZGwySmF2YUNvbnRleHQgPSAoV1NETDJKYXZhQ29udGV4dCl0aGVFT2JqZWN0OwotICAgICAgICAgICAgICAgIFQgcmVzdWx0ID0gY2FzZVdTREwySmF2YUNvbnRleHQod3NkbDJKYXZhQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ1hGQ29udGV4dCh3c2RsMkphdmFDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMOiB7Ci0gICAgICAgICAgICAgICAgV1NETDJKYXZhRGF0YU1vZGVsIHdzZGwySmF2YURhdGFNb2RlbCA9IChXU0RMMkphdmFEYXRhTW9kZWwpdGhlRU9iamVjdDsKLSAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VXU0RMMkphdmFEYXRhTW9kZWwod3NkbDJKYXZhRGF0YU1vZGVsKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDWEZEYXRhTW9kZWwod3NkbDJKYXZhRGF0YU1vZGVsKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMMkphdmFDb250ZXh0KHdzZGwySmF2YURhdGFNb2RlbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ1hGQ29udGV4dCh3c2RsMkphdmFEYXRhTW9kZWwpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRleHQ8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZXh0PC9lbT4nLgotICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBjYXNlQ1hGQ29udGV4dChDWEZDb250ZXh0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EYXRhIE1vZGVsPC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGF0YSBNb2RlbDwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZUNYRkRhdGFNb2RlbChDWEZEYXRhTW9kZWwgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEyIFdTIENvbnRleHQ8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhMiBXUyBDb250ZXh0PC9lbT4nLgotICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBjYXNlSmF2YTJXU0NvbnRleHQoSmF2YTJXU0NvbnRleHQgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEyIFdTIERhdGEgTW9kZWw8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhMiBXUyBEYXRhIE1vZGVsPC9lbT4nLgotICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBjYXNlSmF2YTJXU0RhdGFNb2RlbChKYXZhMldTRGF0YU1vZGVsIG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XU0RMMiBKYXZhIENvbnRleHQ8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XU0RMMiBKYXZhIENvbnRleHQ8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGNhc2VXU0RMMkphdmFDb250ZXh0KFdTREwySmF2YUNvbnRleHQgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwyIEphdmEgRGF0YSBNb2RlbDwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwyIEphdmEgRGF0YSBNb2RlbDwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZVdTREwySmF2YURhdGFNb2RlbChXU0RMMkphdmFEYXRhTW9kZWwgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19IC8vQ1hGU3dpdGNoCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3Jlc291cmNlcy9KYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9yZXNvdXJjZXMvSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMyNDE4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3Jlc291cmNlcy9KYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnJlc291cmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBMaXN0ZW5zIGZvciBjaGFuZ2VzIHRvIHRoZSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+IHNyYyBmb2xkZXIuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotICAgIHByaXZhdGUgTGlzdDxJUmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PElSZXNvdXJjZT4oKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHNvdXJjZURpcmVjdG9yeVBhdGg7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIEphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGluc3RhbmNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2VEaXJlY3RvcnlQYXRoCi0gICAgICovCi0gICAgcHVibGljIEphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKFN0cmluZyBzb3VyY2VEaXJlY3RvcnlQYXRoKSB7Ci0gICAgICAgIHRoaXMuc291cmNlRGlyZWN0b3J5UGF0aCA9IHNvdXJjZURpcmVjdG9yeVBhdGg7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpICE9IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgSVJlc291cmNlRGVsdGEgcm9vdERlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQotICAgICAgICBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgSUZvbGRlciBzcmNGb2xkZXIgPSB3b3Jrc3BhY2VSb290LmdldEZvbGRlcihuZXcgUGF0aChzb3VyY2VEaXJlY3RvcnlQYXRoKSk7Ci0gICAgICAgIElQYXRoIHNyY0ZvbGRlclBhdGggPSBzcmNGb2xkZXIuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgaWYgKCFzcmNGb2xkZXJQYXRoLmhhc1RyYWlsaW5nU2VwYXJhdG9yKCkpIHsKLSAgICAgICAgICAgIHNyY0ZvbGRlclBhdGggPSBzcmNGb2xkZXJQYXRoLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBJUmVzb3VyY2VEZWx0YSBqYXZhUmVzb3VyY2VEZWx0YSA9IHJvb3REZWx0YS5maW5kTWVtYmVyKHNyY0ZvbGRlclBhdGgpOwotCi0gICAgICAgIGlmIChqYXZhUmVzb3VyY2VEZWx0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotICAgICAgICAgICAgICAgIGlmIChkZWx0YS5nZXRLaW5kKCkgIT0gSVJlc291cmNlRGVsdGEuQURERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0gICAgICAgICAgICAgICAgY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgamF2YVJlc291cmNlRGVsdGEuYWNjZXB0KHZpc2l0b3IpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3Q8SVJlc291cmNlPiBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgewotICAgICAgICByZXR1cm4gY2hhbmdlZFJlc291cmNlczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvcmVzb3VyY2VzL1dlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9yZXNvdXJjZXMvV2ViQ29udGVudENoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MGIxY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9yZXNvdXJjZXMvV2ViQ29udGVudENoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUucmVzb3VyY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBMaXN0ZW5zIGZvciBjaGFuZ2VzIHRvIHRoZSB3ZWIgcHJvamVjdHMgV2ViQ29udGVudCBmb2xkZXIuCi0gKiAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBXZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBMaXN0PElSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8SVJlc291cmNlPigpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWU7Ci0gICAgCi0gICAgcHVibGljIFdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGV2ZW50LmdldFR5cGUoKSAhPSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIElSZXNvdXJjZURlbHRhIHJvb3REZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0KLSAgICAgICAgSVBhdGggd2ViQ29udGVudFBhdGggPSBKMkVFVXRpbHMuZ2V0V2ViQ29udGVudFBhdGgoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKQotICAgICAgICAgICAgICAgIC5nZXRQcm9qZWN0KHByb2plY3ROYW1lKSk7Ci0gICAgICAgIGlmICghd2ViQ29udGVudFBhdGguaGFzVHJhaWxpbmdTZXBhcmF0b3IoKSkgewotICAgICAgICAgICAgd2ViQ29udGVudFBhdGggPSB3ZWJDb250ZW50UGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBJUmVzb3VyY2VEZWx0YSB3ZWJSZXNvdXJjZURlbHRhID0gcm9vdERlbHRhLmZpbmRNZW1iZXIod2ViQ29udGVudFBhdGgpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmICh3ZWJSZXNvdXJjZURlbHRhID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIElSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IElSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlbHRhLmdldEtpbmQoKSAhPSBJUmVzb3VyY2VEZWx0YS5BRERFRCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgICAgICAgICBjaGFuZ2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3ZWJSZXNvdXJjZURlbHRhLmFjY2VwdCh2aXNpdG9yKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBMaXN0PElSZXNvdXJjZT4gZ2V0Q2hhbmdlZFJlc291cmNlcygpIHsKLSAgICAgICAgcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL0NYRk1vZGVsVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvQ1hGTW9kZWxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTZhZTIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvQ1hGTW9kZWxVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuQVNUUmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5JbXBvcnRSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5Db2RlU3R5bGVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBQcm92aWRlcyB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgQ1hGIG1vZGVsLgotICogQWxzbyBzZXJ2aW5nIGFzIGFuIGludGVyaW0gY2xhc3MgdG8gYWlkIGluIHJlZmFjdG9yaW5nIGNvcmUgdXRpbGl0aWVzIGludG8gamF4d3MgY29yZS4KLSAqIAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ1hGTW9kZWxVdGlscyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVyc2lvbiB2XzBfMF8wID0gbmV3IFZlcnNpb24oIjAuMC4wIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVyc2lvbiB2XzJfMSA9IG5ldyBWZXJzaW9uKENYRkNvcmVQbHVnaW4uQ1hGX1ZFUlNJT05fMl8xKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBWZXJzaW9uIHZfMl8wXzcgPSBuZXcgVmVyc2lvbigiMi4wLjciKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBWZXJzaW9uIHZfMl8xXzEgPSBuZXcgVmVyc2lvbigiMi4xLjEiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9TRVJWSUNFID0gIldlYlNlcnZpY2UiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX01FVEhPRCA9ICJXZWJNZXRob2QiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1BBUkFNID0gIldlYlBhcmFtIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfV1JBUFBFUiA9ICJSZXF1ZXN0V3JhcHBlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRV9XUkFQUEVSID0gIlJlc3BvbnNlV3JhcHBlciI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRQT0lOVF9JTlRFUkZBQ0UgPSAiZW5kcG9pbnRJbnRlcmZhY2UiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoIlNlcnZpY2VNb2RlIiwgImphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAucHV0KCJXZWJGYXVsdCIsICJqYXZheC54bWwud3MuV2ViRmF1bHQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dChSRVFVRVNUX1dSQVBQRVIsICJqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoUkVTUE9OU0VfV1JBUFBFUiwgImphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dCgiV2ViU2VydmljZUNsaWVudCIsICJqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAucHV0KCJXZWJFbmRwb2ludCIsICJqYXZheC54bWwud3MuV2ViRW5kcG9pbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dCgiV2ViU2VydmljZVByb3ZpZGVyIiwgImphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dCgiQmluZGluZ1R5cGUiLCAiamF2YXgueG1sLndzLkJpbmRpbmdUeXBlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoIldlYlNlcnZpY2VSZWYiLCAiamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dCgiV2ViU2VydmljZVJlZnMiLCAiamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWZzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoV0VCX1NFUlZJQ0UsICJqYXZheC5qd3MuV2ViU2VydmljZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dChXRUJfTUVUSE9ELCAiamF2YXguandzLldlYk1ldGhvZCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dCgiT25ld2F5IiwgImphdmF4Lmp3cy5PbmVXYXkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dChXRUJfUEFSQU0sICJqYXZheC5qd3MuV2ViUGFyYW0iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoIldlYlJlc3VsdCIsICJqYXZheC5qd3MuV2ViUmVzdWx0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoIlNPQVBCaW5kaW5nIiwgImphdmF4Lmp3cy5TT0FQQmluZGluZyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAucHV0KCJIYW5kbGVyQ2hhaW4iLCAiamF2YXguandzLkhhbmRsZXJDaGFpbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9Ci0KLSAgICBwcml2YXRlIENYRk1vZGVsVXRpbHMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGdldFdlYlNlcnZpY2VBbm5vdGF0aW9uQ2hhbmdlKElUeXBlIHR5cGUsIEphdmEyV1NEYXRhTW9kZWwgbW9kZWwsIAotICAgICAgICAgICAgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UgPSB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOwotICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gQW5ub3RhdGlvblV0aWxzLmdldEFTVFBhcnNlcihzb3VyY2UsIGZhbHNlKTsgICAgICAgIAotCi0gICAgICAgIEFTVCBhc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0QVNUKCk7Ci0gICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShhc3QpOwotCi0gICAgICAgIE5vcm1hbEFubm90YXRpb24gd2ViU2VydmljZUFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKGNvbXBpbGF0aW9uVW5pdCwgdHlwZSwgV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIGlmICh3ZWJTZXJ2aWNlQW5ub3RhdGlvbiAhPSBudWxsICYmIG1vZGVsLmlzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgJiYgdHlwZS5pc0NsYXNzKCkpIHsKLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBlbmRwb2ludEludGVyZmFjZSA9IGdldE1lbWJlclZhbHVlUGFpcih3ZWJTZXJ2aWNlQW5ub3RhdGlvbiwgRU5EUE9JTlRfSU5URVJGQUNFKTsKLSAgICAgICAgICAgIGlmIChlbmRwb2ludEludGVyZmFjZSAhPSBudWxsICYmIGVuZHBvaW50SW50ZXJmYWNlLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBTdHJpbmdMaXRlcmFsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEoKFN0cmluZ0xpdGVyYWwpIGVuZHBvaW50SW50ZXJmYWNlLmdldFZhbHVlKCkpLmdldExpdGVyYWxWYWx1ZSgpLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQVNUTm9kZSBuZXdTRUlWYWx1ZSA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdMaXRlcmFsKGFzdCwgbW9kZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMudXBkYXRlTWVtYmVyVmFsdWVQYWlyVmFsdWUoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYlNlcnZpY2VBbm5vdGF0aW9uLCBlbmRwb2ludEludGVyZmFjZSwgbmV3U0VJVmFsdWUsIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBlbmRwb2ludEludGVyZmFjZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEVORFBPSU5UX0lOVEVSRkFDRSwgQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ0xpdGVyYWwoYXN0LCBtb2RlbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkTWVtYmVyVmFsdWVQYWlyVG9Bbm5vdGF0aW9uKHNvdXJjZSwgY29tcGlsYXRpb25Vbml0LCByZXdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdlYlNlcnZpY2VBbm5vdGF0aW9uLCBlbmRwb2ludEludGVyZmFjZVBhaXIsIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyID0gCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNNYW5hZ2VyLmdldEFubm90YXRpb25EZWZpbml0aW9uRm9yQ2xhc3MoV2ViU2VydmljZS5jbGFzcykuCi0gICAgICAgICAgICAgICAgICAgIGdldEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcigpOwotCi0gICAgICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5nZXRNZW1iZXJWYWx1ZVBhaXJzKHR5cGUsIGFzdCwKLSAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZS5jbGFzcyk7Ci0KLSAgICAgICAgICAgIGlmIChtb2RlbC5pc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpICYmIHR5cGUuaXNDbGFzcygpKSB7Ci0gICAgICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGVuZHBvaW50SW50ZXJmYWNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgRU5EUE9JTlRfSU5URVJGQUNFLCBtb2RlbC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkpOwotICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKDEsIGVuZHBvaW50SW50ZXJmYWNlVmFsdWVQYWlyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUFubm90YXRpb24oYXN0LCBXZWJTZXJ2aWNlLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRBbm5vdGF0aW9uVG9UeXBlKHNvdXJjZSwgY29tcGlsYXRpb25Vbml0LCByZXdyaXRlciwgc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLCAgdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIHN0YXRpYyBOb3JtYWxBbm5vdGF0aW9uIGdldEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwgSVR5cGUgdHlwZSwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlRGVjbGFyYXRpb24+IHR5cGVzID0gY29tcGlsYXRpb25Vbml0LnR5cGVzKCk7Ci0gICAgICAgIGZvciAoQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uIDogdHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChBbm5vdGF0aW9uVXRpbHMuY29tcGFyZVR5cGVOYW1lcyh0eXBlRGVjbGFyYXRpb24sIHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24odHlwZURlY2xhcmF0aW9uLCBhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAoamR0QW5ub3RhdGlvbiAhPSBudWxsICYmIGpkdEFubm90YXRpb24gaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoTm9ybWFsQW5ub3RhdGlvbikgamR0QW5ub3RhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWVtYmVyVmFsdWVQYWlyIGdldE1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBtZW1iZXJOYW1lKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gYW5ub3RhdGlvbi52YWx1ZXMoKTsKLSAgICAgICAgZm9yIChNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyIDogbWVtYmVyVmFsdWVQYWlycykgewotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhtZW1iZXJOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZU1ldGhvZEFubm90YXRpb25DaGFuZ2UoSVR5cGUgdHlwZSwgSU1ldGhvZCBtZXRob2QsIAotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb25DbGFzcywgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UpIAotICAgICAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UgPSB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOwotICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gQW5ub3RhdGlvblV0aWxzLmdldEFTVFBhcnNlcihzb3VyY2UsIGZhbHNlKTsKLQotICAgICAgICBBU1QgYXN0ID0gY29tcGlsYXRpb25Vbml0LmdldEFTVCgpOwotICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUoYXN0KTsKLQotICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKG1ldGhvZCwgYXN0LCBhbm5vdGF0aW9uQ2xhc3MpOwotCi0gICAgICAgIEFubm90YXRpb25VdGlscy5hZGRBbm5vdGF0aW9uVG9NZXRob2Qoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbiwgdGV4dEZpbGVDaGFuZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZXRXZWJNZXRob2RBbm5vdGF0aW9uQ2hhbmdlKElUeXBlIHR5cGUsIElNZXRob2QgbWV0aG9kLCAKLSAgICAgICAgICAgIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb21waWxhdGlvblVuaXQgc291cmNlID0gdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IEFubm90YXRpb25VdGlscy5nZXRBU1RQYXJzZXIoc291cmNlLCBmYWxzZSk7Ci0KLSAgICAgICAgQVNUIGFzdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRBU1QoKTsKLSAgICAgICAgQVNUUmV3cml0ZSByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKGFzdCk7Ci0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbihtZXRob2QsIGFzdCwgV2ViTWV0aG9kLmNsYXNzKTsKLQotICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkQW5ub3RhdGlvblRvTWV0aG9kKHNvdXJjZSwgY29tcGlsYXRpb25Vbml0LCByZXdyaXRlciwgbWV0aG9kLAotICAgICAgICAgICAgICAgIGFubm90YXRpb24sIHRleHRGaWxlQ2hhbmdlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGdldFJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbkNoYW5nZShJVHlwZSB0eXBlLCBJTWV0aG9kIG1ldGhvZCwgCi0gICAgICAgICAgICBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSA9IHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QVNUUGFyc2VyKHNvdXJjZSwgZmFsc2UpOwotCi0gICAgICAgIEFTVCBhc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0QVNUKCk7Ci0gICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShhc3QpOwotCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24obWV0aG9kLCBhc3QsIFJlcXVlc3RXcmFwcGVyLmNsYXNzKTsKLQotICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkQW5ub3RhdGlvblRvTWV0aG9kKHNvdXJjZSwgY29tcGlsYXRpb25Vbml0LCByZXdyaXRlciwgbWV0aG9kLCAKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGdldFJlc3BvbnNlV3JhcHBlckFubm90YXRpb25DaGFuZ2UoSVR5cGUgdHlwZSwgSU1ldGhvZCBtZXRob2QsCi0gICAgICAgICAgICBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSA9IHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QVNUUGFyc2VyKHNvdXJjZSwgZmFsc2UpOwotCi0gICAgICAgIEFTVCBhc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0QVNUKCk7Ci0gICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShhc3QpOwotCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24obWV0aG9kLCBhc3QsIFJlc3BvbnNlV3JhcHBlci5jbGFzcyk7Ci0KLSAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb25Ub01ldGhvZChzb3VyY2UsIGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsIG1ldGhvZCwgCi0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbiwgdGV4dEZpbGVDaGFuZ2UpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ2V0V2ViUGFyYW1Bbm5vdGF0aW9uQ2hhbmdlKElUeXBlIHR5cGUsIGZpbmFsIElNZXRob2QgbWV0aG9kLCAKLSAgICAgICAgICAgIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyLCBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSkgCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb21waWxhdGlvblVuaXQgc291cmNlID0gdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IEFubm90YXRpb25VdGlscy5nZXRBU1RQYXJzZXIoc291cmNlLCBmYWxzZSk7Ci0KLSAgICAgICAgQVNUIGFzdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRBU1QoKTsKLSAgICAgICAgQVNUUmV3cml0ZSByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKGFzdCk7Ci0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXIsIGFzdCwgV2ViUGFyYW0uY2xhc3MpOwotCi0gICAgICAgIEFubm90YXRpb25VdGlscy5hZGRBbm5vdGF0aW9uVG9NZXRob2RQYXJhbWV0ZXIoc291cmNlLCBjb21waWxhdGlvblVuaXQsIAotICAgICAgICAgICAgICAgIHJld3JpdGVyLCBwYXJhbWV0ZXIsIG1ldGhvZCwgYW5ub3RhdGlvbiwgdGV4dEZpbGVDaGFuZ2UpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBBU1QgYXN0LCAKLSAgICAgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKSB7Ci0gICAgICAgIAotICAgICAgICBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciA9IEFubm90YXRpb25zTWFuYWdlci4KLSAgICAgICAgICAgIGdldEFubm90YXRpb25EZWZpbml0aW9uRm9yQ2xhc3MoYW5ub3RhdGlvbkNsYXNzKS5nZXRBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIoKTsKLSAgICAgICAgCi0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gCi0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmdldE1lbWJlclZhbHVlUGFpcnMoamF2YUVsZW1lbnQsIGFzdCwgYW5ub3RhdGlvbkNsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlQW5ub3RhdGlvbihhc3QsIGFubm90YXRpb25DbGFzcywgYW5ub3RhdGlvbkNsYXNzLmdldFNpbXBsZU5hbWUoKSwKLSAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oQVNUTm9kZSBhc3ROb2RlLCBBU1QgYXN0LCAKLSAgICAgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKSB7Ci0gICAgICAgIAotICAgICAgICBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciA9IEFubm90YXRpb25zTWFuYWdlci4KLSAgICAgICAgICAgIGdldEFubm90YXRpb25EZWZpbml0aW9uRm9yQ2xhc3MoYW5ub3RhdGlvbkNsYXNzKS5nZXRBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIoKTsKLSAgICAgICAgCi0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmdldE1lbWJlclZhbHVlUGFpcnMoYXN0Tm9kZSwgCi0gICAgICAgICAgICAgICAgYXN0LCBhbm5vdGF0aW9uQ2xhc3MpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVBbm5vdGF0aW9uKGFzdCwgYW5ub3RhdGlvbkNsYXNzLCBhbm5vdGF0aW9uQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpLAotICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ2V0SW1wb3J0c0NoYW5nZShJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCwgCi0gICAgICAgICAgICBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSwgYm9vbGVhbiBjbGFzc09ubHkpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCi0gICAgICAgICAgICBJbXBvcnRSZXdyaXRlIGltcG9ydFJld3JpdGUgPSBDb2RlU3R5bGVDb25maWd1cmF0aW9uLmNyZWF0ZUltcG9ydFJld3JpdGUoY29tcGlsYXRpb25Vbml0LCB0cnVlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW1wb3J0UmV3cml0ZS5hZGRJbXBvcnQoQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAuZ2V0KFdFQl9TRVJWSUNFKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghY2xhc3NPbmx5KSB7Ci0gICAgICAgICAgICAgICAgTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiBtZXRob2RBbm5vdGF0aW9uTWFwID0gbW9kZWwuZ2V0TWV0aG9kTWFwKCk7Ci0gICAgICAgICAgICAgICAgU2V0PEVudHJ5PElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+Pj4gbWV0aG9kQW5ub3RhdGlvblNldCA9IG1ldGhvZEFubm90YXRpb25NYXAuZW50cnlTZXQoKTsKLSAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxJTWV0aG9kLCBNYXA8U3RyaW5nLCBCb29sZWFuPj4gbWV0aG9kQW5ub3RhdGlvbiA6IG1ldGhvZEFubm90YXRpb25TZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgQm9vbGVhbj4gbWV0aG9kTWFwID0gbWV0aG9kQW5ub3RhdGlvbi5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBTZXQ8RW50cnk8U3RyaW5nLCBCb29sZWFuPj4gbWV0aG9kU2V0ID0gbWV0aG9kTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgQm9vbGVhbj4gbWV0aG9kIDogbWV0aG9kU2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAuY29udGFpbnNLZXkobWV0aG9kLmdldEtleSgpKSAmJiBtZXRob2QuZ2V0VmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydFJld3JpdGUuYWRkSW1wb3J0KEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLmdldChtZXRob2QuZ2V0S2V5KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGltcG9ydFJld3JpdGUuaGFzUmVjb3JkZWRDaGFuZ2VzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgVGV4dEVkaXQgaW1wb3J0VGV4dEVkaXQgPSBpbXBvcnRSZXdyaXRlLnJld3JpdGVJbXBvcnRzKG51bGwpOwotICAgICAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KGltcG9ydFRleHRFZGl0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgYWxsIHB1YmxpYyBtZXRob2RzIHdpdGggdGhlIGRlZmF1bHQgYW5ub3RhdGlvbiBtYXBzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiBnZXRNZXRob2RNYXAoSVR5cGUgdHlwZSwgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBNYXA8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+IG1ldGhvZE1hcCA9IG5ldyBIYXNoTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PigpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJTWV0aG9kW10gbWV0aG9kcyA9IHR5cGUuZ2V0TWV0aG9kcygpOwotICAgICAgICAgICAgZm9yIChJTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0ludGVyZmFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZE1hcC5wdXQobWV0aG9kLCBnZXRBbm5vdGF0aW9uTWFwKG1vZGVsKSk7ICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUuaXNDbGFzcygpICYmIEpEVFV0aWxzLmlzUHVibGljTWV0aG9kKG1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kTWFwLnB1dChtZXRob2QsIGdldEFubm90YXRpb25NYXAobW9kZWwpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ldGhvZE1hcDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBCb29sZWFuPiBnZXRBbm5vdGF0aW9uTWFwKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgTWFwPFN0cmluZywgQm9vbGVhbj4gYW5ub3RhdGlvbmRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+KCk7Ci0gICAgICAgIGFubm90YXRpb25kTWFwLnB1dChDWEZNb2RlbFV0aWxzLldFQl9NRVRIT0QsIG1vZGVsLmlzR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCkpOwotICAgICAgICBhbm5vdGF0aW9uZE1hcC5wdXQoQ1hGTW9kZWxVdGlscy5XRUJfUEFSQU0sIG1vZGVsLmlzR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKSk7Ci0gICAgICAgIGFubm90YXRpb25kTWFwLnB1dChDWEZNb2RlbFV0aWxzLlJFUVVFU1RfV1JBUFBFUiwgbW9kZWwuaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpKTsKLSAgICAgICAgYW5ub3RhdGlvbmRNYXAucHV0KENYRk1vZGVsVXRpbHMuUkVTUE9OU0VfV1JBUFBFUiwgbW9kZWwuaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKSk7Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uZE1hcDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ1hGIHdzZGwyamF2YSAtYXV0b05hbWVSZXNvbHV0aW9uIGlzIHN1cHBvcnRlZCBpbiB0aGUgQ1hGIDIuMCBzdHJlYW0gZnJvbSAyLjAuNwotICAgICAqIGFuZCBpbiB0aGUgQ1hGIDIuMSBzdHJlYW0gZnJvbSAyLjEuMSB1cC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY3hmUnVudGltZVZlcnNpb24KLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXV0b05hbWVSZXNvbHV0aW9uUGVybWl0dGVkKCkgewotICAgICAgICBWZXJzaW9uIGN1cnJlbnRWZXJzaW9uID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q3VycmVudFJ1bnRpbWVWZXJzaW9uKCk7Ci0gICAgICAgIC8vT24gc3RhcnR1cCB3aXRoIGNsZWFuIHdvcmtzcGFjZSBzaG93IGJ5IGRlZmF1bHQuCi0gICAgICAgIGlmIChjdXJyZW50VmVyc2lvbi5jb21wYXJlVG8odl8wXzBfMCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY3VycmVudFZlcnNpb24uY29tcGFyZVRvKENYRk1vZGVsVXRpbHMudl8yXzFfMSkgPj0gMCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY3VycmVudFZlcnNpb24uY29tcGFyZVRvKENYRk1vZGVsVXRpbHMudl8yXzBfNykgPj0gMAotICAgICAgICAgICAgICAgICYmIGN1cnJlbnRWZXJzaW9uLmNvbXBhcmVUbyhDWEZNb2RlbFV0aWxzLnZfMl8xKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldERlZmF1bHRCb29sZWFuVmFsdWUoaW50IGNsYXNzaWZpZXJJRCwgaW50IGZlYXR1cmVJRCkgewotICAgICAgICBPYmplY3QgZGVmYXVsdFZhbHVlID0gbnVsbDsKLQotICAgICAgICBpZiAoY2xhc3NpZmllcklEID09IENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUjoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX1ZFUkJPU0U6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9WZXJib3NlKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldENYRkNvbnRleHRfR2VuZXJhdGVBbnRCdWlsZEZpbGUoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldENYRkNvbnRleHRfVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fR0VORVJBVEVfQ0xJRU5UOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldENYRkNvbnRleHRfR2VuZXJhdGVDbGllbnQoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fR0VORVJBVEVfU0VSVkVSOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldENYRkNvbnRleHRfR2VuZXJhdGVTZXJ2ZXIoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjbGFzc2lmaWVySUQgPT0gQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fU09BUDEyX0JJTkRJTkc6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfU29hcDEyQmluZGluZygpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1hTRF9JTVBPUlRTOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlWFNESW1wb3J0cygpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlM6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1NETDoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdTREwoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNsYXNzaWZpZXJJRCA9PSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCkgewotICAgICAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX05PX0FERFJFU1NfQklORElORzoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X05vQWRkcmVzc0JpbmRpbmcoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1VTRV9ERUZBVUxUX1ZBTFVFUzoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1VzZURlZmF1bHRWYWx1ZXMoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0FVVE9fTkFNRV9SRVNPTFVUSU9OOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfQXV0b05hbWVSZXNvbHV0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19QUk9DRVNTX1NPQVBfSEVBREVSUzoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1Byb2Nlc3NTT0FQSGVhZGVycygpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19HRU5FUkFURV9BTlRfQlVJTERfRklMRToKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X0dlbmVyYXRlQW50QnVpbGRGaWxlKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19WQUxJREFURToKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1ZhbGlkYXRlKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0V1NETDJKYXZhQ29udGV4dF9Mb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUzoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY1VzZURlZmF1bHRWYWx1ZXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklORzoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY1RvU3RyaW5nKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkU6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9YamNUb1N0cmluZ011bHRpTGluZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX1NJTVBMRToKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY1RvU3RyaW5nU2ltcGxlKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfTE9DQVRPUjoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY0xvY2F0b3IoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19TWU5DX01FVEhPRFM6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9YamNTeW5jTWV0aG9kcygpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX01BUktfR0VORVJBVEVEOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfWGpjTWFya0dlbmVyYXRlZCgpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsICYmIGRlZmF1bHRWYWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLSAgICAgICAgICAgIHJldHVybiAoKEJvb2xlYW4pIGRlZmF1bHRWYWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL0NvbW1hbmRMaW5lVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvQ29tbWFuZExpbmVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWQ2OGJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvQ29tbWFuZExpbmVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21tYW5kTGluZVV0aWxzIHsKLSAgICAvLyBKYXZhMldTREwKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgT1VUX0ZJTEUgPSAiLW8iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFJFU09VUkNFX0RJUiA9ICItZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgU09VUkNFX0RJUiA9ICItcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ0xBU1NfRElSID0gIi1jbGFzc2RpciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSjJXX0NMQVNTUEFUSCA9ICItY3AiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIElOQ19TT0FQMTIgPSAiLXNvYXAxMiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRSA9ICItdCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSjJXX1NFUlZJQ0VfTkFNRSA9ICItc2VydmljZW5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBPUlRfTkFNRSA9ICItcG9ydG5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEdFTl9YU0RfSU1QT1JUUyA9ICItY3JlYXRleHNkaW1wb3J0cyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVkVSQk9TRSA9ICItdmVyYm9zZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIEphdmEyV1MKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSjJXX0ZST05URU5EID0gIi1mcm9udGVuZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSjJXX0RBVEFCSU5ESU5HID0gIi1kYXRhYmluZGluZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQkVBTl9QQVRIID0gIi1iZWFucyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgR0VOX1dTREwgPSAiLXdzZGwiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEdFTl9DTElFTlQgPSAiLWNsaWVudCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgR0VOX1NFUlZFUiA9ICItc2VydmVyIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBHRU5fV1JBUFBFUl9GQVVMVCA9ICItd3JhcHBlcmJlYW4iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX1BBQ0tBR0VfTkFNRSA9ICItcCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX0JJTkRJTkdfTkFNRSA9ICItYiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfRlJPTlRFTkQgPSAiLWZlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfREFUQUJJTkRJTkcgPSAiLWRiIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfV1NETF9WRVJTSU9OID0gIi13diI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX1NFUlZJQ0VfTkFNRSA9ICItc24iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFcySl9DQVRBTE9HID0gIi1jYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfQ09NUElMRSA9ICItY29tcGlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX0dFTl9JTVBMID0gIi1pbXBsIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfR0VOX0FMTCA9ICItYWxsIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfTk9fT1ZFUldSSVRFID0gIi1rZWVwIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfREVGQVVMVF9WQUxVRVMgPSAiLWRlZmF1bHRWYWx1ZXMiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFcySl9BVVRPX05BTUVfUkVTT0xVVElPTiA9ICItYXV0b05hbWVSZXNvbHV0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfRVhDTFVERV9OQU1FU1BBQ0UgPSAiLW5leGNsdWRlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfRVhUX1NPQVBfSEVBREVSID0gIi1leHNoIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfREVGQVVMVF9OQU1FU1BBQ0UgPSAiLWRucyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX0RFRkFVTFRfRVhDTFVERV9OUyA9ICItZGV4IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfV1NETF9MT0NBVElPTiA9ICItd3NkbExvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfWEpDX0FSR1MgPSAiLXhqYyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX05PX0FERFJFU1NfQklORElORyA9ICItbm9BZGRyZXNzQmluZGluZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX1ZBTElEQVRFX1dTREwgPSAiLXZhbGlkYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gWEpDCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19EVl9BUkcgPSAiLVhkdiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX1RTX0FSRyA9ICItWHRzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfVFNfTVVMVElfQVJHID0gIi1YdHM6c3R5bGU6bXVsdGlsaW5lIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfVFNfU0lNUExFID0gIi1YdHM6c3R5bGU6c2ltcGxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfTE9DQVRPUl9BUkcgPSAiLVhsb2NhdG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfU1lOQ19NRVRIT0RTX0FSRyA9ICItWHN5bmMtbWV0aG9kcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX01BUktfR0VORVJBVEVEX0FSRyA9ICItbWFyay1nZW5lcmF0ZWQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19FUElTT0RFX0ZJTEVfQVJHID0gIi1lcGlzb2RlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBDb21tYW5kTGluZVV0aWxzKCkgewotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEphdmEyV1NQcm9ncmFtQXJndW1lbnRzKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHByb2dBcmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSk7Ci0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSAmJiBKRFRVdGlscy5pc0phdmFQcm9qZWN0KHByb2plY3QpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gbW9kZWwuZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKTsKLSAgICAgICAgICAgIGlmIChtb2RlbC5pc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpICYmIG1vZGVsLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBtb2RlbC5nZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEFkZCBhbGwgdGhlIGVhcmxpZXIgd3NkbDJqYXZhIHRvb2wgb3B0aW9ucwotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkQWxsKEFycmF5cy5hc0xpc3QoQ29tbWFuZExpbmVVdGlscy5nZXRTdGFuZGFyZEphdmEyV1NETFByb2dyYW1Bcmd1bWVudHMobW9kZWwpKSk7Ci0KLSAgICAgICAgICAgIGlmIChtb2RlbC5nZXRDeGZSdW50aW1lVmVyc2lvbigpLmNvbXBhcmVUbyhDWEZDb3JlUGx1Z2luLkNYRl9WRVJTSU9OXzJfMSkgPj0gMCkgewotICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChKMldfRlJPTlRFTkQpOwotICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChtb2RlbC5nZXRGcm9udGVuZCgpLmdldExpdGVyYWwoKSk7Ci0KLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQoSjJXX0RBVEFCSU5ESU5HKTsKLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQobW9kZWwuZ2V0RGF0YWJpbmRpbmcoKS5nZXRMaXRlcmFsKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gcHJvZ0FyZ3MuYWRkKEJFQU5fUEFUSCk7Ci0gICAgICAgICAgICAgICAgLy8gcHJvZ0FyZ3MuYWRkKCJCRUFOX1BBVEgiKTsKLQotICAgICAgICAgICAgICAgIGlmIChtb2RlbC5pc0dlbmVyYXRlV1NETCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChHRU5fV1NETCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ0FyZ3MucmVtb3ZlKE9VVF9GSUxFKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ0FyZ3MucmVtb3ZlKG1vZGVsLmdldFdzZGxGaWxlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXNHZW5lcmF0ZUNsaWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChHRU5fQ0xJRU5UKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKG1vZGVsLmlzR2VuZXJhdGVTZXJ2ZXIoKSkgewotICAgICAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQoR0VOX1NFUlZFUik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1vZGVsLmlzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChHRU5fV1JBUFBFUl9GQVVMVCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcm9nQXJncy5hZGQoY2xhc3NOYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSBwcm9nQXJncy50b0FycmF5KG5ldyBTdHJpbmdbcHJvZ0FyZ3Muc2l6ZSgpXSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldFN0YW5kYXJkSmF2YTJXU0RMUHJvZ3JhbUFyZ3VtZW50cyhKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwcm9nQXJncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBwcm9nQXJncy5hZGQoSjJXX0NMQVNTUEFUSCk7Ci0gICAgICAgIHByb2dBcmdzLmFkZChKRFRVdGlscy5nZXRKYXZhUHJvamVjdE91dHB1dERpcmVjdG9yeVBhdGgocHJvamVjdE5hbWUpKTsKLQotICAgICAgICBwcm9nQXJncy5hZGQoU09VUkNFX0RJUik7Ci0gICAgICAgIHByb2dBcmdzLmFkZChGaWxlVXRpbHMuZ2V0VG1wRm9sZGVyKHByb2plY3ROYW1lKSArICIvc3JjIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBwcm9nQXJncy5hZGQoUkVTT1VSQ0VfRElSKTsKLSAgICAgICAgcHJvZ0FyZ3MuYWRkKEZpbGVVdGlscy5nZXRUbXBGb2xkZXIocHJvamVjdE5hbWUpICsgIi93c2RsIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBwcm9nQXJncy5hZGQoQ0xBU1NfRElSKTsKLSAgICAgICAgcHJvZ0FyZ3MuYWRkKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0T3V0cHV0RGlyZWN0b3J5UGF0aChwcm9qZWN0TmFtZSkpOwotCi0gICAgICAgIHByb2dBcmdzLmFkZChPVVRfRklMRSk7Ci0gICAgICAgIHByb2dBcmdzLmFkZCgoKEphdmEyV1NEYXRhTW9kZWwpIG1vZGVsKS5nZXRXc2RsRmlsZU5hbWUoKSk7Ci0KLSAgICAgICAgaWYgKG1vZGVsLmlzU29hcDEyQmluZGluZygpKSB7Ci0gICAgICAgICAgICBwcm9nQXJncy5hZGQoSU5DX1NPQVAxMik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vZGVsLmlzR2VuZXJhdGVYU0RJbXBvcnRzKCkpIHsKLSAgICAgICAgICAgIHByb2dBcmdzLmFkZChHRU5fWFNEX0lNUE9SVFMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1vZGVsLmlzVmVyYm9zZSgpKSB7Ci0gICAgICAgICAgICBwcm9nQXJncy5hZGQoVkVSQk9TRSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIHByb2dBcmdzLnRvQXJyYXkobmV3IFN0cmluZ1twcm9nQXJncy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFdTREwySmF2YVByb2dyYW1Bcmd1bWVudHMoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwcm9nQXJncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpICYmIEpEVFV0aWxzLmlzSmF2YVByb2plY3QocHJvamVjdCkpIHsKLSAgICAgICAgICAgIC8vIEFkZCBTdGFuZGFyZCBhcmdzCi0gICAgICAgICAgICBwcm9nQXJncy5hZGRBbGwoQXJyYXlzLmFzTGlzdChDb21tYW5kTGluZVV0aWxzLmdldFN0YW5kYXJkV1NETDJKYXZhUHJvZ3JhbUFyZ3VtZW50cyhtb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdE5hbWUpKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG1vZGVsLmdldFNlcnZpY2VOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCAmJiBzZXJ2aWNlTmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQoVzJKX1NFUlZJQ0VfTkFNRSk7Ci0gICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1vZGVsLmlzVXNlRGVmYXVsdFZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFcySl9ERUZBVUxUX1ZBTFVFUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtb2RlbC5nZXRDeGZSdW50aW1lVmVyc2lvbigpLmNvbXBhcmVUbyhDWEZDb3JlUGx1Z2luLkNYRl9WRVJTSU9OXzJfMSkgPj0gMCkgewotICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChXMkpfRlJPTlRFTkQpOwotICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChtb2RlbC5nZXRGcm9udGVuZCgpLmdldExpdGVyYWwoKSk7Ci0KLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQoVzJKX0RBVEFCSU5ESU5HKTsKLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQobW9kZWwuZ2V0RGF0YWJpbmRpbmcoKS5nZXRMaXRlcmFsKCkpOwotCi0gICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFcySl9XU0RMX1ZFUlNJT04pOwotICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChtb2RlbC5nZXRXc2RsVmVyc2lvbigpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXNOb0FkZHJlc3NCaW5kaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFcySl9OT19BRERSRVNTX0JJTkRJTkcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKG1vZGVsLmdldFdzZGxVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSBwcm9nQXJncy50b0FycmF5KG5ldyBTdHJpbmdbcHJvZ0FyZ3Muc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRXU0RMMkphdmFHZW5lcmF0ZUNsaWVudEFyZ3VtZW50cyhXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0UHJvamVjdE5hbWUoKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHByb2dBcmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkgJiYgSkRUVXRpbHMuaXNKYXZhUHJvamVjdChwcm9qZWN0KSkgewotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKEdFTl9DTElFTlQpOwotCi0gICAgICAgICAgICAvLyBBZGQgV1NMRDJKYXZhIGFyZ3MKLSAgICAgICAgICAgIHByb2dBcmdzLmFkZEFsbChBcnJheXMuYXNMaXN0KENvbW1hbmRMaW5lVXRpbHMuZ2V0V1NETDJKYXZhUHJvZ3JhbUFyZ3VtZW50cyhtb2RlbCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSBwcm9nQXJncy50b0FycmF5KG5ldyBTdHJpbmdbcHJvZ0FyZ3Muc2l6ZSgpXSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U3RhbmRhcmRXU0RMMkphdmFQcm9ncmFtQXJndW1lbnRzKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwcm9nQXJncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBwcm9nQXJncy5hZGQoUkVTT1VSQ0VfRElSKTsKLSAgICAgICAgcHJvZ0FyZ3MuYWRkKEZpbGVVdGlscy5nZXRUbXBGb2xkZXIocHJvamVjdE5hbWUpICsgIi9zcmMiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHByb2dBcmdzLmFkZChDTEFTU19ESVIpOwotICAgICAgICBwcm9nQXJncy5hZGQoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3RPdXRwdXREaXJlY3RvcnlQYXRoKHByb2plY3ROYW1lKSk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBpbmNsdWRlZE5hbWVzcGFjZXMgPSBtb2RlbC5nZXRJbmNsdWRlZE5hbWVzcGFjZXMoKTsKLSAgICAgICAgaWYgKGluY2x1ZGVkTmFtZXNwYWNlcyAhPSBudWxsICYmIG1vZGVsLmdldEluY2x1ZGVkTmFtZXNwYWNlcygpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIFNldDxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBpbmNsdWRlZE5hbWVzcGFjZXNFbnRyeVNldCA9IGluY2x1ZGVkTmFtZXNwYWNlcy5lbnRyeVNldCgpOwotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogaW5jbHVkZWROYW1lc3BhY2VzRW50cnlTZXQpIHsKLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQoVzJKX1BBQ0tBR0VfTkFNRSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHdzZGxOYW1lc3BhY2UgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZCh3c2RsTmFtZXNwYWNlICsgIj0iICsgcGFja2FnZU5hbWUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFN0cmluZz4gYmluZGluZ0ZpbGVzID0gbW9kZWwuZ2V0QmluZGluZ0ZpbGVzKCk7Ci0gICAgICAgIGlmICghYmluZGluZ0ZpbGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgYmluZGluZ0ZpbGUgOiBiaW5kaW5nRmlsZXMpIHsKLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQoVzJKX0JJTkRJTkdfTkFNRSk7Ci0gICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKGJpbmRpbmdGaWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKG1vZGVsLmlzR2VuZXJhdGVTZXJ2ZXIoKSkgewotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKEdFTl9TRVJWRVIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1vZGVsLmlzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpKSB7Ci0gICAgICAgICAgICBwcm9nQXJncy5hZGQoVzJKX0dFTl9JTVBMKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1vZGVsLmlzVmFsaWRhdGUoKSkgewotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFcySl9WQUxJREFURV9XU0RMKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvZ0FyZ3MuYWRkKFcySl9FWFRfU09BUF9IRUFERVIpOwotICAgICAgICBwcm9nQXJncy5hZGQoQm9vbGVhbi50b1N0cmluZyhtb2RlbC5pc1Byb2Nlc3NTT0FQSGVhZGVycygpKSk7Ci0gICAgICAgIAotICAgICAgICBwcm9nQXJncy5hZGQoVzJKX0RFRkFVTFRfTkFNRVNQQUNFKTsKLSAgICAgICAgcHJvZ0FyZ3MuYWRkKEJvb2xlYW4udG9TdHJpbmcobW9kZWwuaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpKSk7Ci0gICAgICAgIAotICAgICAgICBwcm9nQXJncy5hZGQoVzJKX0RFRkFVTFRfRVhDTFVERV9OUyk7Ci0gICAgICAgIHByb2dBcmdzLmFkZChCb29sZWFuLnRvU3RyaW5nKG1vZGVsLmlzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKSkpOwotCi0gICAgICAgIGlmIChtb2RlbC5pc0F1dG9OYW1lUmVzb2x1dGlvbigpICYmIENYRk1vZGVsVXRpbHMuaXNBdXRvTmFtZVJlc29sdXRpb25QZXJtaXR0ZWQoKSkgewotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFcySl9BVVRPX05BTUVfUkVTT0xVVElPTik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgeGpjQXJncyA9IENvbW1hbmRMaW5lVXRpbHMuZ2V0WEpDQXJncyhtb2RlbCk7Ci0gICAgICAgIGlmICh4amNBcmdzLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHByb2dBcmdzLmFkZChXMkpfWEpDX0FSR1MgKyB4amNBcmdzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtb2RlbC5nZXRXc2RsTG9jYXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9nQXJncy5hZGQoVzJKX1dTRExfTE9DQVRJT04pOwotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKG1vZGVsLmdldFdzZGxMb2NhdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKG1vZGVsLmlzVmVyYm9zZSgpKSB7Ci0gICAgICAgICAgICBwcm9nQXJncy5hZGQoVkVSQk9TRSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgcHJvZ0FyZ3MudG9BcnJheShuZXcgU3RyaW5nW3Byb2dBcmdzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRYSkNBcmdzKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBMaXN0PFN0cmluZz4geGpjQXJncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBpZiAobW9kZWwuaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkpIHsKLSAgICAgICAgICAgIHhqY0FyZ3MuYWRkKFhKQ19EVl9BUkcpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtb2RlbC5pc1hqY1RvU3RyaW5nKCkpIHsKLSAgICAgICAgICAgIHhqY0FyZ3MuYWRkKFhKQ19UU19BUkcpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtb2RlbC5pc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkpIHsKLSAgICAgICAgICAgIHhqY0FyZ3MuYWRkKFhKQ19UU19NVUxUSV9BUkcpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtb2RlbC5pc1hqY1RvU3RyaW5nU2ltcGxlKCkpIHsKLSAgICAgICAgICAgIHhqY0FyZ3MuYWRkKFhKQ19UU19TSU1QTEUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtb2RlbC5pc1hqY0xvY2F0b3IoKSkgewotICAgICAgICAgICAgeGpjQXJncy5hZGQoWEpDX0xPQ0FUT1JfQVJHKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobW9kZWwuaXNYamNTeW5jTWV0aG9kcygpKSB7Ci0gICAgICAgICAgICB4amNBcmdzLmFkZChYSkNfU1lOQ19NRVRIT0RTX0FSRyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vZGVsLmlzWGpjTWFya0dlbmVyYXRlZCgpKSB7Ci0gICAgICAgICAgICB4amNBcmdzLmFkZChYSkNfTUFSS19HRU5FUkFURURfQVJHKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB4amNBcmcgPSB4amNBcmdzLnRvU3RyaW5nKCk7Ci0gICAgICAgIHhqY0FyZyA9IHhqY0FyZy5yZXBsYWNlKCdbJywgJyAnKTsgICAgICAgIAotICAgICAgICB4amNBcmcgPSB4amNBcmcucmVwbGFjZSgnXScsICcgJyk7Ci0gICAgICAgIAotICAgICAgICB4amNBcmcgPSB4amNBcmcucmVwbGFjZUFsbCgiXFxzIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgCi0gICAgICAgIHJldHVybiB4amNBcmcudHJpbSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvRmlsZVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL0ZpbGVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGMzMzU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvRmlsZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLldTRExVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuRm9ybWF0UHJvY2Vzc29yc0V4dGVuc2lvblJlYWRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBGaWxlVXRpbHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRNUF9GT0xERVJfTkFNRSA9ICIuY3hmdG1wIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBGaWxlVXRpbHMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlGb2xkZXIoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIGRlc3RpbmF0aW9uKSB7Ci0gICAgICAgIEZpbGUgc291cmNlRm9sZGVyID0gbmV3IEZpbGUoc291cmNlKTsKLQotICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IHNvdXJjZUZvbGRlci5saXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHNvdXJjZUZvbGRlciArIEZpbGUuc2VwYXJhdG9yICsgZmlsZXNbaV0pOwotICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIGNvcHlGb2xkZXIoc291cmNlLCBkZXN0aW5hdGlvbiwgZmlsZXNbaV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb3B5RmlsZShzb3VyY2UsIGRlc3RpbmF0aW9uLCBmaWxlc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNvcHlGb2xkZXIoU3RyaW5nIHNvdXJjZUZvbGRlciwgU3RyaW5nIHRhcmdldEZvbGRlciwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgRmlsZSB0YXJnZXQgPSBuZXcgRmlsZSh0YXJnZXRGb2xkZXIgKyBGaWxlLnNlcGFyYXRvciArIG5hbWUpOwotICAgICAgICBpZiAoIXRhcmdldC5leGlzdHMoKSkgewotICAgICAgICAgICAgdGFyZ2V0Lm1rZGlyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29weUZvbGRlcihzb3VyY2VGb2xkZXIgKyBGaWxlLnNlcGFyYXRvciArIG5hbWUsIHRhcmdldEZvbGRlciArIEZpbGUuc2VwYXJhdG9yICsgbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlGaWxlKFN0cmluZyBzb3VyY2VGb2xkZXIsIFN0cmluZyB0YXJnZXRGb2xkZXIsIFN0cmluZyBmaWxlTmFtZSkgewotICAgICAgICBGaWxlIHNvdXJjZUZpbGUgPSBuZXcgRmlsZShzb3VyY2VGb2xkZXIgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lKTsKLSAgICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0Rm9sZGVyICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZSk7Ci0gICAgICAgIGlmICghdGFyZ2V0RmlsZS5leGlzdHMoKSkgewotICAgICAgICAJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotCQkgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2VGaWxlKTsKLSAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJnZXRGaWxlKTsKLSAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNDAwXTsKLSAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyT2ZCeXRlcyA9IGlucHV0U3RyZWFtLnJlYWQoYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlck9mQnl0ZXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoYnVmZmVyLCAwLCBudW1iZXJPZkJ5dGVzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coZm5mZSk7Ci0JCSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhpb2UpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCSAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCSAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsgICAgCi0JCQkJICAgIH0KLQkJCQkgICAgaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJICAgICAgICBvdXRwdXRTdHJlYW0uY2xvc2UoKTsgICAgCi0JCQkJICAgIH0KLQkJCQl9IGNhdGNoKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhpb2UpOwotCQkJCX0KLQkJCX0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChzb3VyY2VGaWxlLmdldE5hbWUoKS5pbmRleE9mKCIuamF2YSIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBNZXJnZVV0aWxzLm1lcmdlKHNvdXJjZUZpbGUsIHRhcmdldEZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VG1wRm9sZGVyTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIFRNUF9GT0xERVJfTkFNRTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VG1wRm9sZGVyKFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICByZXR1cm4gRmlsZVV0aWxzLmdldFRtcEZvbGRlcihGaWxlVXRpbHMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRtcEZvbGRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIElGb2xkZXIgdG1wRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoVE1QX0ZPTERFUl9OQU1FKTsKLSAgICAgICAgaWYgKCF0bXBGb2xkZXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdG1wRm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElGb2xkZXIgdG1wU3JjRm9sZGVyID0gdG1wRm9sZGVyLmdldEZvbGRlcigic3JjIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKCF0bXBTcmNGb2xkZXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdG1wU3JjRm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElGb2xkZXIgdG1wV1NETEZvbGRlciA9IHRtcEZvbGRlci5nZXRGb2xkZXIoIndzZGwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoIXRtcFdTRExGb2xkZXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdG1wV1NETEZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0bXBGb2xkZXIuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlXMkpGaWxlc0Zyb21UbXAoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCi0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSk7Ci0gICAgICAgIElGb2xkZXIgc3JjRm9sZGVyID0gd29ya3NwYWNlUm9vdC5nZXRGb2xkZXIobmV3IFBhdGgobW9kZWwuZ2V0SmF2YVNvdXJjZUZvbGRlcigpKSk7Ci0gICAgICAgIEZpbGVVdGlscy5jb3B5Rm9sZGVyKGdldFRtcEZvbGRlcihwcm9qZWN0KSArICIvc3JjIiwgc3JjRm9sZGVyLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzcmNGb2xkZXIucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICBkZWxldGVUbXBGb2xkZXIocHJvamVjdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlKMldGaWxlc0Zyb21UbXAoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRQcm9qZWN0TmFtZSgpOwotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gRmlsZVV0aWxzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCi0gICAgICAgIElUeXBlIHR5cGUgPSBKRFRVdGlscy5nZXRUeXBlKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKSwgbW9kZWwuZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKSk7Ci0gICAgICAgIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0UGFyZW50KCk7Ci0gICAgICAgIElSZXNvdXJjZSBqYXZhRWxlbWVudFJlc291cmNlID0gamF2YUVsZW1lbnQuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgaWYgKGphdmFFbGVtZW50UmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElGb2xkZXIgc3JjRGlyZWN0b3J5ID0gKElGb2xkZXIpIGphdmFFbGVtZW50UmVzb3VyY2U7Ci0gICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlGb2xkZXIoZ2V0VG1wRm9sZGVyKHByb2plY3QpICsgIi9zcmMiLCBzcmNEaXJlY3RvcnkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgc3JjRGlyZWN0b3J5LnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsICBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXNHZW5lcmF0ZVdTREwoKSkgewotICAgICAgICAgICAgICAgICAgICBJRm9sZGVyIHdzZGxGb2xkZXIgPSBXU0RMVXRpbHMuZ2V0V1NETEZvbGRlcihwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5Rm9sZGVyKGdldFRtcEZvbGRlcihwcm9qZWN0KSArICIvd3NkbCIsIHdzZGxGb2xkZXIuZ2V0TG9jYXRpb24oKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvT1NTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldENvbmZpZ1dzZGxMb2NhdGlvbih3c2RsRm9sZGVyLmdldE5hbWUoKSArICIvIiAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbW9kZWwuZ2V0V3NkbEZpbGVOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB3c2RsRm9sZGVyLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBkZWxldGVUbXBGb2xkZXIocHJvamVjdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBkZWxldGVUbXBGb2xkZXIoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0KLSAgICAgICAgSUZvbGRlciB0bXBGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihUTVBfRk9MREVSX05BTUUpOwotICAgICAgICBpZiAodG1wRm9sZGVyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRtcEZvbGRlci5kZWxldGUodHJ1ZSwgZmFsc2UsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZpbGVJbldlYkNvbnRlbnRGb2xkZXIoSVByb2plY3QgcHJvamVjdCwgSVBhdGggZmlsZVBhdGgpIHsKLSAgICAJSVBhdGggd2ViQ29udGVudFBhdGggPSBXU0RMVXRpbHMuZ2V0V2ViQ29udGVudEZvbGRlcihwcm9qZWN0KS5nZXRMb2NhdGlvbigpOwotICAgIAlpZiAod2ViQ29udGVudFBhdGguaXNQcmVmaXhPZihmaWxlUGF0aCkpIHsKLSAgICAgICAJCXJldHVybiB0cnVlOwotICAgIAl9Ci0gICAgCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmlsZUluV29ya3NwYWNlKFVSTCBmaWxlVVJMKSB7Ci0gICAgICAgIElQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoZmlsZVVSTC5nZXRQYXRoKCkpOwotCi0gICAgICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICBJUGF0aCB3b3Jrc3BhY2VQYXRoID0gd29ya3NwYWNlUm9vdC5nZXRMb2NhdGlvbigpOwotICAgICAgICBpZiAoZmlsZVBhdGguaXNWYWxpZFBhdGgod29ya3NwYWNlUGF0aC50b09TU3RyaW5nKCkpKSB7Ci0gICAgICAgIAlyZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZvcm1hdFhNTEZpbGUoSUZpbGUgZmlsZSkgewotICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudERlc2NyaXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgICAgICAgICAgICBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBGb3JtYXRQcm9jZXNzb3JzRXh0ZW5zaW9uUmVhZGVyLmdldEluc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGb3JtYXRQcm9jZXNzb3IoY29udGVudFR5cGUuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZvcm1hdFByb2Nlc3NvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdFByb2Nlc3Nvci5mb3JtYXRGaWxlKGZpbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhpb2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gRmlsZVV0aWxzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBGaWxlVXRpbHMucmVmcmVzaFByb2plY3QocHJvamVjdCwgbW9uaXRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBtb25pdG9yKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9MYXVuY2hVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9MYXVuY2hVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDhjZTNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvTGF1bmNoVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuVk1SdW5uZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuQ29uc29sZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLklDb25zb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSUNvbnNvbGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5JQ29uc29sZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5JQ29uc29sZVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5JT0NvbnNvbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5NZXNzYWdlQ29uc29sZTsKLQotcHVibGljIGZpbmFsIGNsYXNzIExhdW5jaFV0aWxzIHsKLSAgICAKLSAgICBwcml2YXRlIExhdW5jaFV0aWxzKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyBsYXVuY2goU3RyaW5nW10gcnVudGltZUNsYXNzcGF0aCwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nW10gcHJvZ3JhbUFyZ3MpIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVZNSW5zdGFsbCB2bUluc3RhbGwgPSBKYXZhUnVudGltZS5nZXREZWZhdWx0Vk1JbnN0YWxsKCk7Ci0gICAgICAgICAgICBJVk1SdW5uZXIgdm1SdW5uZXIgPSB2bUluc3RhbGwuZ2V0Vk1SdW5uZXIoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpOwotICAgICAgICAgICAgVk1SdW5uZXJDb25maWd1cmF0aW9uIHZtUnVubmVyQ29uZmlndXJhdGlvbiA9IG5ldyBWTVJ1bm5lckNvbmZpZ3VyYXRpb24oY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICBydW50aW1lQ2xhc3NwYXRoKTsKLSAgICAgICAgICAgIHZtUnVubmVyQ29uZmlndXJhdGlvbi5zZXRQcm9ncmFtQXJndW1lbnRzKHByb2dyYW1BcmdzKTsKLQotICAgICAgICAgICAgSUxhdW5jaCBsYXVuY2ggPSBuZXcgTGF1bmNoKG51bGwsIElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLCBudWxsKTsKLSAgICAgICAgICAgIHZtUnVubmVyLnJ1bih2bVJ1bm5lckNvbmZpZ3VyYXRpb24sIGxhdW5jaCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIHdoaWxlICghbGF1bmNoLmlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coaWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSVByb2Nlc3NbXSBwcm9jZXNzZXMgPSBsYXVuY2guZ2V0UHJvY2Vzc2VzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgb3V0cHV0U3RyZWFtID0gcHJvY2Vzc2VzWzBdLmdldFN0cmVhbXNQcm94eSgpLmdldE91dHB1dFN0cmVhbU1vbml0b3IoKS5nZXRDb250ZW50cygpOwotICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsICYmIG91dHB1dFN0cmVhbS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgQ1hGQ29yZVBsdWdpbi5QTFVHSU5fSUQsIG91dHB1dFN0cmVhbSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxhdW5jaChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZ1tdIHByb2dyYW1BcmdzKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IEphdmFSdW50aW1lLmdldFZNSW5zdGFsbChqYXZhUHJvamVjdCk7Ci0gICAgICAgIGlmICh2bUluc3RhbGwgPT0gbnVsbCkgewotICAgICAgICAgICAgdm1JbnN0YWxsID0gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdFZNSW5zdGFsbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgSVZNUnVubmVyIHZtUnVubmVyID0gdm1JbnN0YWxsLmdldFZNUnVubmVyKElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFKTsKLSAgICAgICAgU3RyaW5nW10gcnVudGltZUNsYXNzcGF0aCA9IEphdmFSdW50aW1lLmNvbXB1dGVEZWZhdWx0UnVudGltZUNsYXNzUGF0aChqYXZhUHJvamVjdCk7Ci0gICAgICAgIFZNUnVubmVyQ29uZmlndXJhdGlvbiB2bVJ1bm5lckNvbmZpZ3VyYXRpb24gPSBuZXcgVk1SdW5uZXJDb25maWd1cmF0aW9uKGNsYXNzTmFtZSwgcnVudGltZUNsYXNzcGF0aCk7Ci0KLSAgICAgICAgdm1SdW5uZXJDb25maWd1cmF0aW9uLnNldFByb2dyYW1Bcmd1bWVudHMocHJvZ3JhbUFyZ3MpOwotCi0gICAgICAgIGlmICh2bUluc3RhbGwgaW5zdGFuY2VvZiBJVk1JbnN0YWxsMikgewotICAgICAgICAgICAgSVZNSW5zdGFsbDIgaW5zdGFsbDIgPSAoSVZNSW5zdGFsbDIpIHZtSW5zdGFsbDsKLSAgICAgICAgICAgIGlmIChpbnN0YWxsMi5nZXRKYXZhVmVyc2lvbigpLmNvbXBhcmVUbyhKYXZhQ29yZS5WRVJTSU9OXzFfNikgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdm1SdW5uZXJDb25maWd1cmF0aW9uLnNldFZNQXJndW1lbnRzKG5ldyBTdHJpbmdbXSB7ICItRGphdmEuZW5kb3JzZWQuZGlycz0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCkuZ2V0Q3hmUnVudGltZUxvY2F0aW9uKCkgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBJTGF1bmNoIGxhdW5jaCA9IG5ldyBMYXVuY2gobnVsbCwgSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG51bGwpOwotICAgICAgICB2bVJ1bm5lci5ydW4odm1SdW5uZXJDb25maWd1cmF0aW9uLCBsYXVuY2gsIG51bGwpOwotCi0gICAgICAgIHdoaWxlICghbGF1bmNoLmlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhpZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBJUHJvY2Vzc1tdIHByb2Nlc3NlcyA9IGxhdW5jaC5nZXRQcm9jZXNzZXMoKTsKLQotICAgICAgICBTdHJpbmcgb3V0cHV0U3RyZWFtID0gcHJvY2Vzc2VzWzBdLmdldFN0cmVhbXNQcm94eSgpLmdldE91dHB1dFN0cmVhbU1vbml0b3IoKS5nZXRDb250ZW50cygpOwotICAgICAgICBsb2dTdHJlYW0ob3V0cHV0U3RyZWFtKTsKLSAgICAgICAgU3RyaW5nIGVycm9yU3RyZWFtID0gcHJvY2Vzc2VzWzBdLmdldFN0cmVhbXNQcm94eSgpLmdldEVycm9yU3RyZWFtTW9uaXRvcigpLmdldENvbnRlbnRzKCk7Ci0gICAgICAgIGxvZ1N0cmVhbShlcnJvclN0cmVhbSk7Ci0gICAgICAKLSAgICAgICAgbG9nRXJyb3JTdHJlYW1Db250ZW50cyhlcnJvclN0cmVhbSwgY2xhc3NOYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ1N0cmVhbShTdHJpbmcgb3V0cHV0U3RyZWFtKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlQ29uc29sZSBjeGZDb25zb2xlID0gZ2V0Q1hGQ29uc29sZSgpOwotICAgICAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgICAgICBpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29uc29sZV92aWV3X2lkID0gSUNvbnNvbGVDb25zdGFudHMuSURfQ09OU09MRV9WSUVXOwotICAgICAgICAgICAgICAgIElDb25zb2xlVmlldyBjb25zb2xlVmlldyA9IChJQ29uc29sZVZpZXcpIHdvcmtiZW5jaFBhZ2Uuc2hvd1ZpZXcoY29uc29sZV92aWV3X2lkKTsKLSAgICAgICAgICAgICAgICBjb25zb2xlVmlldy5kaXNwbGF5KGN4ZkNvbnNvbGUpOwotICAgICAgICAgICAgICAgIElPQ29uc29sZU91dHB1dFN0cmVhbSBjb25zb2xlT3V0cHV0U3RyZWFtID0gY3hmQ29uc29sZS5uZXdPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBjb25zb2xlT3V0cHV0U3RyZWFtLndyaXRlKG91dHB1dFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgY29uc29sZU91dHB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpIHsKLSAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKHBpZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coaW9lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE1lc3NhZ2VDb25zb2xlIGdldENYRkNvbnNvbGUoKSB7Ci0gICAgICAgIENvbnNvbGVQbHVnaW4gY29uc29sZVBsdWdpbiA9IENvbnNvbGVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotICAgICAgICBJQ29uc29sZU1hbmFnZXIgY29uc29sZU1hbmFnZXIgPSBjb25zb2xlUGx1Z2luLmdldENvbnNvbGVNYW5hZ2VyKCk7Ci0gICAgICAgIElDb25zb2xlW10gZXhpc3RpbmdDb25zb2xlcyA9IGNvbnNvbGVNYW5hZ2VyLmdldENvbnNvbGVzKCk7Ci0gICAgICAgIENYRkNvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhpc3RpbmdDb25zb2xlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICBpZiAoZXhpc3RpbmdDb25zb2xlc1tpXS5nZXROYW1lKCkuZXF1YWxzKGNvbnRleHQuZ2V0Q3hmUnVudGltZUVkaXRpb24oKSArICIgIiAKLSAgICAgICAgICAgICAgICAgICArIGNvbnRleHQuZ2V0Q3hmUnVudGltZVZlcnNpb24oKSkpIHsKLSAgICAgICAgICAgICAgIHJldHVybiAoTWVzc2FnZUNvbnNvbGUpIGV4aXN0aW5nQ29uc29sZXNbaV07IAotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgTWVzc2FnZUNvbnNvbGUgY3hmQ29uc29sZSA9IG5ldyBNZXNzYWdlQ29uc29sZShjb250ZXh0LmdldEN4ZlJ1bnRpbWVFZGl0aW9uKCkgKyAiICIgCi0gICAgICAgICAgICAgICAgKyBjb250ZXh0LmdldEN4ZlJ1bnRpbWVWZXJzaW9uKCksCi0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENYRkNvcmVQbHVnaW4uUExVR0lOX0lELCAKLSAgICAgICAgICAgICAgICAgICAgICAgICJpY29ucy92aWV3MTYvY29uc29sZV92aWV3LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjb25zb2xlTWFuYWdlci5hZGRDb25zb2xlcyhuZXcgSUNvbnNvbGVbXXtjeGZDb25zb2xlfSk7Ci0gICAgICAgIHJldHVybiBjeGZDb25zb2xlOwotICAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ0Vycm9yU3RyZWFtQ29udGVudHMoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAJU3RyaW5nIHRvb2xOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSArIDEsICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgY2xhc3NOYW1lLmxlbmd0aCgpKTsKLQotICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UuaW5kZXhPZih0b29sTmFtZSArICIgRXJyb3IiKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgU3RhdHVzIHRvb2xTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKLSAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyh0b29sU3RhdHVzKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvTWVyZ2VVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9NZXJnZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMmIxNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9NZXJnZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLm1lcmdlLmphdmEuSkNvbnRyb2xNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5tZXJnZS5qYXZhLkpNZXJnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4ubWVyZ2UuamF2YS5mYWNhZGUuRmFjYWRlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLm1lcmdlLmphdmEuZmFjYWRlLkpDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4udXRpbC5Db2RlR2VuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIE1lcmdlVXRpbHMgewotCi0gICAgcHJpdmF0ZSBNZXJnZVV0aWxzKCkgewotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSk1lcmdlciBnZXRKTWVyZ2VyKCkgewotICAgICAgICBGYWNhZGVIZWxwZXIgZmFjYWRlSGVscGVyID0gQ29kZUdlblV0aWwuaW5zdGFudGlhdGVGYWNhZGVIZWxwZXIoSk1lcmdlci5ERUZBVUxUX0ZBQ0FERV9IRUxQRVJfQ0xBU1MpOwotICAgICAgICBVUkwgbWVyZ2VGaWxlVVJMID0gRmlsZUxvY2F0b3IuZmluZChDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKSwgbmV3IFBhdGgoCi0gICAgICAgICAgICAgICAgIi9qbWVyZ2VyL21lcmdlLnhtbCIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQ29udHJvbE1vZGVsIGNvbnRyb2xNb2RlbCA9IG5ldyBKQ29udHJvbE1vZGVsKCk7Ci0gICAgICAgIGNvbnRyb2xNb2RlbC5pbml0aWFsaXplKGZhY2FkZUhlbHBlciwgbWVyZ2VGaWxlVVJMLnRvU3RyaW5nKCkpOwotICAgICAgICBKTWVyZ2VyIGptZXJnZXIgPSBuZXcgSk1lcmdlcihjb250cm9sTW9kZWwpOwotCi0gICAgICAgIHJldHVybiBqbWVyZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtZXJnZShGaWxlIHNvdXJjZUZpbGUsIEZpbGUgdGFyZ2V0RmlsZSkgewotICAgICAgICBKTWVyZ2VyIG1lcmdlciA9IGdldEpNZXJnZXIoKTsKLQotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc291cmNlSW5wdXRTdHJlYW0gPSBudWxsOwotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gdGFyZ2V0SW5wdXRTdHJlYW0gPSBudWxsOwotICAgICAgICBPdXRwdXRTdHJlYW0gdGFyZ2V0T3V0cHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHNldCBzb3VyY2UKLSAgICAgICAgICAgIHNvdXJjZUlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2VGaWxlKTsKLSAgICAgICAgICAgIEpDb21waWxhdGlvblVuaXQgaW5wdXRDb21waWxhdGlvblVuaXQgPSBtZXJnZXIKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZvcklucHV0U3RyZWFtKHNvdXJjZUlucHV0U3RyZWFtKTsKLSAgICAgICAgICAgIG1lcmdlci5zZXRTb3VyY2VDb21waWxhdGlvblVuaXQoaW5wdXRDb21waWxhdGlvblVuaXQpOwotCi0gICAgICAgICAgICAvLyBzZXQgdGFyZ2V0Ci0gICAgICAgICAgICB0YXJnZXRJbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGFyZ2V0RmlsZSk7Ci0gICAgICAgICAgICBKQ29tcGlsYXRpb25Vbml0IHRhcmdldENvbXBpbGF0aW9uVW5pdCA9IG1lcmdlcgotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlQ29tcGlsYXRpb25Vbml0Rm9ySW5wdXRTdHJlYW0odGFyZ2V0SW5wdXRTdHJlYW0pOwotICAgICAgICAgICAgbWVyZ2VyLnNldFRhcmdldENvbXBpbGF0aW9uVW5pdCh0YXJnZXRDb21waWxhdGlvblVuaXQpOwotCi0gICAgICAgICAgICAvLyBtZXJnZSBzb3VyY2UgYW5kIHRhcmdldAotICAgICAgICAgICAgbWVyZ2VyLm1lcmdlKCk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIG1lcmdlZCBjb250ZW50cwotICAgICAgICAgICAgdGFyZ2V0T3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyZ2V0RmlsZSk7Ci0gICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBtZXJnZXIuZ2V0VGFyZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0Q29udGVudHMoKS5nZXRCeXRlcygpOwotICAgICAgICAgICAgdGFyZ2V0T3V0cHV0U3RyZWFtLndyaXRlKGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coZm5mZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coaW9lKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZUlucHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc291cmNlSW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHRhcmdldElucHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHRhcmdldE91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldE91dHB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGlvZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL1NwcmluZ1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL1NwcmluZ1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlODQxZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9TcHJpbmdVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLldTRExVdGlsczsKLWltcG9ydCBvcmcuamRvbS5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmpkb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmpkb20uRWxlbWVudDsKLWltcG9ydCBvcmcuamRvbS5KRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5qZG9tLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuamRvbS5pbnB1dC5TQVhCdWlsZGVyOwotaW1wb3J0IG9yZy5qZG9tLm91dHB1dC5YTUxPdXRwdXR0ZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgZmluYWwgY2xhc3MgU3ByaW5nVXRpbHMgewotICAgIHByaXZhdGUgc3RhdGljIE5hbWVzcGFjZSBTUFJJTkdfQkVBTlNfTlMgPSBOYW1lc3BhY2UKLSAgICAgICAgICAgIC5nZXROYW1lc3BhY2UoImh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiKTsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIE5hbWVzcGFjZSBYTUxOU19YU0kgPSBOYW1lc3BhY2UuZ2V0TmFtZXNwYWNlKCJ4c2kiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKTsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIE5hbWVzcGFjZSBKQVhXU19OUyA9IE5hbWVzcGFjZS5nZXROYW1lc3BhY2UoImpheHdzIiwgImh0dHA6Ly9jeGYuYXBhY2hlLm9yZy9qYXh3cyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBwcml2YXRlIHN0YXRpYyBOYW1lc3BhY2UgU09BUF9OUyA9IE5hbWVzcGFjZS5nZXROYW1lc3BhY2UoInNvYXAiLCAiaHR0cDovL2N4Zi5hcGFjaGUub3JnL2JpbmRpbmdzL3NvYXAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgRE9DX1JPT1QgPSAiYmVhbnMiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIFNwcmluZ1V0aWxzKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0QmVhbnNGaWxlKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIElGaWxlIGJlYW5zRmlsZSA9IG51bGw7Ci0gICAgICAgIElQYXRoIHdlYkNvbnRlbnRQYXRoID0gSjJFRVV0aWxzLmdldFdlYkNvbnRlbnRQYXRoKHByb2plY3QpOwotICAgICAgICBpZiAoIXdlYkNvbnRlbnRQYXRoLmhhc1RyYWlsaW5nU2VwYXJhdG9yKCkpIHsKLSAgICAgICAgICAgIHdlYkNvbnRlbnRQYXRoID0gd2ViQ29udGVudFBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQotICAgICAgICAgICAgSVBhdGggd2ViSU5GUGF0aCA9IHdlYkNvbnRlbnRQYXRoLmFwcGVuZChuZXcgUGF0aCgiV0VCLUlORi8iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIElGb2xkZXIgd2ViSU5GRm9sZGVyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGb2xkZXIod2ViSU5GUGF0aCk7Ci0gICAgICAgICAgICBiZWFuc0ZpbGUgPSB3ZWJJTkZGb2xkZXIuZ2V0RmlsZSgiYmVhbnMueG1sIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmICghYmVhbnNGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotICAgICAgICAgICAgICAgICAgICBiZWFuc0ZpbGUuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHt9KSwgdHJ1ZSwgcHJvZ3Jlc3NNb25pdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlQmFzZUJlYW5zRmlsZShiZWFuc0ZpbGUpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmVhbnNGaWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0QmVhbnNGaWxlKFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIFNwcmluZ1V0aWxzLmdldEJlYW5zRmlsZShGaWxlVXRpbHMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBoYW5kbGUgdG8gdGhlIGN4Zi1zZXJ2bGV0IGZpbGUgaW4gdGhlIFdlYiBwcm9qZWN0cyBXRUItSU5GCi0gICAgICogZm9sZGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9qZWN0Ci0gICAgICogQHJldHVybiB7QGxpbmsgSUZpbGV9Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRmlsZSBnZXRDWEZTZXJ2bGV0KElQcm9qZWN0IHByb2plY3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIElGaWxlIGN4ZlNlcnZsZXQgPSBudWxsOwotICAgICAgICBJUGF0aCB3ZWJDb250ZW50UGF0aCA9IEoyRUVVdGlscy5nZXRXZWJDb250ZW50UGF0aChwcm9qZWN0KTsKLSAgICAgICAgaWYgKCF3ZWJDb250ZW50UGF0aC5oYXNUcmFpbGluZ1NlcGFyYXRvcigpKSB7Ci0gICAgICAgICAgICB3ZWJDb250ZW50UGF0aCA9IHdlYkNvbnRlbnRQYXRoLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIElQYXRoIHdlYklORlBhdGggPSB3ZWJDb250ZW50UGF0aC5hcHBlbmQobmV3IFBhdGgoIldFQi1JTkYvIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBJRm9sZGVyIHdlYklORkZvbGRlciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0Rm9sZGVyKHdlYklORlBhdGgpOwotICAgICAgICAgICAgY3hmU2VydmxldCA9IHdlYklORkZvbGRlci5nZXRGaWxlKCJjeGYtc2VydmxldC54bWwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaWYgKCFjeGZTZXJ2bGV0LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCi0gICAgICAgICAgICAgICAgICAgIGN4ZlNlcnZsZXQuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHt9KSwgdHJ1ZSwgcHJvZ3Jlc3NNb25pdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlQmFzZUNYRlNlcnZsZXRGaWxlKGN4ZlNlcnZsZXQpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3hmU2VydmxldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElGaWxlIGdldENYRlNlcnZsZXQoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gU3ByaW5nVXRpbHMuZ2V0Q1hGU2VydmxldChGaWxlVXRpbHMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY3JlYXRlQmFzZUNYRlNlcnZsZXRGaWxlKElGaWxlIGN4ZlNlcnZsZXQpICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBFbGVtZW50IGJlYW5zID0gbmV3IEVsZW1lbnQoRE9DX1JPT1QpOwotICAgICAgICBiZWFucy5zZXROYW1lc3BhY2UoU1BSSU5HX0JFQU5TX05TKTsKLSAgICAgICAgYmVhbnMuYWRkTmFtZXNwYWNlRGVjbGFyYXRpb24oWE1MTlNfWFNJKTsKLSAgICAgICAgYmVhbnMuYWRkTmFtZXNwYWNlRGVjbGFyYXRpb24oSkFYV1NfTlMpOwotICAgICAgICBiZWFucy5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbihTT0FQX05TKTsKLQotICAgICAgICBBdHRyaWJ1dGUgc2NoZW1hTG9jYXRpb24gPSBuZXcgQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICJzY2hlbWFMb2NhdGlvbiIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjUueHNkICIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiaHR0cDovL2N4Zi5hcGFjaGUub3JnL2JpbmRpbmdzL3NvYXAgaHR0cDovL2N4Zi5hcGFjaGUub3JnL3NjaGVtYXMvY29uZmlndXJhdGlvbi9zb2FwLnhzZCAiIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImh0dHA6Ly9jeGYuYXBhY2hlLm9yZy9qYXh3cyBodHRwOi8vY3hmLmFwYWNoZS5vcmcvc2NoZW1hcy9qYXh3cy54c2QiLCBYTUxOU19YU0kpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgYmVhbnMuc2V0QXR0cmlidXRlKHNjaGVtYUxvY2F0aW9uKTsKLQotICAgICAgICB3cml0ZUNvbmZpZyhuZXcgRG9jdW1lbnQoYmVhbnMpLCBjeGZTZXJ2bGV0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNyZWF0ZUJhc2VCZWFuc0ZpbGUoSUZpbGUgYmVhbnNGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBFbGVtZW50IGJlYW5zID0gbmV3IEVsZW1lbnQoRE9DX1JPT1QpOwotICAgICAgICBiZWFucy5zZXROYW1lc3BhY2UoU1BSSU5HX0JFQU5TX05TKTsKLSAgICAgICAgYmVhbnMuYWRkTmFtZXNwYWNlRGVjbGFyYXRpb24oWE1MTlNfWFNJKTsKLSAgICAgICAgYmVhbnMuYWRkTmFtZXNwYWNlRGVjbGFyYXRpb24oSkFYV1NfTlMpOwotCi0gICAgICAgIEF0dHJpYnV0ZSBzY2hlbWFMb2NhdGlvbiA9IG5ldyBBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgInNjaGVtYUxvY2F0aW9uIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuNS54c2QgIiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICArICJodHRwOi8vY3hmLmFwYWNoZS5vcmcvamF4d3MgaHR0cDovL2N4Zi5hcGFjaGUub3JnL3NjaGVtYXMvamF4d3MueHNkIiwgWE1MTlNfWFNJKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGJlYW5zLnNldEF0dHJpYnV0ZShzY2hlbWFMb2NhdGlvbik7Ci0KLSAgICAgICAgRWxlbWVudCBpbXBvcnRDWEZSZXNvdXJjZSA9IG5ldyBFbGVtZW50KCJpbXBvcnQiLCBTUFJJTkdfQkVBTlNfTlMpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGltcG9ydENYRlJlc291cmNlLnNldEF0dHJpYnV0ZSgicmVzb3VyY2UiLCAiY2xhc3NwYXRoOk1FVEEtSU5GL2N4Zi9jeGYueG1sIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICAgIEVsZW1lbnQgaW1wb3J0Q1hGU29hcEV4dGVuc2lvblJlc291cmNlID0gbmV3IEVsZW1lbnQoImltcG9ydCIsIFNQUklOR19CRUFOU19OUyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW1wb3J0Q1hGU29hcEV4dGVuc2lvblJlc291cmNlLnNldEF0dHJpYnV0ZSgicmVzb3VyY2UiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgImNsYXNzcGF0aDpNRVRBLUlORi9jeGYvY3hmLWV4dGVuc2lvbi1zb2FwLnhtbCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgRWxlbWVudCBpbXBvcnRDWEZTZXJ2ZWx0UmVzb3VyY2UgPSBuZXcgRWxlbWVudCgiaW1wb3J0IiwgU1BSSU5HX0JFQU5TX05TKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpbXBvcnRDWEZTZXJ2ZWx0UmVzb3VyY2Uuc2V0QXR0cmlidXRlKCJyZXNvdXJjZSIsICJjbGFzc3BhdGg6TUVUQS1JTkYvY3hmL2N4Zi1zZXJ2bGV0LnhtbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgICBiZWFucy5hZGRDb250ZW50KGltcG9ydENYRlJlc291cmNlKTsKLSAgICAgICAgYmVhbnMuYWRkQ29udGVudChpbXBvcnRDWEZTb2FwRXh0ZW5zaW9uUmVzb3VyY2UpOwotICAgICAgICBiZWFucy5hZGRDb250ZW50KGltcG9ydENYRlNlcnZlbHRSZXNvdXJjZSk7Ci0KLSAgICAgICAgd3JpdGVDb25maWcobmV3IERvY3VtZW50KGJlYW5zKSwgYmVhbnNGaWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTcHJpbmdCZWFuc0ZpbGUoSUZpbGUgc3ByaW5nQmVhbnNGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3ByaW5nQmVhbnNJbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3ByaW5nQmVhbnNGaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkpOwotICAgICAgICBpZiAoc3ByaW5nQmVhbnNJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSA+IDApIHsKLSAgICAgICAgICAgIFNBWEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTQVhCdWlsZGVyKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIuYnVpbGQoc3ByaW5nQmVhbnNJbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCByb290ID0gZG9jLmdldFJvb3RFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvb3QuZ2V0TmFtZSgpLmVxdWFscyhET0NfUk9PVCkgJiYgcm9vdC5nZXROYW1lc3BhY2UoKS5lcXVhbHMoU1BSSU5HX0JFQU5TX05TKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChKRE9NRXhjZXB0aW9uIGpkb21lKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coamRvbWUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgIHNwcmluZ0JlYW5zSW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0JlYW5EZWZpbmVkKENYRkRhdGFNb2RlbCBjeGZEYXRhTW9kZWwsIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGVsZW1lbnROYW1lLAotICAgICAgICAgICAgTmFtZXNwYWNlIG5hbWVzcGFjZSwgU3RyaW5nIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBJRmlsZSBzcHJpbmdDb25maWdGaWxlID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmIChDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpLmlzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCkpIHsKLSAgICAgICAgICAgIHNwcmluZ0NvbmZpZ0ZpbGUgPSBTcHJpbmdVdGlscy5nZXRCZWFuc0ZpbGUocHJvamVjdE5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3ByaW5nQ29uZmlnRmlsZSA9IFNwcmluZ1V0aWxzLmdldENYRlNlcnZsZXQocHJvamVjdE5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzU3ByaW5nQmVhbnNGaWxlKHNwcmluZ0NvbmZpZ0ZpbGUpKSB7Ci0gICAgICAgICAgICBTQVhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU0FYQnVpbGRlcigpOwotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIHNwcmluZ0NvbmZpZ0lucHV0U3RlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNwcmluZ0NvbmZpZ0ZpbGUuZ2V0TG9jYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAudG9GaWxlKCkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLmJ1aWxkKHNwcmluZ0NvbmZpZ0lucHV0U3RlYW0pOwotICAgICAgICAgICAgICAgIEVsZW1lbnQgYmVhbnMgPSBkb2MuZ2V0Um9vdEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgICAgIExpc3Q8RWxlbWVudD4gZW5kcG9pbnRzID0gYmVhbnMuZ2V0Q2hpbGRyZW4oZWxlbWVudE5hbWUsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgZm9yIChFbGVtZW50IGVsZW1lbnQgOiBlbmRwb2ludHMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSBpZEF0dHJpYnV0ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRBdHRyaWJ1dGUuZ2V0VmFsdWUoKS5lcXVhbHMoaWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEpET01FeGNlcHRpb24gamRvbWUpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhqZG9tZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgc3ByaW5nQ29uZmlnSW5wdXRTdGVhbS5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RW5kcG9pbnRBZGRyZXNzKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBqYXh3c0VuZHBvaW50SWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIElGaWxlIHNwcmluZ0NvbmZpZ0ZpbGUgPSBudWxsOwotICAgICAgICBpZiAoQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5pc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpKSB7Ci0gICAgICAgICAgICBzcHJpbmdDb25maWdGaWxlID0gU3ByaW5nVXRpbHMuZ2V0QmVhbnNGaWxlKHByb2plY3QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3ByaW5nQ29uZmlnRmlsZSA9IFNwcmluZ1V0aWxzLmdldENYRlNlcnZsZXQocHJvamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzU3ByaW5nQmVhbnNGaWxlKHNwcmluZ0NvbmZpZ0ZpbGUpKSB7Ci0gICAgICAgICAgICBTQVhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU0FYQnVpbGRlcigpOwotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIHNwcmluZ0NvbmZpZ0lucHV0U3RlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNwcmluZ0NvbmZpZ0ZpbGUuZ2V0TG9jYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAudG9GaWxlKCkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLmJ1aWxkKHNwcmluZ0NvbmZpZ0lucHV0U3RlYW0pOwotICAgICAgICAgICAgICAgIEVsZW1lbnQgYmVhbnMgPSBkb2MuZ2V0Um9vdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBMaXN0PEVsZW1lbnQ+IGVuZHBvaW50cyA9IGJlYW5zLmdldENoaWxkcmVuKCJlbmRwb2ludCIsIEpBWFdTX05TKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGZvciAoRWxlbWVudCBlbGVtZW50IDogZW5kcG9pbnRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgaWRBdHRyaWJ1dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXR0cmlidXRlLmdldFZhbHVlKCkuZXF1YWxzKGpheHdzRW5kcG9pbnRJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiYWRkcmVzcyIpLmdldFZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSkRPTUV4Y2VwdGlvbiBqZG9tZSkgewotICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGpkb21lKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgc3ByaW5nQ29uZmlnSW5wdXRTdGVhbS5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVDb25maWd1cmF0aW9uRnJvbVdTREwoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gbW9kZWwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IG1vZGVsLmdldEluY2x1ZGVkTmFtZXNwYWNlcygpLmdldCh0YXJnZXROYW1lc3BhY2UpOwotCi0gICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG1vZGVsLmdldFdzZGxEZWZpbml0aW9uKCk7Ci0gICAgICAgIE1hcCBzZXJ2aWNlc01hcCA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLSAgICAgICAgU2V0PE1hcC5FbnRyeT4gc2VydmljZXNTZXQgPSBzZXJ2aWNlc01hcC5lbnRyeVNldCgpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeSBzZXJ2aWNlRW50cnkgOiBzZXJ2aWNlc1NldCkgewotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIHNlcnZpY2VFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgbW9kZWwuc2V0U2VydmljZU5hbWUoc2VydmljZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgIE1hcCBwb3J0c01hcCA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLSAgICAgICAgICAgIFNldDxNYXAuRW50cnk+IHBvcnRzU2V0ID0gcG9ydHNNYXAuZW50cnlTZXQoKTsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5IHBvcnRFbnRyeSA6IHBvcnRzU2V0KSB7Ci0gICAgICAgICAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIHBvcnRFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIG1vZGVsLnNldEVuZHBvaW50TmFtZShwb3J0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBwb3J0LmdldEJpbmRpbmcoKS5nZXRQb3J0VHlwZSgpOwotICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gcG9ydFR5cGUuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydFR5cGVOYW1lID0gcU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lID0gcGFja2FnZU5hbWUgKyAiLiIgKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgCWNvbnZlcnRQb3J0VHlwZU5hbWUocG9ydFR5cGVOYW1lKSArICJJbXBsIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG1vZGVsLnNldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZShmdWxseVF1YWxpZmllZENsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgU3ByaW5nVXRpbHMuY3JlYXRlSkFYV1NFbmRwb2ludChtb2RlbCk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkU3ByaW5nQ29uZmlnSW5mb3JtYXRpb25Gcm9tV1NETChDWEZEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgSUZpbGUgd3NkbEZpbGUgPSBXU0RMVXRpbHMuZ2V0V1NETEZvbGRlcihtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKS5nZXRGaWxlKG1vZGVsLmdldFdzZGxGaWxlTmFtZSgpKTsKLSAgICAgICAgaWYgKHdzZGxGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldFdzZGxVUkwod3NkbEZpbGUuZ2V0TG9jYXRpb25VUkkoKS50b1VSTCgpKTsKLSAgICAgICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBXU0RMVXRpbHMucmVhZFdTREwobW9kZWwuZ2V0V3NkbFVSTCgpKTsKLSAgICAgICAgICAgICAgICBNYXAgc2VydmljZXNNYXAgPSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICAgICAgU2V0PE1hcC5FbnRyeT4gc2VydmljZXNTZXQgPSBzZXJ2aWNlc01hcC5lbnRyeVNldCgpOwotICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5IHNlcnZpY2VFbnRyeSA6IHNlcnZpY2VzU2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBzZXJ2aWNlRW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0U2VydmljZU5hbWUoc2VydmljZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgTWFwIHBvcnRzTWFwID0gc2VydmljZS5nZXRQb3J0cygpOwotICAgICAgICAgICAgICAgICAgICBTZXQ8TWFwLkVudHJ5PiBwb3J0c1NldCA9IHBvcnRzTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5IHBvcnRFbnRyeSA6IHBvcnRzU2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgcG9ydEVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRFbmRwb2ludE5hbWUocG9ydC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRXc2RsRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkgewotICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2cobXVybGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coaW9lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0UG9ydFR5cGVOYW1lKFN0cmluZyBwb3J0VHlwZU5hbWUpIHsKLSAgICAgICAgU3RyaW5nW10gc2VnbWVudHMgPSBwb3J0VHlwZU5hbWUuc3BsaXQoIltcXC1cXC5cXDpcXF9cXHUwMGI3XFx1MDM4N1xcdTA2ZGRcXHUwNmRlXSIpOwotCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgc3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIHNlZ21lbnQgOiBzZWdtZW50cykgewotICAgICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hhciBmaXJzdENoYXJhY3RlciA9IHNlZ21lbnQuY2hhckF0KDApOwotICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNEaWdpdChmaXJzdENoYXJhY3RlcikgJiYgQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGZpcnN0Q2hhcmFjdGVyKSkgewotICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBzZWdtZW50LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgc2VnbWVudC5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2VnbWVudC5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBjdXJyZW50Q2hhciA9IHNlZ21lbnQuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgIGNoYXIgcHJlY2VkaW5nQ2hhciA9IHNlZ21lbnQuY2hhckF0KGkgLSAxKTsKLSAgICAgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGN1cnJlbnRDaGFyKSAmJiBDaGFyYWN0ZXIuaXNEaWdpdChwcmVjZWRpbmdDaGFyKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGN1cnJlbnRDaGFyKSkgewotICAgICAgICAgICAgICAgICAgICBzZWdtZW50ID0gc2VnbWVudC5zdWJzdHJpbmcoMCwgaSkgKyBzZWdtZW50LnN1YnN0cmluZyhpLCBpICsgMSkudG9VcHBlckNhc2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VnbWVudC5zdWJzdHJpbmcoaSArIDEsIHNlZ21lbnQubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKHNlZ21lbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUpBWFdTRW5kcG9pbnQoQ1hGRGF0YU1vZGVsIG1vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRQcm9qZWN0TmFtZSgpOwotCi0gICAgICAgIElGaWxlIHNwcmluZ0NvbmZpZ0ZpbGUgPSBudWxsOwotICAgICAgICBpZiAoQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5pc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpKSB7Ci0gICAgICAgICAgICBzcHJpbmdDb25maWdGaWxlID0gU3ByaW5nVXRpbHMuZ2V0QmVhbnNGaWxlKHByb2plY3ROYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNwcmluZ0NvbmZpZ0ZpbGUgPSBTcHJpbmdVdGlscy5nZXRDWEZTZXJ2bGV0KHByb2plY3ROYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1NwcmluZ0JlYW5zRmlsZShzcHJpbmdDb25maWdGaWxlKSkgewotICAgICAgICAgICAgU0FYQnVpbGRlciBidWlsZGVyID0gbmV3IFNBWEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBzcHJpbmdDb25maWdJbnB1dFN0ZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcHJpbmdDb25maWdGaWxlLmdldExvY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgLnRvRmlsZSgpKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gYnVpbGRlci5idWlsZChzcHJpbmdDb25maWdJbnB1dFN0ZWFtKTsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGJlYW5zID0gZG9jLmdldFJvb3RFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGpheHdzRW5kcG9pbnQgPSBuZXcgRWxlbWVudCgiZW5kcG9pbnQiLCBKQVhXU19OUyk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IGdldEpBWFdTRW5kcG9pbnRJRChtb2RlbCk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0Q29uZmlnSWQoaWQpOwotICAgICAgICAgICAgICAgIGpheHdzRW5kcG9pbnQuc2V0QXR0cmlidXRlKCJpZCIsIGlkKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAgICAgamF4d3NFbmRwb2ludC5zZXRBdHRyaWJ1dGUoImltcGxlbWVudG9yIiwgbW9kZWwuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgICAgICBpZiAobW9kZWwuZ2V0Q29uZmlnV3NkbExvY2F0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBqYXh3c0VuZHBvaW50LnNldEF0dHJpYnV0ZSgid3NkbExvY2F0aW9uIiwgbW9kZWwuZ2V0Q29uZmlnV3NkbExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuZ2V0RW5kcG9pbnROYW1lKCkgIT0gbnVsbCAmJiBtb2RlbC5nZXRTZXJ2aWNlTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGpheHdzRW5kcG9pbnQuc2V0QXR0cmlidXRlKCJlbmRwb2ludE5hbWUiLCAidG5zOiIgKyBtb2RlbC5nZXRFbmRwb2ludE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgICAgICAgICAgamF4d3NFbmRwb2ludC5zZXRBdHRyaWJ1dGUoInNlcnZpY2VOYW1lIiwgInRuczoiICsgbW9kZWwuZ2V0U2VydmljZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBYTUxOU19UTlMgPSBOYW1lc3BhY2UuZ2V0TmFtZXNwYWNlKCJ0bnMiLCBtb2RlbC5nZXRUYXJnZXROYW1lc3BhY2UoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIGpheHdzRW5kcG9pbnQuYWRkTmFtZXNwYWNlRGVjbGFyYXRpb24oWE1MTlNfVE5TKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobW9kZWwuZ2V0RW5kcG9pbnROYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBqYXh3c0VuZHBvaW50LnNldEF0dHJpYnV0ZSgiYWRkcmVzcyIsICIvIiArIG1vZGVsLmdldEVuZHBvaW50TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgamF4d3NFbmRwb2ludC5zZXRBdHRyaWJ1dGUoImFkZHJlc3MiLCAiLyIgKyBpZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIEVsZW1lbnQgamF4d3NGZWF0dXJlcyA9IG5ldyBFbGVtZW50KCJmZWF0dXJlcyIsIEpBWFdTX05TKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIEVsZW1lbnQgYmVhbiA9IG5ldyBFbGVtZW50KCJiZWFuIiwgU1BSSU5HX0JFQU5TX05TKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGJlYW4uc2V0QXR0cmlidXRlKCJjbGFzcyIsICJvcmcuYXBhY2hlLmN4Zi5mZWF0dXJlLkxvZ2dpbmdGZWF0dXJlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgIGpheHdzRmVhdHVyZXMuYWRkQ29udGVudChiZWFuKTsKLSAgICAgICAgICAgICAgICBqYXh3c0VuZHBvaW50LmFkZENvbnRlbnQoamF4d3NGZWF0dXJlcyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWlzQmVhbkRlZmluZWQobW9kZWwsIHByb2plY3ROYW1lLCAiZW5kcG9pbnQiLCBKQVhXU19OUywgaWQpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgYmVhbnMuYWRkQ29udGVudChqYXh3c0VuZHBvaW50KTsKLQotICAgICAgICAgICAgICAgICAgICB3cml0ZUNvbmZpZyhkb2MsIHNwcmluZ0NvbmZpZ0ZpbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEpET01FeGNlcHRpb24gamRvbWUpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhqZG9tZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHNwcmluZ0NvbmZpZ0lucHV0U3RlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRKQVhXU0VuZHBvaW50SUQoQ1hGRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIFN0cmluZyBpbXBsZW1lbnRvciA9IG1vZGVsLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpOwotICAgICAgICBpZiAoaW1wbGVtZW50b3IuaW5kZXhPZigiLiIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGltcGxlbWVudG9yID0gaW1wbGVtZW50b3Iuc3Vic3RyaW5nKGltcGxlbWVudG9yLmxhc3RJbmRleE9mKCIuIikgKyAxLCBpbXBsZW1lbnRvci5sZW5ndGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpbXBsZW1lbnRvci5zdGFydHNXaXRoKCJJbXBsIikgJiYgaW1wbGVtZW50b3IuaW5kZXhPZigiSW1wbCIpICE9IC0xKSB7Ci0gICAgICAgICAgICBpbXBsZW1lbnRvciA9IGltcGxlbWVudG9yLnN1YnN0cmluZygwLCBpbXBsZW1lbnRvci5pbmRleE9mKCJJbXBsIikpLnRvTG93ZXJDYXNlKCk7IC8vJE5PTi1OTFMtMSQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbXBsZW1lbnRvciA9IGltcGxlbWVudG9yLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGltcGxlbWVudG9yOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlQ29uZmlnKERvY3VtZW50IGRvY3VtZW50LCBJRmlsZSBzcHJpbmdDb25maWdGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oc3ByaW5nQ29uZmlnRmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFhNTE91dHB1dHRlciBvdXRwdXR0ZXIgPSBuZXcgWE1MT3V0cHV0dGVyKCk7Ci0gICAgICAgICAgICBvdXRwdXR0ZXIub3V0cHV0KGRvY3VtZW50LCBvdXRwdXRTdHJlYW0pOwotICAgICAgICAgICAgc3ByaW5nQ29uZmlnRmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuZm9ybWF0WE1MRmlsZShzcHJpbmdDb25maWdGaWxlKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmNsb3NlKCk7IAotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvZmFjZXQvQ1hGRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2ZhY2V0L0NYRkZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MTczNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvZmFjZXQvQ1hGRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmZhY2V0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmUudXRpbC5BcHRDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFjY2Vzc1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Db250ZXh0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFlZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2Vzc2lvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIEFkZHMgdGhlIENYRiBjbGFzc3BhdGggY29udGFpbmVyIHRvIHRoZSBwcm9qZWN0LgotICogPHA+Ci0gKiBBbHNvIHNldHMgdXAgdGhlIHdlYiBwcm9qZWN0cyBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKHdlYi54bWwgZmlsZSkKLSAqIHRvIHVzZSBjeGYtc2VydmxldCBvciB0aGUgU3ByaW5nIEFwcGxpY2F0aW9uIGNvbnRleHQgKFdFQi1JTkYvYmVhbnMueG1sKSBmb3IgCi0gKiBlbmRwb2ludCBjb25maWd1cmF0aW9uLiBEZXBlbmRzIG9uIGEgc2V0dGluZyBpbiB0aGUgQ1hGIHByZWZlcmVuY2VzLiAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1hGRmFjZXRJbnN0YWxsRGVsZWdhdGUgaW1wbGVtZW50cyBJRGVsZWdhdGUgewotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgT2JqZWN0IGNvbmZpZywKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpLmdldEN4ZlJ1bnRpbWVMb2NhdGlvbigpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhTdGF0dXMuRVJST1IsIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICBDWEZDb3JlTWVzc2FnZXMuQ1hGX0ZBQ0VUX0lOU1RBTExfREVMRUdBVEVfUlVOVElNRV9MT0NBVElPTl9OT1RfU0VUKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBJUGF0aCBjeGZMaWJQYXRoID0gbmV3IFBhdGgoQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5nZXRDeGZSdW50aW1lTG9jYXRpb24oKSk7Ci0gICAgICAgIGlmICghY3hmTGliUGF0aC5oYXNUcmFpbGluZ1NlcGFyYXRvcigpKSB7Ci0gICAgICAgICAgICBjeGZMaWJQYXRoID0gY3hmTGliUGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIGN4ZkxpYlBhdGggPSBjeGZMaWJQYXRoLmFwcGVuZCgibGliIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBJQ2xhc3NwYXRoQXR0cmlidXRlIGpzdENvbXBvbmVudERlcGVuZGVuY3kgPSAKLSAgICAgICAgICAgIEphdmFDb3JlLm5ld0NsYXNzcGF0aEF0dHJpYnV0ZSgib3JnLmVjbGlwc2UuanN0LmNvbXBvbmVudC5kZXBlbmRlbmN5IiwgIi9XRUItSU5GL2xpYiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIElDbGFzc3BhdGhFbnRyeSBjeGZDbGFzc3BhdGhDb250YWluZXIgPSAKLSAgICAgICAgICAgIEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KG5ldyBQYXRoKCJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUuQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIiKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbmV3IElBY2Nlc3NSdWxlWzBdLAotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5pc0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpIAotICAgICAgICAgICAgPyBuZXcgSUNsYXNzcGF0aEF0dHJpYnV0ZVtde2pzdENvbXBvbmVudERlcGVuZGVuY3l9IDogbmV3IElDbGFzc3BhdGhBdHRyaWJ1dGVbXXt9LAotICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBKRFRVdGlscy5hZGRUb0NsYXNzcGF0aChKYXZhQ29yZS5jcmVhdGUocHJvamVjdCksIGN4ZkNsYXNzcGF0aENvbnRhaW5lcik7Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQgQ1hGIFNlcnZsZXQsIFNlcnZsZXQgTWFwcGluZyBhbmQgU2Vzc2lvbiBDb25maWcgdG8gd2ViLnhtbAotICAgICAgICBmaW5hbCBJTW9kZWxQcm92aWRlciBwcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIocHJvamVjdCk7Ci0gICAgICAgIHByb3ZpZGVyLm1vZGlmeShuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG1vZGVsUHJvdmlkZXIgPSBwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlU3ByaW5nQXBwQ29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5pc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgICAgIC8vIGpzdC53ZWIgMi41Ci0gICAgICAgICAgICAgICAgaWYgKG1vZGVsUHJvdmlkZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIHsKLSAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIGphdmFlZVdlYkFwcCA9IAotICAgICAgICAgICAgICAgICAgICAgICAgKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgbW9kZWxQcm92aWRlcjsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ1hGSlNUV0VCMjVTZXJ2bGV0KHByb2plY3QsIGphdmFlZVdlYkFwcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1c2VTcHJpbmdBcHBDb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHRXZWIyNShwcm9qZWN0LCBqYXZhZWVXZWJBcHApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGpzdC53ZWIgMi40Ci0gICAgICAgICAgICAgICAgaWYgKG1vZGVsUHJvdmlkZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHApIHsKLSAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwIHdlYkFwcCA9IAotICAgICAgICAgICAgICAgICAgICAgICAgKG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCkgbW9kZWxQcm92aWRlcjsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ1hGSlNUV0VCMjRTZXJ2bGV0KHByb2plY3QsIHdlYkFwcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1c2VTcHJpbmdBcHBDb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHRXZWIyNChwcm9qZWN0LCB3ZWJBcHApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9LCBudWxsKTsKLQotICAgICAgICBpZiAoQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5pc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBBcHRDb25maWcuc2V0RW5hYmxlZChKYXZhQ29yZS5jcmVhdGUocHJvamVjdCksIHRydWUpOyAgICAKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgdm9pZCBhZGRTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHRXZWIyNChJUHJvamVjdCB3ZWJQcm9qZWN0LAotICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwIHdlYmFwcCkgewotICAgICAgICBMaXN0IGNvbnRleHRQYXJhbXMgPSB3ZWJhcHAuZ2V0Q29udGV4dFBhcmFtcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHRQYXJhbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIENvbnRleHRQYXJhbSBjb250ZXh0UGFyYW0gPSAoQ29udGV4dFBhcmFtKSBjb250ZXh0UGFyYW1zLmdldChpKTsKLSAgICAgICAgICAgIGlmIChjb250ZXh0UGFyYW0uZ2V0UGFyYW1OYW1lKCkuZXF1YWxzKCJjb250ZXh0Q29uZmlnTG9jYXRpb24iKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlCi0gICAgICAgIExpc3QgbGlzdGVuZXJzID0gd2ViYXBwLmdldExpc3RlbmVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgTGlzdGVuZXIgY29udGV4dExvYWRlckxpc3RlbmVyID0gKExpc3RlbmVyKSBsaXN0ZW5lcnMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGNvbnRleHRMb2FkZXJMaXN0ZW5lci5nZXRMaXN0ZW5lckNsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgIm9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQuQ29udGV4dExvYWRlckxpc3RlbmVyIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENvbW1vbkZhY3RvcnkgY29tbW9uRmFjdG9yeSA9IENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFOwotICAgICAgICBKYXZhUmVmRmFjdG9yeSBqYXZhUmVmRmFjdG9yeSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRTsKLQotICAgICAgICBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZSBjb25maWdMb2NhdGlvblBhcmFtID0gY29tbW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlKCk7Ci0gICAgICAgIGNvbmZpZ0xvY2F0aW9uUGFyYW0uc2V0TmFtZSgiY29udGV4dENvbmZpZ0xvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY29uZmlnTG9jYXRpb25QYXJhbS5zZXRWYWx1ZSgiV0VCLUlORi9iZWFucy54bWwiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHdlYmFwcC5nZXRDb250ZXh0UGFyYW1zKCkuYWRkKGNvbmZpZ0xvY2F0aW9uUGFyYW0pOwotCi0gICAgICAgIExpc3RlbmVyIGNvbnRleHRMb2FkZXJMaXN0ZW5lciA9IGNvbW1vbkZhY3RvcnkuY3JlYXRlTGlzdGVuZXIoKTsKLSAgICAgICAgSmF2YUNsYXNzIGphdmFDbGFzcyA9IGphdmFSZWZGYWN0b3J5LmNyZWF0ZUphdmFDbGFzcygpOwotICAgICAgICBqYXZhQ2xhc3Muc2V0TmFtZSgib3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5Db250ZXh0TG9hZGVyTGlzdGVuZXIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjb250ZXh0TG9hZGVyTGlzdGVuZXIuc2V0TGlzdGVuZXJDbGFzcyhqYXZhQ2xhc3MpOwotCi0gICAgICAgIHdlYmFwcC5nZXRMaXN0ZW5lcnMoKS5hZGQoY29udGV4dExvYWRlckxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIHZvaWQgYWRkU3ByaW5nQXBwbGljYXRpb25Db250ZXh0V2ViMjUoSVByb2plY3Qgd2ViUHJvamVjdCwKLSAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCB3ZWJhcHApIHsKLSAgICAgICAgTGlzdCBjb250ZXh0UGFyYW1zID0gd2ViYXBwLmdldENvbnRleHRQYXJhbXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0UGFyYW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQYXJhbVZhbHVlIGNvbnRleHRQYXJhbSA9IChQYXJhbVZhbHVlKSBjb250ZXh0UGFyYW1zLmdldChpKTsKLSAgICAgICAgICAgIGlmIChjb250ZXh0UGFyYW0uZ2V0UGFyYW1OYW1lKCkuZXF1YWxzKCJjb250ZXh0Q29uZmlnTG9jYXRpb24iKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBsaXN0ZW5lcnMgPSB3ZWJhcHAuZ2V0TGlzdGVuZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXIgY29udGV4dExvYWRlckxpc3RlbmVyID0gCi0gICAgICAgICAgICAgICAgKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lcikgbGlzdGVuZXJzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChjb250ZXh0TG9hZGVyTGlzdGVuZXIuZ2V0TGlzdGVuZXJDbGFzcygpLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgIm9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQuQ29udGV4dExvYWRlckxpc3RlbmVyIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEphdmFlZUZhY3RvcnkgamF2YWVlRmFjdG9yeSA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFOwotCi0gICAgICAgIFBhcmFtVmFsdWUgY29uZmlnTG9jYXRpb25QYXJhbSA9IGphdmFlZUZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZSgpOwotICAgICAgICBjb25maWdMb2NhdGlvblBhcmFtLnNldFBhcmFtTmFtZSgiY29udGV4dENvbmZpZ0xvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY29uZmlnTG9jYXRpb25QYXJhbS5zZXRQYXJhbVZhbHVlKCJXRUItSU5GL2JlYW5zLnhtbCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgd2ViYXBwLmdldENvbnRleHRQYXJhbXMoKS5hZGQoY29uZmlnTG9jYXRpb25QYXJhbSk7Ci0KLSAgICAgICAgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyIGNvbnRleHRMb2FkZXJMaXN0ZW5lciA9IGphdmFlZUZhY3RvcnkuY3JlYXRlTGlzdGVuZXIoKTsKLSAgICAgICAgY29udGV4dExvYWRlckxpc3RlbmVyLnNldExpc3RlbmVyQ2xhc3MoIm9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQuQ29udGV4dExvYWRlckxpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICB3ZWJhcHAuZ2V0TGlzdGVuZXJzKCkuYWRkKGNvbnRleHRMb2FkZXJMaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSB2b2lkIGFkZENYRkpTVFdFQjI0U2VydmxldChJUHJvamVjdCB3ZWJQcm9qZWN0LCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAgd2ViYXBwKSB7Ci0gICAgICAgIExpc3Qgc2VydmxldHMgPSB3ZWJhcHAuZ2V0U2VydmxldHMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2bGV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAJb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldCBzZXJ2bGV0ID0gKG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQpIHNlcnZsZXRzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChzZXJ2bGV0LmdldFNlcnZsZXROYW1lKCkuZXF1YWxzKCJjeGYiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IGZhY3RvcnkgPSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFOwotCi0gICAgICAgIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQgY3hmU2VydmxldCA9IGZhY3RvcnkuY3JlYXRlU2VydmxldCgpOwotICAgICAgICBTZXJ2bGV0VHlwZSBzZXJ2bGV0VHlwZSA9IGZhY3RvcnkuY3JlYXRlU2VydmxldFR5cGUoKTsKLSAgICAgICAgY3hmU2VydmxldC5zZXRXZWJUeXBlKHNlcnZsZXRUeXBlKTsKLSAgICAgICAgY3hmU2VydmxldC5zZXRTZXJ2bGV0TmFtZSgiY3hmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2VydmxldFR5cGUuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmN4Zi50cmFuc3BvcnQuc2VydmxldC5DWEZTZXJ2bGV0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY3hmU2VydmxldC5zZXREaXNwbGF5TmFtZSgiY3hmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY3hmU2VydmxldC5zZXRMb2FkT25TdGFydHVwKEludGVnZXIudmFsdWVPZigxKSk7Ci0KLSAgICAgICAgd2ViYXBwLmdldFNlcnZsZXRzKCkuYWRkKGN4ZlNlcnZsZXQpOwotCi0gICAgICAgIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nIHNlcnZsZXRNYXBwaW5nID0gZmFjdG9yeS5jcmVhdGVTZXJ2bGV0TWFwcGluZygpOwotICAgICAgICBzZXJ2bGV0TWFwcGluZy5zZXRTZXJ2bGV0KGN4ZlNlcnZsZXQpOwotICAgICAgICBzZXJ2bGV0TWFwcGluZy5zZXRVcmxQYXR0ZXJuKCIvc2VydmljZXMvKiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHdlYmFwcC5nZXRTZXJ2bGV0TWFwcGluZ3MoKS5hZGQoc2VydmxldE1hcHBpbmcpOwotCi0gICAgICAgIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlc3Npb25Db25maWcgc2Vzc2lvbkNvbmZpZyA9IGZhY3RvcnkuY3JlYXRlU2Vzc2lvbkNvbmZpZygpOwotICAgICAgICBzZXNzaW9uQ29uZmlnLnNldFNlc3Npb25UaW1lb3V0KDYwKTsKLSAgICAgICAgd2ViYXBwLnNldFNlc3Npb25Db25maWcoc2Vzc2lvbkNvbmZpZyk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSB2b2lkIGFkZENYRkpTVFdFQjI1U2VydmxldChJUHJvamVjdCB3ZWJQcm9qZWN0LCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgd2ViYXBwKSB7Ci0gICAgICAgIExpc3Qgc2VydmxldHMgPSB3ZWJhcHAuZ2V0U2VydmxldHMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2bGV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgU2VydmxldCBzZXJ2bGV0ID0gKFNlcnZsZXQpIHNlcnZsZXRzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChzZXJ2bGV0LmdldFNlcnZsZXROYW1lKCkuZXF1YWxzKCJjeGYiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ1hGIFNlcnZsZXQKLSAgICAgICAgV2ViRmFjdG9yeSBmYWN0b3J5ID0gV2ViRmFjdG9yeS5lSU5TVEFOQ0U7Ci0gICAgICAgIFNlcnZsZXQgY3hmU2VydmxldCA9IGZhY3RvcnkuY3JlYXRlU2VydmxldCgpOwotCi0gICAgICAgIGN4ZlNlcnZsZXQuc2V0U2VydmxldE5hbWUoImN4ZiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgRGlzcGxheU5hbWUgY3hmU2VydmxldERpc3BsYXlOYW1lID0gSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzcGxheU5hbWUoKTsKLSAgICAgICAgY3hmU2VydmxldERpc3BsYXlOYW1lLnNldFZhbHVlKCJjeGYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjeGZTZXJ2bGV0LmdldERpc3BsYXlOYW1lcygpLmFkZChjeGZTZXJ2bGV0RGlzcGxheU5hbWUpOwotCi0gICAgICAgIERlc2NyaXB0aW9uIGN4ZlNlcnZsZXREZXNjcmlwdGlvbiA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGN4ZlNlcnZsZXREZXNjcmlwdGlvbi5zZXRWYWx1ZSgiQXBhY2hlIENYRiBFbmRwb2ludCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGN4ZlNlcnZsZXQuZ2V0RGVzY3JpcHRpb25zKCkuYWRkKGN4ZlNlcnZsZXREZXNjcmlwdGlvbik7Ci0KLSAgICAgICAgY3hmU2VydmxldC5zZXRTZXJ2bGV0Q2xhc3MoIm9yZy5hcGFjaGUuY3hmLnRyYW5zcG9ydC5zZXJ2bGV0LkNYRlNlcnZsZXQiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGN4ZlNlcnZsZXQuc2V0TG9hZE9uU3RhcnR1cChJbnRlZ2VyLnZhbHVlT2YoMSkpOwotCi0gICAgICAgIHdlYmFwcC5nZXRTZXJ2bGV0cygpLmFkZChjeGZTZXJ2bGV0KTsKLQotICAgICAgICBTZXJ2bGV0TWFwcGluZyBjeGZTZXJ2bGV0TWFwcGluZyA9IGZhY3RvcnkuY3JlYXRlU2VydmxldE1hcHBpbmcoKTsKLSAgICAgICAgY3hmU2VydmxldE1hcHBpbmcuc2V0U2VydmxldE5hbWUoImN4ZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFVybFBhdHRlcm5UeXBlIHVybCA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVybFBhdHRlcm5UeXBlKCk7Ci0gICAgICAgIHVybC5zZXRWYWx1ZSgiL3NlcnZpY2VzLyoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjeGZTZXJ2bGV0TWFwcGluZy5nZXRVcmxQYXR0ZXJucygpLmFkZCh1cmwpOwotICAgICAgICB3ZWJhcHAuZ2V0U2VydmxldE1hcHBpbmdzKCkuYWRkKGN4ZlNlcnZsZXRNYXBwaW5nKTsKLQotICAgICAgICBTZXNzaW9uQ29uZmlnIHNlc3Npb25Db25maWcgPSBmYWN0b3J5LmNyZWF0ZVNlc3Npb25Db25maWcoKTsKLSAgICAgICAgc2Vzc2lvbkNvbmZpZy5zZXRTZXNzaW9uVGltZW91dChuZXcgQmlnSW50ZWdlcigiNjAiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgd2ViYXBwLmdldFNlc3Npb25Db25maWdzKCkuYWRkKHNlc3Npb25Db25maWcpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2ZhY2V0L0NYRkZhY2V0VW5pbnN0YWxsRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2ZhY2V0L0NYRkZhY2V0VW5pbnN0YWxsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkNDA5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9mYWNldC9DWEZGYWNldFVuaW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgQ1hGRmFjZXRVbmluc3RhbGxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBPYmplY3QgY29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gIAotICAgICAgICAvL1RPRE8gSW1wbGVtZW50Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyMWQwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmRkMWUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0ZThlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNGcmkgTm92IDA3IDIzOjU4OjU0IEVTVCAyMDA4Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMzEwZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlCi1CdW5kbGUtVmVyc2lvbjogMC40LjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpIgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjAuMzA0LDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZTtidW5kbGUtdmVyc2lvbj0iMC40LjMiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gamF2YXgud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuNi4yLDEuNy4wKSIsCi0gb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3Jpbmc7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuMTAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTtidW5kbGUtdmVyc2lvbj0iMC41LjAiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlO2J1bmRsZS12ZXJzaW9uPSIwLjUuMCIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW07YnVuZGxlLXZlcnNpb249IlsyLjAuMCwyLjEuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS43LjAKLUNyZWF0ZWQtQnk6IDEuNS4wXzE0LWIwMyAoU3VuIE1pY3Jvc3lzdGVtcyBJbmMuKQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxNjliZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPlNlcHRlbWJlciAxMiwgMjAwODwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjZhNzM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkOGM4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUNYRiBXZWIgU2VydmljZXMgQ3JlYXRpb24gQ29yZSAoSW5jdWJhdGlvbikKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL0NYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL0NYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOGM5NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9DWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5DWEZDcmVhdGlvbkNvcmVNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUFJPSkVDVF9TRUxFQ1RJT05fRVJST1I7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1ZBTElEX1BPUlRUWVBFX01FU1NBR0U7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRVJWSUNFX0lNUExfTk9UX0ZPVU5EOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VSVklDRV9JTVBMX05PVF9CSU5BUlk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICAvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotICAgICAgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcygpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL0NYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL0NYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YWMxMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9DWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczogCi0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1XU0RMMkpBVkFfUFJPSkVDVF9TRUxFQ1RJT05fRVJST1I9QSBwb3NzaWJsZSBjb25mbGljdCBoYXMgYmVlbiBkZXRlY3RlZCBiZXR3ZWVuIHByb2plY3Qgc2VsZWN0aW9ucy5cblxuIFRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gd2lsbCByZXN1bHQgaW4gY29kZSBiZWluZyBnZW5lcmF0ZWQgaW50byB0aGUgInswfSIgcHJvamVjdC5cblxuVG8gY2hhbmdlIHRoZSBjb25maWd1cmF0aW9uIGNsaWNrIENhbmNlbCBhbmQgdGhlbiBzZWxlY3QgdGhlICJTZXJ2aWNlIHByb2plY3Q6IiBsaW5rIGluIHRoZSAiQ29uZmlndXJhdGlvbjoiIHNlY3Rpb24gaW4gdGhlIFdlYiBTZXJ2aWNlIHdpemFyZC5cblxuQ2xpY2sgT2sgdG8gY29udGludWUgd2l0aCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotCi1XU0RMMkpBVkFfVkFMSURfUE9SVFRZUEVfTUVTU0FHRT1UaGUgV1NETCBkb2N1bWVudCBtdXN0IGhhdmUgYSB2YWxpZCBwb3J0VHlwZSBlbGVtZW50Ci0KLUpBVkEyV1NfU0VSVklDRV9JTVBMX05PVF9GT1VORD1UaGUgU2VydmljZSBJbXBsZW1lbnRhdGlvbiAiezB9IiBjYW5ub3QgYmUgbG9hZGVkIGZyb20gdGhlICJ7MX0iIHByb2plY3QuIFBsZWFzZSBjaGVjayB0aGF0IHRoZSBwcm9qZWN0IGNvbnRhaW5zIHRoZSBjbGFzcyBhbmQgdGhhdCBpdCBpcyB2aXNpYmxlIG9uIHRoZSBwcm9qZWN0cyAiSmF2YSBCdWlsZCBQYXRoIi4KLUpBVkEyV1NfU0VSVklDRV9JTVBMX05PVF9CSU5BUlk9QmluYXJ5IGNsYXNzIGZpbGVzIG5vdCBzdXBwb3J0ZWQuIFRoZSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIG11c3QgYmUgYSBKYXZhIFNvdXJjZSB0eXBlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL0NYRkNyZWF0aW9uQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzM5ZTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDWEZDcmVhdGlvbkNvcmVQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotICAgIC8vIFRoZSBwbHVnLWluIElECi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICBwcml2YXRlIHN0YXRpYyBDWEZDcmVhdGlvbkNvcmVQbHVnaW4gcGx1Z2luOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIENYRkNyZWF0aW9uQ29yZVBsdWdpbigpIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICBwbHVnaW4gPSB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBsdWdpbiA9IG51bGw7Ci0gICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDWEZDcmVhdGlvbkNvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLSAgICAgICAgcmV0dXJuIHBsdWdpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELCAKLSAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvQ1hGRGVwbG95Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9DWEZEZXBsb3lDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OTE4MTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9DWEZEZXBsb3lDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAxMi5TT0FQMTJBZGRyZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuU3ByaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5XU0RMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlSW5mbzsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBDWEZEZXBsb3lDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDWEZfU0VSVkxFVCA9ICJvcmcuYXBhY2hlLmN4Zi50cmFuc3BvcnQuc2VydmxldC5DWEZTZXJ2bGV0IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLSAgICBwcml2YXRlIElXZWJTZXJ2aWNlIHdlYlNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBDWEZEYXRhTW9kZWwgbW9kZWw7Ci0gICAgCi0gICAgcHVibGljIENYRkRlcGxveUNvbW1hbmQoU3RyaW5nIHByb2plY3ROYW1lLCBJV2ViU2VydmljZSB3ZWJTZXJ2aWNlKSB7Ci0gICAgICAgIHRoaXMucHJvamVjdCA9IEZpbGVVdGlscy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgdGhpcy53ZWJTZXJ2aWNlID0gd2ViU2VydmljZTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBXZWJTZXJ2aWNlSW5mbyB3ZWJTZXJ2aWNlSW5mbyA9IHdlYlNlcnZpY2UuZ2V0V2ViU2VydmljZUluZm8oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIHNlcnZlckluc3RhbmNlSWQgPSB3ZWJTZXJ2aWNlSW5mby5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc2VydmVyRmFjdG9yeUlkID0gd2ViU2VydmljZUluZm8uZ2V0U2VydmVyRmFjdG9yeUlkKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmVySW5zdGFuY2VJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoc2VydmVySW5zdGFuY2VJZCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHdlYkNvYkNvbXBvbmVudFVSTCA9IFNlcnZlclV0aWxzLmdldEVuY29kZWRXZWJDb21wb25lbnRVUkwocHJvamVjdCwgc2VydmVyRmFjdG9yeUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJsUGF0dGVybiA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgSU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHByb2plY3QpOwotICAgICAgICAgICAgICAgIE9iamVjdCBtb2RlbFByb3ZpZGVyID0gcHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAvLyBqc3Qud2ViIDIuNQotICAgICAgICAgICAgICAgIGlmIChtb2RlbFByb3ZpZGVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCBqYXZhZWVXZWJBcHAgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgIChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIG1vZGVsUHJvdmlkZXI7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB1cmxQYXR0ZXJuID0gZ2V0VVJMUGF0dGVybihqYXZhZWVXZWJBcHApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBqc3Qud2ViIDIuNAotICAgICAgICAgICAgICAgIGlmIChtb2RlbFByb3ZpZGVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCB3ZWJBcHAgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgIChvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHApIG1vZGVsUHJvdmlkZXI7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB1cmxQYXR0ZXJuID0gZ2V0VVJMUGF0dGVybih3ZWJBcHApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB1cmxQYXR0ZXJuID0gdXJsUGF0dGVybi5zdWJzdHJpbmcoMCwgdXJsUGF0dGVybi5sYXN0SW5kZXhPZigiLyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIFN0cmluZyBqYXh3c0VuZHBvaW50QWRkcmVzcyA9IFNwcmluZ1V0aWxzLmdldEVuZHBvaW50QWRkcmVzcyhwcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldENvbmZpZ0lkKCkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFN0cmluZyB3c2RsQWRkcmVzcyA9IHdlYkNvYkNvbXBvbmVudFVSTCArIHVybFBhdHRlcm4gKyBqYXh3c0VuZHBvaW50QWRkcmVzczsKLSAgICAgICAgICAgICAgICBTdHJpbmcgd3NkbFVSTCA9IHdzZGxBZGRyZXNzICsgIj93c2RsIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdlYlNlcnZpY2UuZ2V0V2ViU2VydmljZUluZm8oKS5zZXRXc2RsVVJMKHdzZGxVUkwpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG1vZGVsLmdldFdzZGxEZWZpbml0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IFdTRExVdGlscy5nZXRFbmRwb2ludEFkZHJlc3MoZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoU09BUEFkZHJlc3MpIGV4dGVuc2liaWxpdHlFbGVtZW50KS5zZXRMb2NhdGlvblVSSSh3c2RsQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUDEyQWRkcmVzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgKChTT0FQMTJBZGRyZXNzKSBleHRlbnNpYmlsaXR5RWxlbWVudCkuc2V0TG9jYXRpb25VUkkod3NkbEFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgV1NETFV0aWxzLndyaXRlV1NETChtb2RlbC5nZXRXc2RsVVJMKCksIGRlZmluaXRpb24pOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgaW9lLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgU3RyaW5nIGdldFVSTFBhdHRlcm4ob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIGphdmFlZVdlYkFwcCkgewotICAgICAgICBMaXN0PG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQ+IHNlcnZsZXRzID0gamF2YWVlV2ViQXBwLmdldFNlcnZsZXRzKCk7Ci0gICAgICAgIGZvciAob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCBzZXJ2bGV0IDogc2VydmxldHMpIHsKLSAgICAgICAgICAgIGlmIChzZXJ2bGV0LmdldFNlcnZsZXRDbGFzcygpLmVxdWFscyhDWEZfU0VSVkxFVCkpIHsKLSAgICAgICAgICAgICAgICBMaXN0PG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nPiBzZXJ2bGV0TWFwcGluZ3MgPSAKLSAgICAgICAgICAgICAgICAgICAgamF2YWVlV2ViQXBwLmdldFNlcnZsZXRNYXBwaW5ncygpOwotICAgICAgICAgICAgICAgIGZvciAob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmcgc2VydmxldE1hcHBpbmcgOiBzZXJ2bGV0TWFwcGluZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZsZXRNYXBwaW5nLmdldFNlcnZsZXROYW1lKCkuZXF1YWxzKHNlcnZsZXQuZ2V0U2VydmxldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8b3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlPiB1cmxQYXR0ZXJucyA9IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXRNYXBwaW5nLmdldFVybFBhdHRlcm5zKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJsUGF0dGVybnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICgob3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsUGF0dGVybnMuZ2V0KDApKS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VVJMUGF0dGVybihvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAgd2ViQXBwKSB7Ci0gICAgICAgIExpc3Q8b3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldD4gc2VydmxldHMgPSB3ZWJBcHAuZ2V0U2VydmxldHMoKTsKLSAgICAgICAgZm9yIChvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0IHNlcnZsZXQgOiBzZXJ2bGV0cykgewotICAgICAgICAgICAgaWYgKHNlcnZsZXQuZ2V0U2VydmxldENsYXNzKCkuZ2V0SmF2YU5hbWUoKS5lcXVhbHMoQ1hGX1NFUlZMRVQpKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZz4gc2VydmxldE1hcHBpbmdzID0gCi0gICAgICAgICAgICAgICAgICAgIHdlYkFwcC5nZXRTZXJ2bGV0TWFwcGluZ3MoKTsKLSAgICAgICAgICAgICAgICBmb3IgKG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nIHNlcnZsZXRNYXBwaW5nIDogc2VydmxldE1hcHBpbmdzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2bGV0TWFwcGluZy5nZXRTZXJ2bGV0KCkuZ2V0U2VydmxldE5hbWUoKS5lcXVhbHMoc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZsZXRNYXBwaW5nLmdldFVybFBhdHRlcm4oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0Q1hGRGF0YU1vZGVsKENYRkRhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50Q29tcG9uZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuICJ0ZW1wbGF0ZS5jeGYuY29yZSI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0pBWFdTQW5ub3RhdGVKYXZhQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KQVhXU0Fubm90YXRlSmF2YUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlY2QyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0pBWFdTQW5ub3RhdGVKYXZhQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuSVVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEpBWFdTQW5ub3RhdGVKYXZhQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICBwcml2YXRlIGludCBudW1iZXJPZkNoYW5nZXMgPSAwOwotCi0gICAgcHJpdmF0ZSBKYXZhMldTRGF0YU1vZGVsIG1vZGVsOwotICAgIHByaXZhdGUgSVR5cGUgamF2YUNsYXNzVHlwZTsKLSAgICBwcml2YXRlIElUeXBlIGphdmFJbnRlcmZhY2VUeXBlOwotICAgIAotICAgIHB1YmxpYyBKQVhXU0Fubm90YXRlSmF2YUNvbW1hbmQoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtb2RlbC5pc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGVJbnRlcmZhY2UobW9uaXRvcik7Ci0KLSAgICAgICAgICAgICAgICBpZiAobW9kZWwuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0ZVNFSUNsYXNzKG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZWwuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFubm90YXRlQ2xhc3MobW9uaXRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELCBpdGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfSAKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGFubm90YXRlSW50ZXJmYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0gICAgICAgICAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGphdmFJbnRlcmZhY2VUeXBlID0gSkRUVXRpbHMuZ2V0VHlwZShKRFRVdGlscy5nZXRKYXZhUHJvamVjdChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKSwgbW9kZWwKLSAgICAgICAgICAgICAgICAuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpKTsKLQotICAgICAgICBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiQW5ub3RhdGluZyBJbnRlcmZhY2UiLCAKLSAgICAgICAgICAgICAgICAoSUZpbGUpamF2YUludGVyZmFjZVR5cGUuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgIE11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgICAgIHRleHRGaWxlQ2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0KLSAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRXZWJTZXJ2aWNlQW5ub3RhdGlvbkNoYW5nZShqYXZhSW50ZXJmYWNlVHlwZSwgbW9kZWwsIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICBJTWV0aG9kW10gdHlwZU1ldGhvZHMgPSBKRFRVdGlscy5nZXRQdWJsaWNNZXRob2RzKGphdmFJbnRlcmZhY2VUeXBlKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlTWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSB0eXBlTWV0aG9kc1tpXTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIEJvb2xlYW4+IG1ldGhvZEFubm90YXRpb25NYXAgPSBtb2RlbC5nZXRNZXRob2RNYXAoKS5nZXQobWV0aG9kKTsKLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLldFQl9NRVRIT0QpKSB7Ci0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRXZWJNZXRob2RBbm5vdGF0aW9uQ2hhbmdlKGphdmFJbnRlcmZhY2VUeXBlLCBtZXRob2QsIAotICAgICAgICAgICAgICAgIAkJdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1ldGhvZEFubm90YXRpb25NYXAuZ2V0KENYRk1vZGVsVXRpbHMuUkVRVUVTVF9XUkFQUEVSKSkgewotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0UmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uQ2hhbmdlKGphdmFJbnRlcmZhY2VUeXBlLCBtZXRob2QsIAotICAgICAgICAgICAgICAgIAkJdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1ldGhvZEFubm90YXRpb25NYXAuZ2V0KENYRk1vZGVsVXRpbHMuUkVTUE9OU0VfV1JBUFBFUikpIHsKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFJlc3BvbnNlV3JhcHBlckFubm90YXRpb25DaGFuZ2UoamF2YUludGVyZmFjZVR5cGUsIG1ldGhvZCwgCi0gICAgICAgICAgICAgICAgCQl0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWV0aG9kQW5ub3RhdGlvbk1hcC5nZXQoQ1hGTW9kZWxVdGlscy5XRUJfUEFSQU0pKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gQW5ub3RhdGlvblV0aWxzLmdldE1ldGhvZFBhcmFtZXRlcnMoCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhSW50ZXJmYWNlVHlwZSwgbWV0aG9kKTsKLSAgICAgICAgICAgICAgICBmb3IgKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFdlYlBhcmFtQW5ub3RhdGlvbkNoYW5nZShqYXZhSW50ZXJmYWNlVHlwZSwgbWV0aG9kLCBwYXJhbWV0ZXIsIAotICAgICAgICAgICAgICAgICAgICAJCXRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBDWEZNb2RlbFV0aWxzLmdldEltcG9ydHNDaGFuZ2UoamF2YUludGVyZmFjZVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksIG1vZGVsLCAKLSAgICAgICAgCQl0ZXh0RmlsZUNoYW5nZSwgZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgZXhlY3V0ZUNoYW5nZShtb25pdG9yLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBhbm5vdGF0ZUNsYXNzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0gICAgICAgICAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGphdmFDbGFzc1R5cGUgPSBKRFRVdGlscy5nZXRUeXBlKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KG1vZGVsLmdldFByb2plY3ROYW1lKCkpLCBtb2RlbAotICAgICAgICAgICAgICAgIC5nZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKSk7Ci0KLSAgICAgICAgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIkFubm90YXRpbmcgQ2xhc3MiLCAKLSAgICAgICAgICAgICAgICAoSUZpbGUpamF2YUNsYXNzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgdGV4dEZpbGVDaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLSAgICAgICAgCi0gICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0V2ViU2VydmljZUFubm90YXRpb25DaGFuZ2UoamF2YUNsYXNzVHlwZSwgbW9kZWwsIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICBJTWV0aG9kW10gdHlwZU1ldGhvZHMgPSBKRFRVdGlscy5nZXRQdWJsaWNNZXRob2RzKGphdmFDbGFzc1R5cGUpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHR5cGVNZXRob2RzW2ldOwotICAgICAgICAgICAgTWFwPFN0cmluZywgQm9vbGVhbj4gbWV0aG9kQW5ub3RhdGlvbk1hcCA9IG1vZGVsLmdldE1ldGhvZE1hcCgpLmdldChtZXRob2QpOwotICAgICAgICAgICAgaWYgKG1ldGhvZEFubm90YXRpb25NYXAuZ2V0KENYRk1vZGVsVXRpbHMuV0VCX01FVEhPRCkpIHsKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFdlYk1ldGhvZEFubm90YXRpb25DaGFuZ2UoamF2YUNsYXNzVHlwZSwgbWV0aG9kLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWV0aG9kQW5ub3RhdGlvbk1hcC5nZXQoQ1hGTW9kZWxVdGlscy5SRVFVRVNUX1dSQVBQRVIpKSB7Ci0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRSZXF1ZXN0V3JhcHBlckFubm90YXRpb25DaGFuZ2UoamF2YUNsYXNzVHlwZSwgbWV0aG9kLCAKLSAgICAgICAgICAgICAgICAJCXRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLlJFU1BPTlNFX1dSQVBQRVIpKSB7Ci0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uQ2hhbmdlKGphdmFDbGFzc1R5cGUsIG1ldGhvZCwgCi0gICAgICAgICAgICAgICAgCQl0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWV0aG9kQW5ub3RhdGlvbk1hcC5nZXQoQ1hGTW9kZWxVdGlscy5XRUJfUEFSQU0pKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gQW5ub3RhdGlvblV0aWxzLmdldE1ldGhvZFBhcmFtZXRlcnMoCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhQ2xhc3NUeXBlLCBtZXRob2QpOwotICAgICAgICAgICAgICAgIGZvciAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0V2ViUGFyYW1Bbm5vdGF0aW9uQ2hhbmdlKGphdmFDbGFzc1R5cGUsIG1ldGhvZCwgcGFyYW1ldGVyLCAKLSAgICAgICAgICAgICAgICAgICAgCQl0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRJbXBvcnRzQ2hhbmdlKGphdmFDbGFzc1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksIG1vZGVsLCAKLSAgICAgICAgCQl0ZXh0RmlsZUNoYW5nZSwgZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgZXhlY3V0ZUNoYW5nZShtb25pdG9yLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFubm90YXRlU0VJQ2xhc3MoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgamF2YUNsYXNzVHlwZSA9IEpEVFV0aWxzLmdldFR5cGUoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSksIG1vZGVsCi0gICAgICAgICAgICAgICAgLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpKTsKLQotICAgICAgICBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiQW5ub3RhdGlvbiBDaGFuZ2VzIiwKLSAgICAgICAgICAgICAgICAoSUZpbGUpamF2YUNsYXNzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgdGV4dEZpbGVDaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFdlYlNlcnZpY2VBbm5vdGF0aW9uQ2hhbmdlKGphdmFDbGFzc1R5cGUsIG1vZGVsLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgIAotICAgICAgICBDWEZNb2RlbFV0aWxzLmdldEltcG9ydHNDaGFuZ2UoamF2YUNsYXNzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgbW9kZWwsIAotICAgICAgICAJCXRleHRGaWxlQ2hhbmdlLCB0cnVlKTsKLQotICAgICAgICBleGVjdXRlQ2hhbmdlKG1vbml0b3IsIHRleHRGaWxlQ2hhbmdlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBDaGFuZ2UgY2hhbmdlKSB7Ci0gICAgICAgIGlmIChjaGFuZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgSVVuZG9NYW5hZ2VyIG1hbmFnZXI9IFJlZmFjdG9yaW5nQ29yZS5nZXRVbmRvTWFuYWdlcigpOwotICAgICAgICBib29sZWFuIHN1Y2Nlc3NmdWwgPSBmYWxzZTsKLSAgICAgICAgQ2hhbmdlIHVuZG9DaGFuZ2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2hhbmdlLmluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShtb25pdG9yKTsKLSAgICAgICAgICAgIFJlZmFjdG9yaW5nU3RhdHVzIHZhbGlkID0gY2hhbmdlLmlzVmFsaWQobW9uaXRvcik7Ci0gICAgICAgICAgICBpZiAodmFsaWQuaXNPSygpKSB7Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5hYm91dFRvUGVyZm9ybUNoYW5nZShjaGFuZ2UpOwotICAgICAgICAgICAgICAgIHVuZG9DaGFuZ2UgPSBjaGFuZ2UucGVyZm9ybShtb25pdG9yKTsKLSAgICAgICAgICAgICAgICBzdWNjZXNzZnVsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBudW1iZXJPZkNoYW5nZXMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtYW5hZ2VyLmNoYW5nZVBlcmZvcm1lZChjaGFuZ2UsIHN1Y2Nlc3NmdWwpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1bmRvQ2hhbmdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHVuZG9DaGFuZ2UuaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKG1vbml0b3IpOwotICAgICAgICAgICAgbWFuYWdlci5hZGRVbmRvKHVuZG9DaGFuZ2UuZ2V0TmFtZSgpLCB1bmRvQ2hhbmdlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICAKLSAgICAgICAgSVVuZG9NYW5hZ2VyIG1hbmFnZXI9IFJlZmFjdG9yaW5nQ29yZS5nZXRVbmRvTWFuYWdlcigpOwotCi0gICAgICAgIGlmIChtYW5hZ2VyLmFueXRoaW5nVG9VbmRvKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZkNoYW5nZXM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLnBlcmZvcm1VbmRvKG51bGwsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0phdmEyV1NDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0phdmEyV1NDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MDJjMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQuSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnJlc291cmNlcy5KYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUucmVzb3VyY2VzLldlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ29tbWFuZExpbmVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5MYXVuY2hVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuU3ByaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi0vKioKLSAqIFByb3ZpZGVzIGEgd3JhcHBlciBhcm91bmQgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY3hmLnRvb2xzLmphdmEyd3MuSmF2YVRvV1M8L2NvZGU+IG9yIHRoZSAKLSAqIDxjb2RlPm9yZy5hcGFjaGUuY3hmLnRvb2xzLmphdmEyd3NkbC5KYXZhVG9XU0RMPC9jb2RlPiBjb21tYW5kIGRlcGVuZGluZyBvbiB0aGUgdmVyc2lvbgotICogb2YgQ1hGIHVzZWQuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEphdmEyV1NDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBKQVZBMldTRExfVE9PTF9DTEFTU19OQU1FID0gIm9yZy5hcGFjaGUuY3hmLnRvb2xzLmphdmEyd3NkbC5KYXZhVG9XU0RMIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBKQVZBMldTX1RPT0xfQ0xBU1NfTkFNRSA9ICJvcmcuYXBhY2hlLmN4Zi50b29scy5qYXZhMndzLkphdmFUb1dTIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgU3RyaW5nIENYRl9UT09MX0NMQVNTX05BTUU7Ci0KLSAgICBwcml2YXRlIEphdmEyV1NEYXRhTW9kZWwgbW9kZWw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWU7Ci0gICAgCi0gICAgcHJpdmF0ZSBKYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLSAgICBwcml2YXRlIFdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lciB3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXI7Ci0gICAgCi0gICAgcHVibGljIEphdmEyV1NDb21tYW5kKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgICAgICBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoSkRUVXRpbHMKLSAgICAgICAgICAgICAgICAuZ2V0SmF2YVByb2plY3RTb3VyY2VEaXJlY3RvcnlQYXRoKHByb2plY3ROYW1lLCBtb2RlbC5nZXRKYXZhU3RhcnRpbmdQb2ludCgpKSk7Ci0gICAgICAgIHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lciA9IG5ldyBXZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIocHJvamVjdE5hbWUpOwotCi0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCAKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lciwgCi0gICAgICAgICAgICAgICAgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCi0gICAgICAgIGlmIChtb2RlbC5nZXRDeGZSdW50aW1lVmVyc2lvbigpLmNvbXBhcmVUbyhDWEZDb3JlUGx1Z2luLkNYRl9WRVJTSU9OXzJfMSkgPj0gMCkgewotICAgICAgICAgICAgQ1hGX1RPT0xfQ0xBU1NfTkFNRSA9IEpBVkEyV1NfVE9PTF9DTEFTU19OQU1FOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ1hGX1RPT0xfQ0xBU1NfTkFNRSA9IEpBVkEyV1NETF9UT09MX0NMQVNTX05BTUU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBwcm9nQXJncyA9IENvbW1hbmRMaW5lVXRpbHMuZ2V0SmF2YTJXU1Byb2dyYW1Bcmd1bWVudHMobW9kZWwpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gRmlsZVV0aWxzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdCk7Ci0gICAgICAgICAgICBMYXVuY2hVdGlscy5sYXVuY2goamF2YVByb2plY3QsIENYRl9UT09MX0NMQVNTX05BTUUsIHByb2dBcmdzKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5SjJXRmlsZXNGcm9tVG1wKG1vZGVsKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1vZGVsLmlzR2VuZXJhdGVXU0RMKCkpIHsKLSAgICAgICAgICAgIAlTcHJpbmdVdGlscy5sb2FkU3ByaW5nQ29uZmlnSW5mb3JtYXRpb25Gcm9tV1NETCgobW9kZWwpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGlzSW1wbGVtZW50YXRpb25TZWxlY3RlZCgpIHx8IGlzR2VuZXJhdGVTZXJ2ZXIoKSkgewotICAgICAgICAgICAgICAgIFNwcmluZ1V0aWxzLmNyZWF0ZUpBWFdTRW5kcG9pbnQobW9kZWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgaW9lLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIpOwotICAgICAgICAgICAgRmlsZVV0aWxzLnJlZnJlc2hQcm9qZWN0KHByb2plY3ROYW1lLCBtb25pdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSW1wbGVtZW50YXRpb25TZWxlY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIChtb2RlbC5nZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKSAhPSBudWxsICYmIAotICAgICAgICAgICAgICAgIG1vZGVsLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpLnRyaW0oKS5sZW5ndGgoKSA+IDApOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0dlbmVyYXRlU2VydmVyKCkgewotCQlpZiAobW9kZWwuaXNHZW5lcmF0ZVNlcnZlcigpKSB7Ci0JCQltb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUobW9kZWwuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpICsgIkltcGwiKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgTGlzdDxJUmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PElSZXNvdXJjZT4oKTsKLSAgICAgICAgY2hhbmdlZFJlc291cmNlcy5hZGRBbGwoamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLSAgICAgICAgY2hhbmdlZFJlc291cmNlcy5hZGRBbGwod2ViQ29udGVudENoYW5nZUxpc3RlbmVyLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7Ci0gICAgICAgIGlmIChjaGFuZ2VkUmVzb3VyY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoSVJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlLmRlbGV0ZSh0cnVlLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEphdmEyV1NQZXJzaXN0ZW50Q29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVDbGllbnQoY29udGV4dC5pc0dlbmVyYXRlQ2xpZW50KCkpOwotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVNlcnZlcihjb250ZXh0LmlzR2VuZXJhdGVTZXJ2ZXIoKSk7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoY29udGV4dC5pc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKSk7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlV1NETChjb250ZXh0LmlzR2VuZXJhdGVXU0RMKCkpOwotICAgICAgICBtb2RlbC5zZXRTb2FwMTJCaW5kaW5nKGNvbnRleHQuaXNTb2FwMTJCaW5kaW5nKCkpOwotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVhTREltcG9ydHMoY29udGV4dC5pc0dlbmVyYXRlWFNESW1wb3J0cygpKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENYRkRhdGFNb2RlbCBnZXRDWEZEYXRhTW9kZWwoKSB7Ci0gICAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0phdmEyV1NEZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI3ZDQ5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0phdmEyV1NEZWZhdWx0aW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dC5KYXZhMldTUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLldTRExVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YTJXU0RlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotICAgIHByaXZhdGUgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbDsKLQotICAgIHB1YmxpYyBKYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEphdmEyV1NQZXJzaXN0ZW50Q29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEN4ZlJ1bnRpbWVWZXJzaW9uKGNvbnRleHQuZ2V0Q3hmUnVudGltZVZlcnNpb24oKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRDeGZSdW50aW1lRWRpdGlvbihjb250ZXh0LmdldEN4ZlJ1bnRpbWVFZGl0aW9uKCkpOwotCi0gICAgICAgICAgICBJVHlwZSBzdGFydGluZ1BvaW50VHlwZSA9IGdldEphdmFTdGFydGluZ1BvaW50VHlwZSgpOyAKLSAgICAgICAgICAgIG1vZGVsLnNldFVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZShzdGFydGluZ1BvaW50VHlwZS5pc0ludGVyZmFjZSgpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEV4dHJhY3RJbnRlcmZhY2UoZmFsc2UpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBzdGFydGluZ1BvaW50VHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgbW9kZWwuc2V0VGFyZ2V0TmFtZXNwYWNlKEpEVFV0aWxzLmdldFRhcmdldE5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZShwYWNrYWdlTmFtZSkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBtb2RlbC5zZXRBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoY29udGV4dC5pc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbihjb250ZXh0LmlzR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oY29udGV4dC5pc0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oY29udGV4dC5pc0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRBbm5vdGF0aW9uTWFwKENYRk1vZGVsVXRpbHMuZ2V0QW5ub3RhdGlvbk1hcChtb2RlbCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0TWV0aG9kTWFwKENYRk1vZGVsVXRpbHMuZ2V0TWV0aG9kTWFwKHN0YXJ0aW5nUG9pbnRUeXBlLCBtb2RlbCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVhTREltcG9ydHMoY29udGV4dC5pc0dlbmVyYXRlWFNESW1wb3J0cygpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldERhdGFiaW5kaW5nKGNvbnRleHQuZ2V0RGF0YWJpbmRpbmcoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRGcm9udGVuZChjb250ZXh0LmdldEZyb250ZW5kKCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVDbGllbnQoY29udGV4dC5pc0dlbmVyYXRlQ2xpZW50KCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVTZXJ2ZXIoY29udGV4dC5pc0dlbmVyYXRlU2VydmVyKCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0U29hcDEyQmluZGluZyhjb250ZXh0LmlzU29hcDEyQmluZGluZygpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoY29udGV4dC5pc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVdTREwoY29udGV4dC5pc0dlbmVyYXRlV1NETCgpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldFVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dChjb250ZXh0LmlzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0VmVyYm9zZShjb250ZXh0LmlzVmVyYm9zZSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IEpEVFV0aWxzLmdldENsYXNzTmFtZShtb2RlbC5nZXRQcm9qZWN0TmFtZSgpLCBtb2RlbC5nZXRKYXZhU3RhcnRpbmdQb2ludCgpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldFdzZGxGaWxlTmFtZShjbGFzc05hbWUudG9Mb3dlckNhc2UoKSArIFdTRExVdGlscy5XU0RMX0ZJTEVfRVhURU5TSU9OKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgc3RhdHVzID0gam1lLmdldFN0YXR1cygpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgcHVibGljIENYRkRhdGFNb2RlbCBnZXRKYXZhMldTRGF0YU1vZGVsKCkgewotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotCi0gICAgcHVibGljIElUeXBlIGdldEphdmFTdGFydGluZ1BvaW50VHlwZSgpIHsKLSAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0UHJvamVjdE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGphdmFTdGFydGluZ1BvaW50ID0gbW9kZWwuZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKTsKLQotICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIElUeXBlIHN0YXJ0aW5nUG9pbnRUeXBlID0gSkRUVXRpbHMuZ2V0VHlwZShqYXZhUHJvamVjdCwgamF2YVN0YXJ0aW5nUG9pbnQpOwotICAgICAgICByZXR1cm4gc3RhcnRpbmdQb2ludFR5cGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTU2VsZWN0U0VJQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTU2VsZWN0U0VJQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTU1MTk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvSmF2YTJXU1NlbGVjdFNFSUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQucmVmYWN0b3Jpbmcuc3RydWN0dXJlLkV4dHJhY3RJbnRlcmZhY2VQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmFjdGlvbnMuV29ya2JlbmNoUnVubmFibGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5KYXZhUHJlZmVyZW5jZXNTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudXRpbC5CdXN5SW5kaWNhdG9yUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5DWEZDcmVhdGlvbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoZWNrQ29uZGl0aW9uc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DcmVhdGVDaGFuZ2VPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUGVyZm9ybUNoYW5nZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlByb2Nlc3NvckJhc2VkUmVmYWN0b3Jpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKYXZhMldTU2VsZWN0U0VJQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICBwcml2YXRlIENoYW5nZSB1bmRvRXh0cmFjdEludGVyZmFjZUNoYW5nZTsKLQotICAgIHByaXZhdGUgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbDsKLSAgICAKLSAgICBwcml2YXRlICBJVHlwZSBzdGFydGluZ1BvaW50VHlwZTsKLQotICAgIHB1YmxpYyBKYXZhMldTU2VsZWN0U0VJQ29tbWFuZChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0UHJvamVjdE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBqYXZhU3RhcnRpbmdQb2ludCA9IG1vZGVsLmdldEphdmFTdGFydGluZ1BvaW50KCk7Ci0KLSAgICAgICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgICAgIHN0YXJ0aW5nUG9pbnRUeXBlID0gSkRUVXRpbHMuZ2V0VHlwZShqYXZhUHJvamVjdCwgamF2YVN0YXJ0aW5nUG9pbnQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoc3RhcnRpbmdQb2ludFR5cGUuaXNJbnRlcmZhY2UoKSkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoc3RhcnRpbmdQb2ludFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydGluZ1BvaW50VHlwZS5pc0NsYXNzKCkpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoc3RhcnRpbmdQb2ludFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmIChtb2RlbC5pc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpICYmIG1vZGVsLmlzRXh0cmFjdEludGVyZmFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4dHJhY3RJbnRlcmZhY2Uoc3RhcnRpbmdQb2ludFR5cGUsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgc3RhdHVzID0gam1lLmdldFN0YXR1cygpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXh0cmFjdEludGVyZmFjZShJVHlwZSB0eXBlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIEV4dHJhY3RJbnRlcmZhY2VQcm9jZXNzb3IgZXh0cmFjdEludGVyZmFjZVByb2Nlc3NvciA9IG5ldyBFeHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yKHR5cGUsCi0gICAgICAgICAgICAgICAgICAgIEphdmFQcmVmZXJlbmNlc1NldHRpbmdzLmdldENvZGVHZW5lcmF0aW9uU2V0dGluZ3ModHlwZS5nZXRKYXZhUHJvamVjdCgpKSk7Ci0gICAgICAgICAgICBSZWZhY3RvcmluZyBleHRyYWN0SW50ZXJmYWNlUmVmYWN0b3JpbmcgPSBuZXcgUHJvY2Vzc29yQmFzZWRSZWZhY3RvcmluZyhleHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yKSB7Ci0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgUmVmYWN0b3JpbmdQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFjdEludGVyZmFjZVByb2Nlc3NvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gbW9kZWwuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpOwotICAgICAgICAgICAgaWYgKHR5cGVOYW1lLmluZGV4T2YoIi4iKSAhPSAtMSkgewotICAgICAgICAgICAgICAgIHR5cGVOYW1lID0gdHlwZU5hbWUuc3Vic3RyaW5nKHR5cGVOYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxLCB0eXBlTmFtZS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBleHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yLnNldFR5cGVOYW1lKHR5cGVOYW1lKTsKLSAgICAgICAgICAgIGV4dHJhY3RJbnRlcmZhY2VQcm9jZXNzb3Iuc2V0UmVwbGFjZShmYWxzZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNldDxJTWV0aG9kPiBtZXRob2RzID0gbW9kZWwuZ2V0TWV0aG9kTWFwKCkua2V5U2V0KCk7Ci0gICAgICAgICAgICBleHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yLnNldEV4dHJhY3RlZE1lbWJlcnMobWV0aG9kcy50b0FycmF5KG5ldyBJTWVtYmVyW21ldGhvZHMuc2l6ZSgpXSkpOwotICAgICAgICAgICAgZXh0cmFjdEludGVyZmFjZVByb2Nlc3Nvci5zZXRBYnN0cmFjdChmYWxzZSk7Ci0gICAgICAgICAgICBleHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yLnNldFB1YmxpYyh0cnVlKTsKLSAgICAgICAgICAgIGV4dHJhY3RJbnRlcmZhY2VQcm9jZXNzb3Iuc2V0Q29tbWVudHMoZmFsc2UpOwotICAgICAgICAgICAgZXh0cmFjdEludGVyZmFjZVByb2Nlc3Nvci5zZXRJbnN0YW5jZU9mKGZhbHNlKTsKLQotICAgICAgICAgICAgQ3JlYXRlQ2hhbmdlT3BlcmF0aW9uIGNyZWF0ZUNoYW5nZU9wZXJhdGlvbiA9IG5ldyBDcmVhdGVDaGFuZ2VPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDaGVja0NvbmRpdGlvbnNPcGVyYXRpb24oZXh0cmFjdEludGVyZmFjZVJlZmFjdG9yaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQ29uZGl0aW9uc09wZXJhdGlvbi5GSU5BTF9DT05ESVRJT05TKSwgUmVmYWN0b3JpbmdDb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbmRpdGlvbkNoZWNraW5nRmFpbGVkU2V2ZXJpdHkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFBlcmZvcm1DaGFuZ2VPcGVyYXRpb24gcGVyZm9ybUNoYW5nZU9wZXJhdGlvbiA9IG5ldyBQZXJmb3JtQ2hhbmdlT3BlcmF0aW9uKGNyZWF0ZUNoYW5nZU9wZXJhdGlvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFdvcmtiZW5jaFJ1bm5hYmxlQWRhcHRlciBhZGFwdGVyID0gbmV3IFdvcmtiZW5jaFJ1bm5hYmxlQWRhcHRlcihwZXJmb3JtQ2hhbmdlT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkucnVuSW5VSSgKLSAgICAgICAgICAgICAgICBuZXcgQnVzeUluZGljYXRvclJ1bm5hYmxlQ29udGV4dCgpLCBhZGFwdGVyLCBhZGFwdGVyLmdldFNjaGVkdWxpbmdSdWxlKCkpOwotCi0gICAgICAgICAgICBpZiAocGVyZm9ybUNoYW5nZU9wZXJhdGlvbi5jaGFuZ2VFeGVjdXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lICs9ICIuIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUgPSBwYWNrYWdlTmFtZSArIGV4dHJhY3RJbnRlcmZhY2VQcm9jZXNzb3IuZ2V0VHlwZU5hbWUoKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKGZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUpOwotICAgICAgICAgICAgICAgIG1vZGVsLnNldE1ldGhvZE1hcChDWEZNb2RlbFV0aWxzLmdldE1ldGhvZE1hcChKRFRVdGlscy5nZXRUeXBlKG1vZGVsLmdldFByb2plY3ROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSksIG1vZGVsKSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdW5kb0V4dHJhY3RJbnRlcmZhY2VDaGFuZ2UgPSBwZXJmb3JtQ2hhbmdlT3BlcmF0aW9uLmdldFVuZG9DaGFuZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhpdGUpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhpZSk7Ci0gICAgICAgIH0gCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgaWYgKHVuZG9FeHRyYWN0SW50ZXJmYWNlQ2hhbmdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAJUGVyZm9ybUNoYW5nZU9wZXJhdGlvbiBjaGFuZ2VPcGVyYXRpb24gPSBuZXcgUGVyZm9ybUNoYW5nZU9wZXJhdGlvbih1bmRvRXh0cmFjdEludGVyZmFjZUNoYW5nZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBXb3JrYmVuY2hSdW5uYWJsZUFkYXB0ZXIgYWRhcHRlcj0gbmV3IFdvcmtiZW5jaFJ1bm5hYmxlQWRhcHRlcihjaGFuZ2VPcGVyYXRpb24pOwotICAgICAgICAgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkucnVuSW5VSSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdXN5SW5kaWNhdG9yUnVubmFibGVDb250ZXh0KCksIGFkYXB0ZXIsIGFkYXB0ZXIuZ2V0U2NoZWR1bGluZ1J1bGUoKSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKCFzdGFydGluZ1BvaW50VHlwZS5nZXRDb21waWxhdGlvblVuaXQoKS5pc0NvbnNpc3RlbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBzdGFydGluZ1BvaW50VHlwZS5nZXRDb21waWxhdGlvblVuaXQoKS5tYWtlQ29uc2lzdGVudChtb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRNZXRob2RNYXAoQ1hGTW9kZWxVdGlscy5nZXRNZXRob2RNYXAoc3RhcnRpbmdQb2ludFR5cGUsIG1vZGVsKSk7Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBqbWUuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsIGl0ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELCBpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvSmF2YTJXU1ZhbGlkYXRlSW5wdXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0phdmEyV1NWYWxpZGF0ZUlucHV0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2JlZWNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvSmF2YTJXU1ZhbGlkYXRlSW5wdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5DWEZDcmVhdGlvbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmEyV1NWYWxpZGF0ZUlucHV0Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICAKLSAgICBwcml2YXRlIEphdmEyV1NEYXRhTW9kZWwgbW9kZWw7Ci0KLSAgICBwdWJsaWMgSmF2YTJXU1ZhbGlkYXRlSW5wdXRDb21tYW5kKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KG1vZGVsLmdldFByb2plY3ROYW1lKCkpOwotICAgICAgICBpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IEpEVFV0aWxzLmdldFR5cGUoamF2YVByb2plY3QsIG1vZGVsLmdldEphdmFTdGFydGluZ1BvaW50KCkpOwotICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCB8fCAhdHlwZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5iaW5kKENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLkpBVkEyV1NfU0VSVklDRV9JTVBMX05PVF9GT1VORCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHttb2RlbC5nZXRKYXZhU3RhcnRpbmdQb2ludCgpLCBtb2RlbC5nZXRQcm9qZWN0TmFtZSgpfSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHR5cGUuaXNCaW5hcnkoKSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLkpBVkEyV1NfU0VSVklDRV9JTVBMX05PVF9CSU5BUlkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcxYjQ2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUucmVzb3VyY2VzLkphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5yZXNvdXJjZXMuV2ViQ29udGVudENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5Db21tYW5kTGluZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkxhdW5jaFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5TcHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVdlYlNlcnZpY2U7Ci0KLS8qKgotICogUHJvdmlkZXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jeGYudG9vbHMud3NkbHRvLldTRExUb0phdmE8L2NvZGU+IGNvbW1hbmQuCi0gKiAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENYRl9UT09MX0NMQVNTX05BTUUgPSAib3JnLmFwYWNoZS5jeGYudG9vbHMud3NkbHRvLldTRExUb0phdmEiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWw7Ci0gICAgcHJpdmF0ZSBJV2ViU2VydmljZSB3czsKLQotICAgIHByaXZhdGUgSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBXZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIgd2ViQ29udGVudENoYW5nZUxpc3RlbmVyOwotCi0gICAgcHVibGljIFdTREwySmF2YUNvbW1hbmQoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsLCBJV2ViU2VydmljZSB3cykgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgICAgIHRoaXMud3MgPSB3czsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBKYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihtb2RlbC5nZXRKYXZhU291cmNlRm9sZGVyKCkpOwotICAgICAgICB3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIgPSBuZXcgV2ViQ29udGVudENoYW5nZUxpc3RlbmVyKG1vZGVsLmdldFByb2plY3ROYW1lKCkpOwotCi0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLAotICAgICAgICAgICAgICAgIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLSAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIod2ViQ29udGVudENoYW5nZUxpc3RlbmVyLAotICAgICAgICAgICAgICAgIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRQcm9qZWN0TmFtZSgpOwotICAgICAgICAKLSAgICAgICAgLy9UT0RPIHJldmlzaXQKLSAgICAgICAgd3MuZ2V0V2ViU2VydmljZUluZm8oKS5zZXRJbXBsVVJMcyhuZXcgU3RyaW5nW10ge3Byb2plY3ROYW1lICsgIi9JbXBsLmphdmEifSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBTdHJpbmdbXSBwcm9nQXJncyA9IENvbW1hbmRMaW5lVXRpbHMuZ2V0V1NETDJKYXZhUHJvZ3JhbUFyZ3VtZW50cyhtb2RlbCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgICAgIExhdW5jaFV0aWxzLmxhdW5jaChqYXZhUHJvamVjdCwgQ1hGX1RPT0xfQ0xBU1NfTkFNRSwgcHJvZ0FyZ3MpOwotICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlXMkpGaWxlc0Zyb21UbXAobW9kZWwpOwotCi0gICAgICAgICAgICBpZiAobW9kZWwuaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBTcHJpbmdVdGlscy5jcmVhdGVDb25maWd1cmF0aW9uRnJvbVdTREwobW9kZWwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgaW9lLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7ICAKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLSAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICBGaWxlVXRpbHMucmVmcmVzaFByb2plY3QocHJvamVjdE5hbWUsIG1vbml0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBMaXN0PElSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8SVJlc291cmNlPigpOwotICAgICAgICBjaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbChqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOwotICAgICAgICBjaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbCh3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLSAgICAgICAgaWYgKGNoYW5nZWRSZXNvdXJjZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiBjaGFuZ2VkUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuZGVsZXRlKHRydWUsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENYRkRhdGFNb2RlbCBnZXRDWEZEYXRhTW9kZWwoKSB7Ci0gICAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvV1NETDJKYXZhRGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvV1NETDJKYXZhRGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FhMmFlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YURlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dC5XU0RMMkphdmFQZXJzaXN0ZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5yZXNvdXJjZXMuV2ViQ29udGVudENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5XU0RMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudXRpbC5XU0RMQ29waWVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdTREwySmF2YURlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotICAgIHByaXZhdGUgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsOwotICAgIHByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGlucHV0VVJMOwotICAgIAotICAgIHByaXZhdGUgV2ViQ29udGVudENoYW5nZUxpc3RlbmVyIHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcjsKLSAgICAKLSAgICBwdWJsaWMgV1NETDJKYXZhRGVmYXVsdGluZ0NvbW1hbmQoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBpbnB1dFVSTCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgICAgIHRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKLSAgICAgICAgdGhpcy5pbnB1dFVSTCA9IGlucHV0VVJMOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJkZXByZWNhdGlvbiIgfSkKLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIAkKLSAgICAJd2ViQ29udGVudENoYW5nZUxpc3RlbmVyID0gbmV3IFdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcihwcm9qZWN0TmFtZSk7Ci0gICAgCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lciwKLSAgICAJICAgICAgICBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0gICAgCQotICAgICAgICBXU0RMMkphdmFQZXJzaXN0ZW50Q29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V1NETDJKYXZhQ29udGV4dCgpOwotICAgICAgICBtb2RlbC5zZXRDeGZSdW50aW1lVmVyc2lvbihjb250ZXh0LmdldEN4ZlJ1bnRpbWVWZXJzaW9uKCkpOwotICAgICAgICBtb2RlbC5zZXRDeGZSdW50aW1lRWRpdGlvbihjb250ZXh0LmdldEN4ZlJ1bnRpbWVFZGl0aW9uKCkpOwotICAgICAgICAvLwotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZUltcGxlbWVudGF0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkpOwotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVNlcnZlcihjb250ZXh0LmlzR2VuZXJhdGVTZXJ2ZXIoKSk7Ci0gICAgICAgIG1vZGVsLnNldERhdGFiaW5kaW5nKGNvbnRleHQuZ2V0RGF0YWJpbmRpbmcoKSk7Ci0gICAgICAgIG1vZGVsLnNldEZyb250ZW5kKGNvbnRleHQuZ2V0RnJvbnRlbmQoKSk7Ci0gICAgICAgIG1vZGVsLnNldFdzZGxWZXJzaW9uKGNvbnRleHQuZ2V0V3NkbFZlcnNpb24oKSk7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlQW50QnVpbGRGaWxlKGNvbnRleHQuaXNHZW5lcmF0ZUFudEJ1aWxkRmlsZSgpKTsKLSAgICAgICAgbW9kZWwuc2V0SW5jbHVkZWROYW1lc3BhY2VzKG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKLSAgICAgICAgbW9kZWwuc2V0RXhjbHVkZWROYW1lc3BhY2VzKG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKLQotICAgICAgICAvLyBYSkMKLSAgICAgICAgbW9kZWwuc2V0WGpjVXNlRGVmYXVsdFZhbHVlcyhjb250ZXh0LmlzWGpjVXNlRGVmYXVsdFZhbHVlcygpKTsKLSAgICAgICAgbW9kZWwuc2V0WGpjVG9TdHJpbmcoY29udGV4dC5pc1hqY1RvU3RyaW5nKCkpOwotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZ011bHRpTGluZShjb250ZXh0LmlzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKSk7Ci0gICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nU2ltcGxlKGNvbnRleHQuaXNYamNUb1N0cmluZ1NpbXBsZSgpKTsKLSAgICAgICAgbW9kZWwuc2V0WGpjTG9jYXRvcihjb250ZXh0LmlzWGpjTG9jYXRvcigpKTsKLSAgICAgICAgbW9kZWwuc2V0WGpjU3luY01ldGhvZHMoY29udGV4dC5pc1hqY1N5bmNNZXRob2RzKCkpOwotICAgICAgICBtb2RlbC5zZXRYamNNYXJrR2VuZXJhdGVkKGNvbnRleHQuaXNYamNNYXJrR2VuZXJhdGVkKCkpOwotCi0gICAgICAgIG1vZGVsLnNldFZhbGlkYXRlKGNvbnRleHQuaXNWYWxpZGF0ZSgpKTsKLSAgICAgICAgbW9kZWwuc2V0UHJvY2Vzc1NPQVBIZWFkZXJzKGNvbnRleHQuaXNQcm9jZXNzU09BUEhlYWRlcnMoKSk7Ci0gICAgICAgIG1vZGVsLnNldExvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKGNvbnRleHQuaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpKTsKLSAgICAgICAgbW9kZWwuc2V0TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoY29udGV4dC5pc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkpOwotICAgICAgICBtb2RlbC5zZXRVc2VEZWZhdWx0VmFsdWVzKGNvbnRleHQuaXNVc2VEZWZhdWx0VmFsdWVzKCkpOwotICAgICAgICBtb2RlbC5zZXRBdXRvTmFtZVJlc29sdXRpb24oY29udGV4dC5pc0F1dG9OYW1lUmVzb2x1dGlvbigpKTsKLSAgICAgICAgbW9kZWwuc2V0Tm9BZGRyZXNzQmluZGluZyhjb250ZXh0LmlzTm9BZGRyZXNzQmluZGluZygpKTsKLSAgICAgICAgbW9kZWwuc2V0VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KGNvbnRleHQuaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSk7Ci0gICAgICAgIG1vZGVsLnNldEphdmFTb3VyY2VGb2xkZXIoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3RTb3VyY2VEaXJlY3RvcnlQYXRoKG1vZGVsLmdldFByb2plY3ROYW1lKCkpKTsKLQotICAgIAl0cnkgewotICAgIAkJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLSAgICAgICAgCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICAJSVByb2plY3QgcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIAlVUkwgd3NkbFVybCA9IG5ldyBVUkwoaW5wdXRVUkwpOwotICAgICAgICAJbW9kZWwuc2V0V3NkbFVSTCh3c2RsVXJsKTsKLSAgICAgICAgCWlmICh3c2RsVXJsLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAJCWlmICghRmlsZVV0aWxzLmlzRmlsZUluV2ViQ29udGVudEZvbGRlcihwcm9qZWN0LCBuZXcgUGF0aCh3c2RsVXJsLmdldFBhdGgoKSkpKSB7Ci0gICAgICAgIAkJICAgIElGb2xkZXIgd3NkbEZvbGRlciA9IFdTRExVdGlscy5nZXRXU0RMRm9sZGVyKHByb2plY3QpOwotICAgICAgICAJCQlJUGF0aCB3c2RsRm9sZGVyUGF0aCA9IHdzZGxGb2xkZXIuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlVG9Db3B5ID0gbmV3IEZpbGUod3NkbFVybC50b1VSSSgpKTsKLSAgICAgICAgCQkJV1NETENvcGllciBjb3BpZXIgPSBuZXcgV1NETENvcGllcigpOwotICAgICAgICAJCQkvL2ZvciBFY2xpcHNlIDMuMyBjb21wYXRpYmlsaXR5Ci0gICAgICAgIAkJCWNvcGllci5zZXRTb3VyY2VVUkkod3NkbFVybC50b0V4dGVybmFsRm9ybSgpKTsKLSAgICAgICAgCQkJY29waWVyLnNldFRhcmdldEZvbGRlclVSSSh3c2RsRm9sZGVyLmdldExvY2F0aW9uVVJJKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vY29waWVyLnNldFRhcmdldEZvbGRlclVSSSh3c2RsRm9sZGVyUGF0aC50b0ZpbGUoKS50b1N0cmluZygpKTsKLSAgICAgICAgCQkJd29ya3NwYWNlLnJ1bihjb3BpZXIsIG1vbml0b3IpOwotICAgICAgICAJCQl3c2RsRm9sZGVyLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBtb25pdG9yKTsKLSAgICAgICAgCQkJRmlsZSB3c2RsRmlsZSA9IHdzZGxGb2xkZXJQYXRoLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkuYXBwZW5kKGZpbGVUb0NvcHkuZ2V0TmFtZSgpKS50b0ZpbGUoKTsKLSAgICAgICAgCQkJbW9kZWwuc2V0V3NkbFVSTCh3c2RsRmlsZS50b1VSTCgpKTsKLSAgICAgICAgCQl9Ci0gICAgICAgICAgICAJZGVmaW5pdGlvbiA9IFdTRExVdGlscy5yZWFkV1NETChtb2RlbC5nZXRXc2RsVVJMKCkpOwotICAgICAgICAgICAgCWlmIChkZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIAkgICAgc2V0VE5TT25Nb2RlbChkZWZpbml0aW9uKTsKLSAgICAgICAgICAgIAkgICAgc2V0V1NETExvY2F0aW9uKGRlZmluaXRpb24pOwotICAgICAgICAgICAgCX0KLSAgICAgICAgCX0gZWxzZSB7Ci0gICAgICAgICAgICAgICAJU3RyaW5nIGZpbGVuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgIAlkZWZpbml0aW9uID0gV1NETFV0aWxzLnJlYWRXU0RMKHdzZGxVcmwpOwotICAgICAgICAJCWlmIChkZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwIHNlcnZpY2VzTWFwID0gZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgICAgICAgICAgICAgICAgICBTZXQ8TWFwLkVudHJ5PiBzZXJ2aWNlc1NldCA9IHNlcnZpY2VzTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldFROU09uTW9kZWwoZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIHNldFdTRExMb2NhdGlvbihkZWZpbml0aW9uKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeSBzZXJ2aWNlRW50cnkgOiBzZXJ2aWNlc1NldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIHNlcnZpY2VFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHBvcnRzTWFwID0gc2VydmljZS5nZXRQb3J0cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgU2V0PE1hcC5FbnRyeT4gcG9ydHNTZXQgPSBwb3J0c01hcC5lbnRyeVNldCgpOyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnkgcG9ydEVudHJ5IDogcG9ydHNTZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgcG9ydEVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBwb3J0LmdldEJpbmRpbmcoKS5nZXRQb3J0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gcG9ydFR5cGUuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IHFOYW1lLmdldExvY2FsUGFydCgpICsgV1NETFV0aWxzLldTRExfRklMRV9FWFRFTlNJT047Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgCQl9Ci0gICAgICAgIAkJSVBhdGggd3NkbEZvbGRlclBhdGggPSBXU0RMVXRpbHMuZ2V0V1NETEZvbGRlcihwcm9qZWN0KS5nZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgCVdTRExDb3BpZXIgY29waWVyID0gbmV3IFdTRExDb3BpZXIoKTsKLSAgICAgICAgICAgIAljb3BpZXIuc2V0U291cmNlVVJJKHdzZGxVcmwudG9FeHRlcm5hbEZvcm0oKSk7Ci0gICAgICAgICAgICAJY29waWVyLnNldFRhcmdldEZvbGRlclVSSSh3c2RsRm9sZGVyUGF0aC50b0ZpbGUoKS50b1VSSSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgCWNvcGllci5zZXRUYXJnZXRGaWxlbmFtZShmaWxlbmFtZSk7Ci0gICAgICAgICAgICAJd29ya3NwYWNlLnJ1bihjb3BpZXIsIG1vbml0b3IpOwotICAgICAgICAgICAgCQotICAgICAgICAgICAgCUZpbGUgd3NkbEZpbGUgPSB3c2RsRm9sZGVyUGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpLmFwcGVuZChmaWxlbmFtZSkudG9GaWxlKCk7Ci0gICAgCQkJbW9kZWwuc2V0V3NkbFVSTCh3c2RsRmlsZS50b1VSSSgpLnRvVVJMKCkpOwotICAgICAgICAJfQotICAgICAgICAJbW9kZWwuc2V0V3NkbEZpbGVOYW1lKFdTRExVdGlscy5nZXRXU0RMRmlsZU5hbWVGcm9tVVJMKG1vZGVsLmdldFdzZGxVUkwoKSkpOwotICAgICAgICAJCi0gICAgICAgIAlJUGF0aCB3c2RsTG9jYXRpb25QYXRoID0gbmV3IFBhdGgobW9kZWwuZ2V0V3NkbFVSTCgpLmdldFBhdGgoKSk7Ci0gICAgICAgIAl3c2RsTG9jYXRpb25QYXRoID0gd3NkbExvY2F0aW9uUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKFdTRExVdGlscy5nZXRXZWJDb250ZW50Rm9sZGVyKHByb2plY3QpCi0gICAgICAgIAkJCS5nZXRMb2NhdGlvbigpLm1hdGNoaW5nRmlyc3RTZWdtZW50cyh3c2RsTG9jYXRpb25QYXRoKSk7Ci0gICAgICAgIAkKLSAgICAgICAgCWlmICh3c2RsTG9jYXRpb25QYXRoLmdldERldmljZSgpICE9IG51bGwpIHsKLSAgICAgICAgCSAgICB3c2RsTG9jYXRpb25QYXRoID0gd3NkbExvY2F0aW9uUGF0aC5zZXREZXZpY2UobnVsbCk7Ci0gICAgICAgIAl9Ci0gICAgICAgIAltb2RlbC5zZXRXc2RsRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICAgICAgCW1vZGVsLnNldENvbmZpZ1dzZGxMb2NhdGlvbih3c2RsTG9jYXRpb25QYXRoLnRvU3RyaW5nKCkpOwotICAgICAgICAJCi0gCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gCQkJc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0JCQlDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiB1cmlzZSkgewotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDb3JlUGx1Z2luLlBMVUdJTl9JRCwgdXJpc2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCUNYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKSB7Ci0JCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELCBtdXJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhtdXJsZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDb3JlUGx1Z2luLlBMVUdJTl9JRCwgaW9lLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQlDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKGlvZSk7Ci0JCX0KLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIod2ViQ29udGVudENoYW5nZUxpc3RlbmVyKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHNldFdTRExMb2NhdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gV1NETFV0aWxzLmdldFdTRExMb2NhdGlvbihkZWZpbml0aW9uKTsKLSAgICAgICAgaWYgKHdzZGxMb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtb2RlbC5zZXRXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRUTlNPbk1vZGVsKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gV1NETFV0aWxzLmdldFBhY2thZ2VOYW1lRnJvbU5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICBtb2RlbC5zZXRUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgbW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkucHV0KHRhcmdldE5hbWVzcGFjZSwgcGFja2FnZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBXU0RMMkphdmFEYXRhTW9kZWwgZ2V0V1NETDJKYXZhRGF0YU1vZGVsKCkgewotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIExpc3Q8SVJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxJUmVzb3VyY2U+KCk7Ci0gICAgICAgIGNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOwotICAgICAgICBpZiAoY2hhbmdlZFJlc291cmNlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKElSZXNvdXJjZSByZXNvdXJjZSA6IGNoYW5nZWRSZXNvdXJjZXMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5kZWxldGUodHJ1ZSwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbW9kZWwuZ2V0QmluZGluZ0ZpbGVzKCkuY2xlYXIoKTsKLSAgICAgICAgbW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkuY2xlYXIoKTsKLSAgICAgICAKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNDE2YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5TdGF0dXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIHN0b3AgZ2FwIHdvcmthcm91bmQgZm9yIGJ1Z3MgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MzI4NiI+IzI0MzI4NjwvYT4KLSAqIGFuZCA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQzMjkwIj4jMjQzMjkwPC9hPgotICogCi0gKgotICovCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbkNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0JcHJpdmF0ZSBXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWw7Ci0JcHJpdmF0ZSBJUHJvamVjdCBpbml0aWFsUHJvamVjdDsKLQlwcml2YXRlIElQcm9qZWN0IHNlcnZlclByb2plY3Q7Ci0JcHJpdmF0ZSBJUHJvamVjdCBjdXJyZW50UHJvamVjdDsKLQkKLQlwdWJsaWMgV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbkNvbW1hbmQoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotCQlpZiAoY3VycmVudFByb2plY3QgPT0gbnVsbCAmJiBpbml0aWFsUHJvamVjdCA9PSBudWxsICYmIHNlcnZlclByb2plY3QgIT0gbnVsbCkgewotCQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCW1vZGVsLnNldFByb2plY3ROYW1lKHNlcnZlclByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJCi0JCWlmIChjdXJyZW50UHJvamVjdCA9PSBudWxsICYmIGluaXRpYWxQcm9qZWN0ICE9IG51bGwgJiYgIWluaXRpYWxQcm9qZWN0LmVxdWFscyhzZXJ2ZXJQcm9qZWN0KSkgewotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELCBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5iaW5kKAotCQkJCQlDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5XU0RMMkpBVkFfUFJPSkVDVF9TRUxFQ1RJT05fRVJST1IsIG5ldyBPYmplY3RbXXsKLQkJCQkJCQlzZXJ2ZXJQcm9qZWN0LmdldE5hbWUoKSwgaW5pdGlhbFByb2plY3QuZ2V0TmFtZSgpfSkpOwotCQl9IGVsc2UgaWYgKGluaXRpYWxQcm9qZWN0ID09IG51bGwgJiYgY3VycmVudFByb2plY3QgIT0gbnVsbCAmJiAhY3VycmVudFByb2plY3QuZXF1YWxzKHNlcnZlclByb2plY3QpKSB7IAotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELCBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5XU0RMMkpBVkFfUFJPSkVDVF9TRUxFQ1RJT05fRVJST1IsIG5ldyBPYmplY3RbXXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJQcm9qZWN0LmdldE5hbWUoKSwgY3VycmVudFByb2plY3QuZ2V0TmFtZSgpfSkpOwotCQl9IGVsc2UgaWYgKGluaXRpYWxQcm9qZWN0ICE9IG51bGwgJiYgY3VycmVudFByb2plY3QgIT0gbnVsbCAmJiAhY3VycmVudFByb2plY3QuZXF1YWxzKHNlcnZlclByb2plY3QpKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgQ1hGQ29yZVBsdWdpbi5QTFVHSU5fSUQsIENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLldTREwySkFWQV9QUk9KRUNUX1NFTEVDVElPTl9FUlJPUiwgbmV3IE9iamVjdFtdewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclByb2plY3QuZ2V0TmFtZSgpLCBjdXJyZW50UHJvamVjdC5nZXROYW1lKCl9KSk7Ci0JCX0gZWxzZSB7IAotCQkgICAgbW9kZWwuc2V0UHJvamVjdE5hbWUoc2VydmVyUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLQkJCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJCi0JCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJdHJ5IHsKLQkJCQlnZXRFbnZpcm9ubWVudCgpLmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzKTsKLQkJCX0gY2F0Y2ggKFN0YXR1c0V4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLQkvKgotCSAqIFRoZSB2YWx1ZSB0byB0ZXN0IGFnYWluc3QuIE1ha2Ugc3VyZSB0aGUgIlNlcnZpY2UgUHJvamVjdCIKLQkgKiBhbmQgdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB0aGUgd3NkbCBmaWxlIG1hdGNoLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZlclByb2plY3QoSVByb2plY3Qgc2VydmVyUHJvamVjdCkgewotCQl0aGlzLnNlcnZlclByb2plY3QgPSBzZXJ2ZXJQcm9qZWN0OwotCX0KLQkKLQkvKgotCSAqIAotCSAqIFRoZSBpbml0aWFsIHByb2plY3Qgd2lsbCBiZSBudWxsIHdoZW4gdGhlcmUncyBub3RoaW5nIHNlbGVjdGVkIGluIHRoZSBwcm9qZWN0IGV4cGxvcmVyCi0JICogVGhpcyBmb3JjZXMgdGhlIHVzZXIgdG8gbWFrZSBhIHNlbGVjdGlvbiB0aHVzIHNldHRpbmcgdGhlIHByb2plY3QgY3VycmVudCBwcm9qZWN0Ci0JICogYmVsb3cuCi0JICogCi0JICogSWYgdGhlcmUgd2FzIGFuIGluaXRpYWwgc2VsZWN0aW9uIGFuZCB0aGUgdXNlciBjaGFuZ2VzIGZyb20gb25lIHRvcCBkb3duIHNlcnZpY2UKLQkgKiB0eXBlIHRvIGFub3RoZXIgdGhlbiB3ZSBoYWQgdG8gY2hlY2suCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzLmluaXRpYWxQcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0JCi0JLyoKLQkgKiBJZiB0aGVyZSB3YXMgYW4gaW5pdGlhbCBzZWxlY3Rpb24gaW4gdGhlIHByb2plY3QgZXhwbG9yZXIgdGhlIGFib3ZlIHZhbHVlIGlzIHNldCBhbmQKLQkgKiB0aGlzIGlzIHNldCB0byBudWxsLgotCSAqIAotCSAqIFRoaXMgd2lsbCBjaGFuZ2UgaG93ZXZlciBpZiB0aGUgdXNlciBtb2RpZmllcyB0aGUgdGV4dCBmaWVsZCBvciBicm93c2VzIGZvciBhCi0JICogd3NkbCBmaWxlLiBVcG9uIHNlbGVjdGluZyBhIGZpbGUgaW4gYSB2YWxpZCBsb2NhdGlvbiwgdGhpcyB2YWx1ZSBnZXRzIHNldC4KLQkgKiBObyBwcm9ibGVtIGluIHRoYXQgc2l0dWF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCSAgICB0aGlzLmN1cnJlbnRQcm9qZWN0ID0gcHJvamVjdDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MzBjYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzI1M2U3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYWRkMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI0ZyaSBOb3YgMDcgMjM6NTg6NTUgRVNUIDIwMDgKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGM5MGYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuNC4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndzcnQ7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMjA0LDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNC4zIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuMy41IiwKLSBvcmcuZWNsaXBzZS53c3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aTtidW5kbGUtdmVyc2lvbj0iMC4zLjUiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWk7YnVuZGxlLXZlcnNpb249IjAuMy4zIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnY7YnVuZGxlLXZlcnNpb249IlsxLjAuMzA1LDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cztidW5kbGUtdmVyc2lvbj0iWzEuMC4zMDQsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNS4wIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZTtidW5kbGUtdmVyc2lvbj0iMC41LjAiLAotIG9yZy5lY2xpcHNlLmVtZi5jb21tb247YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIGphdmF4LndzZGw7YnVuZGxlLXZlcnNpb249IlsxLjYuMiwxLjcuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS43LjAKLUNyZWF0ZWQtQnk6IDEuNS4wXzE0LWIwMyAoU3VuIE1pY3Jvc3lzdGVtcyBJbmMuKQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1JbXBvcnQtUGFja2FnZTogamF2YXguandzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE2OWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPlNlcHRlbWJlciAxMiwgMjAwODwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZjI5NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2ljb25zL29iajE2L2Rpc2FibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9pY29ucy9vYmoxNi9kaXNhYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNDJlNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2ljb25zL29iajE2L2Rpc2FibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9pY29ucy9vYmoxNi9mYWxzZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvaWNvbnMvb2JqMTYvZmFsc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmQ5YjBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9pY29ucy9vYmoxNi9mYWxzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvaWNvbnMvb2JqMTYvdHJ1ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvaWNvbnMvb2JqMTYvdHJ1ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYWNiOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2ljb25zL29iajE2L3RydWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjUyYjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUNYRiBXZWIgU2VydmljZXMgQ3JlYXRpb24gVUkgKEluY3ViYXRpb24pCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi1DWEZfV1NfUlVOVElNRV9MQUJFTD1BcGFjaGUgQ1hGIDIueApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTA1MjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5ydW50aW1lcyI+Ci0gICAgICA8cnVudGltZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jeGZXZWJTZXJ2aWNlUlQiCi0gICAgICAgIGxhYmVsPSIlQ1hGX1dTX1JVTlRJTUVfTEFCRUwiCi0gICAgICAgIHNlcnZlclJlcXVpcmVkPSJmYWxzZSIvPgotICAgIDwvZXh0ZW5zaW9uPgotCi0JPCEtLSBkZWZpbmUgc3VwcG9ydCBmb3IgQ1hGIEpBWC1XUyBKYXZhIEZpcnN0IGFuZCBXU0RMIEZpcnN0IGluIHdlYiBwcm9qZWN0cyAtLT4KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuc2VydmljZVJ1bnRpbWVzIj4KLSAgICAgIDxzZXJ2aWNlUnVudGltZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5qYXZhIiAKLSAgICAgICAgc2VydmljZUltcGxlbWVudGF0aW9uVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Qud3Mud3NJbXBsLmphdmEiCi0gICAgICAgIHJ1bnRpbWVJZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jeGZXZWJTZXJ2aWNlUlQiCi0gICAgICAgIGJvdHRvbVVwPSJ0cnVlIgotICAgICAgICB0b3BEb3duPSJ0cnVlIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53c3J0LkNYRldlYlNlcnZpY2VSdW50aW1lIj4KLQotICAgICAgICA8cmVxdWlyZWQtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LndlYiIgdmVyc2lvbj0iMi40IiBhbGxvdy1uZXdlcj0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWQtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LmphdmEiIHZlcnNpb249IjUuMCIgYWxsb3ctbmV3ZXI9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkLWZhY2V0LXZlcnNpb24gZmFjZXQ9ImN4Zi5jb3JlIiB2ZXJzaW9uPSIxLjAiIGFsbG93LW5ld2VyPSJ0cnVlIi8+Ci0gICAgICA8L3NlcnZpY2VSdW50aW1lPgotICAgIDwvZXh0ZW5zaW9uPgotCi0gICAgPCEtLSBkZWZpbmUgc3VwcG9ydCBmb3IgQ1hGIEphdmEgY2xpZW50cyBpbiBXZWIgcHJvamVjdHMgLS0+Ci0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFJ1bnRpbWVzIj4KLSAgICAgICA8Y2xpZW50UnVudGltZQotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLndlYiIKLSAgICAgICAgICBjbGllbnRJbXBsZW1lbnRhdGlvblR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LndzLmNsaWVudC50eXBlLmphdmEiCi0gICAgICAgICAgcnVudGltZUlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmN4ZldlYlNlcnZpY2VSVCIKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53c3J0LkNYRldlYlNlcnZpY2VSdW50aW1lIj4KLQotICAgICAgICAgIDxyZXF1aXJlZC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqc3Qud2ViIiB2ZXJzaW9uPSIyLjQiIGFsbG93LW5ld2VyPSJ0cnVlIi8+Ci0gICAgICAgICAgPHJlcXVpcmVkLWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSI1LjAiIGFsbG93LW5ld2VyPSJ0cnVlIi8+Ci0gICAgICAgICAgPHJlcXVpcmVkLWZhY2V0LXZlcnNpb24gZmFjZXQ9ImN4Zi5jb3JlIiB2ZXJzaW9uPSIxLjAiIGFsbG93LW5ld2VyPSJ0cnVlIi8+Ci0gICAgICAgPC9jbGllbnRSdW50aW1lPgotICAgIDwvZXh0ZW5zaW9uPiAKLSAgICAKLSAgICA8IS0tIGJ1Z3MgIzI0MzI4NiAjMjQzMjkwIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRSZWdpc3RyeSI+Ci0gICAgICAgPHdpZGdldEZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzLldTREwySmF2YVByb2plY3RTZWxlY3Rpb25XaWRnZXRGYWN0b3J5IgotICAgICAgICAgICAgIGlkPSJQcm9qZWN0U2VsZWN0aW9uQ29uZmlnIgotICAgICAgICAgICAgIGluc2VydEJlZm9yZUNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kIi8+Ci0gICAgPC9leHRlbnNpb24+IAotCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Ij4KLSAgICAgICA8d2lkZ2V0RmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHMuSmF2YTJXU1NlbGVjdFNFSVdpZGdldEZhY3RvcnkiCi0gICAgICAgICAgICAgaWQ9IkphdmEyV1NQcmVDaGVja0NvbmZpZyIKLSAgICAgICAgICAgICBpbnNlcnRCZWZvcmVDb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5KYXZhMldTU2VsZWN0U0VJQ29tbWFuZCI+Ci0gICAgICAgPC93aWRnZXRGYWN0b3J5PgotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Ij4KLSAgICAgICA8d2lkZ2V0RmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHMuSkFYV1NBbm5vdGF0ZVdpZGdldEZhY3RvcnkiCi0gICAgICAgICAgICAgaWQ9IkpBWFdTQW5ub3RhdGVDb25maWciCi0gICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSkFYV1NBbm5vdGF0ZUphdmFDb21tYW5kIj4KLSAgICAgICA8L3dpZGdldEZhY3Rvcnk+Ci0gICAgPC9leHRlbnNpb24+Ci0gCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Ij4KLSAgICAgICA8d2lkZ2V0RmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHMuSmF2YTJXU0NvbmZpZ1dpZGdldEZhY3RvcnkiCi0gICAgICAgICAgICAgaWQ9IkphdmEyV1NDb25maWciCi0gICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0NvbW1hbmQiPgotICAgICAgIDwvd2lkZ2V0RmFjdG9yeT4KLSAgICA8L2V4dGVuc2lvbj4KLSAgICAKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0UmVnaXN0cnkiPgotICAgICAgIDx3aWRnZXRGYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0cy5XU0RMMkphdmFDb25maWdXaWRnZXRGYWN0b3J5IgotICAgICAgICAgICAgIGlkPSJXU0RMMkphdmFDb25maWciCi0gICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCI+Ci0gICAgICAgPC93aWRnZXRGYWN0b3J5PgotICAgIDwvZXh0ZW5zaW9uPgotICAgCi0gPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkM2E0NDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL0NYRkNyZWF0aW9uVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBDWEZDcmVhdGlvblVJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IAotICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJbWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19FTlRFUl9TRUlfTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1NFTEVDVF9TRUlfRVhUUkFDVEVEX01FVEhPRFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfU0VJX01FU1NBR0U7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfU0VJX09QVElPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1NFTEVDVF9TRUlfRElBTE9HX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX1NFSV9ESUFMT0dfREVTQ1JJUFRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfU0VJX1dFQlNFUlZJQ0VfTkFNRV9BVFRSSUJVVEVfUFJFU0VOVDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1NFTEVDVF9JTVBMX0RJQUxPR19USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1NFTEVDVF9JTVBMX0RJQUxPR19ERVNDUklQVElPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0VOVEVSX1ZBTElEX1dTRExfTkFNRTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfQ0xBU1NfQ09ORklHX1BBR0VfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19DTEFTU19DT05GSUdfUEFHRV9ERVNDUklQVElPTjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfSU5URVJGQUNFX0NPTkZJR19QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfSU5URVJGQUNFX0NPTkZJR19QQUdFX0RFU0NSSVBUSU9OOwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfSkFYV1NfQU5OT1RBVEVfUEFHRV9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0pBWFdTX0FOTk9UQVRFX1BBR0VfREVTQ1JJUFRJT047Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfUEFHRV9ERVNDUklQVElPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19BTk5PVEFURV9KSkFWQV9XSURHRVRfUFJFVklFVzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19BTk5PVEFURV9KSkFWQV9XSURHRVRfU0VMRUNUX01FVEhPRF9UT19BTk5PVEFURTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9QQUdFX0RFU0NSSVBUSU9OOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0RFRkFVTFRTX1BBR0VfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0RFRkFVTFRTX1BBR0VfREVTQ1JJUFRJT047Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dST1VQX0xBQkVMOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0dST1VQX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YSkNfQVJHX0dST1VQX0xBQkVMOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9NVVNUX0lNUExFTUVOVDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX0ZPVU5EOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfSU1QTEVNRU5UQVRJT05fTk9UX0ZPVU5EOwotICAgIAotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0gICAgICAgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDWEZDcmVhdGlvblVJTWVzc2FnZXMoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL0NYRkNyZWF0aW9uVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9DWEZDcmVhdGlvblVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiY2ZlNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL0NYRkNyZWF0aW9uVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1hGQ3JlYXRpb25VSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0gICAgLy8gVGhlIHBsdWctaW4gSUQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICBwcml2YXRlIHN0YXRpYyBDWEZDcmVhdGlvblVJUGx1Z2luIHBsdWdpbjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBDWEZDcmVhdGlvblVJUGx1Z2luKCkgewotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIHBsdWdpbiA9IHRoaXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcGx1Z2luID0gbnVsbDsKLSAgICAgICAgc3VwZXIuc3RvcChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENYRkNyZWF0aW9uVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLSAgICAgICAgcmV0dXJuIHBsdWdpbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbiBwbHVnLWluCi0gICAgICogcmVsYXRpdmUgcGF0aAotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXRoCi0gICAgICogICAgICAgICAgICB0aGUgcGF0aAotICAgICAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBwYXRoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKG5ldyBTdGF0dXMoc2V2ZXJpdHksIENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICBleGNlcHRpb24udG9TdHJpbmcoKSwgZXhjZXB0aW9uKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL0NYRkNyZWF0aW9uVUltZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL0NYRkNyZWF0aW9uVUltZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2U0MmQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9DWEZDcmVhdGlvblVJbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jSmF2YTJXUyBQcmUgQ29uZmlnIFdpZGdldCBGYWN0b3J5Ci1KQVZBMldTX0NMQVNTX0NPTkZJR19QQUdFX1RJVExFPXswfSB7MX0gV2ViIFNlcnZpY2UgSmF2YSBDbGFzcyBTdGFydGluZyBQb2ludCBDb25maWd1cmF0aW9uCi1KQVZBMldTX0NMQVNTX0NPTkZJR19QQUdFX0RFU0NSSVBUSU9OPVNlbGVjdCBhbiBleGlzdGluZyBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSAoU0VJKSBvciBjcmVhdGUgYW4gU0VJIGJ5IGV4dHJhY3RpbmcgYW4gaW50ZXJmYWNlIGZyb20gdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzLgotCi1KQVZBMldTX0lOVEVSRkFDRV9DT05GSUdfUEFHRV9USVRMRT17MH0gezF9IFdlYiBTZXJ2aWNlIEphdmEgSW50ZXJmYWNlIFN0YXJ0aW5nIFBvaW50IENvbmZpZ3VyYXRpb24KLUpBWFdTX0FOTk9UQVRFX0pKQVZBX1dJREdFVF9QUkVWSUVXPVByZXZpZXc6Ci1KQVZBMldTX0lOVEVSRkFDRV9DT05GSUdfUEFHRV9ERVNDUklQVElPTj1TZWxlY3QgYW4gaW1wbGVtZW50YXRpb24gdGhhdCBpbXBsZW1lbnRzIGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUgU0VJLgotCi0jSmF2YTJXUyBDb25maWcgV2lkZ2V0IEZhY3RvcnkKLUpBVkEyV1NfSkFYV1NfQU5OT1RBVEVfUEFHRV9USVRMRT17MH0gezF9IFdlYiBTZXJ2aWNlIEpBWC1XUyBBbm5vdGF0aW9ucyBDb25maWd1cmF0aW9uCi1KQVZBMldTX0pBWFdTX0FOTk9UQVRFX1BBR0VfREVTQ1JJUFRJT049T3B0aW9uYWxseSwgc2VsZWN0IHRoZSBKQVgtV1MgQW5ub3RhdGlvbnMgdG8gYWRkLgotCi1KQVZBMldTX1BBR0VfVElUTEU9ezB9IHsxfSBXZWIgU2VydmljZSBKYXZhMldTIENvbmZpZ3VyYXRpb24KLUpBVkEyV1NfUEFHRV9ERVNDUklQVElPTj1Db25maWd1cmUgdGhlIHswfSBKYXZhIHRvIFdTIG9wdGlvbnMuCi0KLSNXU0RMMkphdmEgQ29uZmlnIFdpZGdldCBGYWN0b3J5Ci1XU0RMMkpBVkFfUEFHRV9USVRMRT17MH0gezF9IFdlYiBTZXJ2aWNlIFdTREwySmF2YSBDb25maWd1cmF0aW9uCi1XU0RMMkpBVkFfUEFHRV9ERVNDUklQVElPTj1Db25maWd1cmUgdGhlIHswfSBXU0RMIHRvIEphdmEgb3B0aW9ucy4KLQotV1NETDJKQVZBX0RFRkFVTFRTX1BBR0VfVElUTEU9ezB9IHsxfSBXZWIgU2VydmljZSBXU0RMMkphdmEgQ29uZmlndXJhdGlvbgotV1NETDJKQVZBX0RFRkFVTFRTX1BBR0VfREVTQ1JJUFRJT049VGhlIHBhZ2UgYWxsb3dzIHRoZSBvdmVycmlkaW5nIG9mIHRoZSBkZWZhdWx0IHByZWZlcmVuY2VzIGZvciB0aGlzIFdlYiBTZXJ2aWNlIGdlbmVyYXRpb24uCi0KLSNKYXZhMldTIENvbmZpZyBXaWRnZXQKLUpBVkEyV1NfR1JPVVBfTEFCRUw9SmF2YTJXUyBHZW5lcmF0aW9uIE9wdGlvbnM6Ci0KLUpBVkEyV1NfRU5URVJfU0VJX05BTUU9UGxlYXNlIGVudGVyIHRoZSBuYW1lIG9mIHRoZSBTRUkgdG8gZXh0cmFjdAotSkFWQTJXU19TRUxFQ1RfU0VJX0VYVFJBQ1RFRF9NRVRIT0RTPVBsZWFzZSBzZWxlY3QgdGhlIG1ldGhvZHMgeW91IHdpc2ggdG8gZXh0cmFjdCBmcm9tIHRoZSB7MH0gY2xhc3MKLUpBVkEyV1NfU0VMRUNUX1NFSV9NRVNTQUdFPVBsZWFzZSBzZWxlY3QgYSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQotSkFWQTJXU19TRUxFQ1RfU0VJX09QVElPTj1QbGVhc2Ugc2VsZWN0IGFuIFNFSSBvcHRpb24KLUpBVkEyV1NfU0VMRUNUX1NFSV9ESUFMT0dfVElUTEU9U2VsZWN0IFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlCi1KQVZBMldTX1NFTEVDVF9TRUlfRElBTE9HX0RFU0NSSVBUSU9OPVNlbGVjdCB0aGUgSW50ZXJmYWNlIHRvIHVzZSBhcyB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLUpBVkEyV1NfU0VMRUNUX1NFSV9XRUJTRVJWSUNFX05BTUVfQVRUUklCVVRFX1BSRVNFTlQ9SW1wbGVtZW50YXRpb24gY2xhc3MgY29udGFpbnMgYW4gQFdlYlNlcnZpY2UgYW5ub3RhdGlvbiB3aXRoIGEgbmFtZSBhdHRyaWJ1dGUgd2hpY2ggY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggYW4gZW5kcG9pbnRJbnRlcmZhY2UgYXR0cmlidXRlCi1KQVZBMldTX1NFTEVDVF9JTVBMX0RJQUxPR19USVRMRT1TZWxlY3QgYW4gSW1wbGVtZW50YXRpb24KLUpBVkEyV1NfU0VMRUNUX0lNUExfRElBTE9HX0RFU0NSSVBUSU9OPVNlbGVjdCB0aGUgSW1wbGVtZW50YXRpb24gdG8gdXNlIGZvciB0aGUgV2ViIFNlcnZpY2UKLQotSkFWQTJXU19FTlRFUl9WQUxJRF9XU0RMX05BTUU9UGxlYXNlIGVudGVyIGEgdmFsaWQgV1NETCBGaWxlIG5hbWUKLQotI1dTREwySmF2YSBEZWZhdWx0cyBDb25maWcgV2lkZ2V0Ci1XU0RMMkpBVkFfR1JPVVBfTEFCRUw9V1NETDJKYXZhIEdlbmVyYXRpb24gT3B0aW9ucwotV1NETDJKQVZBX1hKQ19BUkdfR1JPVVBfTEFCRUw9WEpDIEFyZ3VtZW50cwotSkFYV1NfQU5OT1RBVEVfSkpBVkFfV0lER0VUX1NFTEVDVF9NRVRIT0RfVE9fQU5OT1RBVEU9U2VsZWN0IHRoZSBNZXRob2RzIHRvIGFubm90YXRlOgotCi1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTVVTVF9JTVBMRU1FTlQ9SW1wbGVtZW50YXRpb24gY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIFNFSSBtZXRob2QgJyd7MH0nJwotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9GT1VORD1UaGUgZW5kcG9pbnRJbnRlcmZhY2UgJyd7MH0nJyBjYW5ub3QgYmUgZm91bmQKLVdFQlNFUlZJQ0VfSU1QTEVNRU5UQVRJT05fTk9UX0ZPVU5EPVRoZSBJbXBsZW1lbnRhdGlvbiAnJ3swfScnIGNhbm5vdCBiZSBmb3VuZApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3NlbGVjdGlvbi9JU3RydWN0dXJlZFNlbGVjdGlvblRvSVByb2plY3RUcmFuc2Zvcm1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3NlbGVjdGlvbi9JU3RydWN0dXJlZFNlbGVjdGlvblRvSVByb2plY3RUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDU0NjY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9zZWxlY3Rpb24vSVN0cnVjdHVyZWRTZWxlY3Rpb25Ub0lQcm9qZWN0VHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcjsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBJU3RydWN0dXJlZFNlbGVjdGlvblRvSVByb2plY3RUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyIHsKLQotICAgIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2YWx1ZTsKLSAgICAgICAgT2JqZWN0IGZpcnN0RWxlbWVudCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGlmIChmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGZpcnN0RWxlbWVudDsKLSAgICAgICAgICAgIHJldHVybiByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvdmlld2Vycy9Bbm5vdGF0aW9uQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3ZpZXdlcnMvQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYyN2QwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvdmlld2Vycy9Bbm5vdGF0aW9uQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBDb2x1bW5MYWJlbFByb3ZpZGVyIHsKLSAgICBwcml2YXRlIEltYWdlIGFkZEFubm90YXRpb25JbWFnZTsKLSAgICBwcml2YXRlIEltYWdlIHJlbW92ZUFubm90YXRpb25JbWFnZTsKLSAgICBwcml2YXRlIEltYWdlIGRpc2FibGVkOwotCi0gICAgcHJpdmF0ZSBNYXA8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+IG1ldGhvZE1hcDsKLSAgICBwcml2YXRlIFN0cmluZyBhbm5vdGF0aW9uS2V5OwotICAgIHByaXZhdGUgSVR5cGUgdHlwZTsKLQotICAgIHB1YmxpYyBBbm5vdGF0aW9uQ29sdW1uTGFiZWxQcm92aWRlcihKYXZhMldTRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgYW5ub3RhdGlvbktleSwgSVR5cGUgdHlwZSkgewotICAgICAgICB0aGlzLm1ldGhvZE1hcCA9IG1vZGVsLmdldE1ldGhvZE1hcCgpOwotICAgICAgICB0aGlzLmFubm90YXRpb25LZXkgPSBhbm5vdGF0aW9uS2V5OwotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICBhZGRBbm5vdGF0aW9uSW1hZ2UgPSBDWEZDcmVhdGlvblVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgImljb25zL29iajE2L3RydWUuZ2lmIikuY3JlYXRlSW1hZ2UoKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZW1vdmVBbm5vdGF0aW9uSW1hZ2UgPSBDWEZDcmVhdGlvblVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgImljb25zL29iajE2L2ZhbHNlLmdpZiIpLmNyZWF0ZUltYWdlKCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZGlzYWJsZWQgPSBDWEZDcmVhdGlvblVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgImljb25zL29iajE2L2Rpc2FibGVkLmdpZiIpLmNyZWF0ZUltYWdlKCk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU291cmNlTWV0aG9kKSB7Ci0gICAgICAgICAgICBpZiAobWV0aG9kTWFwID09IG51bGwgfHwgYW5ub3RhdGlvbktleSA9PSBudWxsIHx8IHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IChTb3VyY2VNZXRob2QpIGVsZW1lbnQ7Ci0KLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uS2V5LmVxdWFscyhDWEZNb2RlbFV0aWxzLldFQl9QQVJBTSkpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TWV0aG9kUGFyYW1ldGVycyh0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kKTsKLQotICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXNhYmxlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHBhcmFtZXRlciwgYW5ub3RhdGlvbktleSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXNhYmxlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgYW5ub3RhdGlvbktleSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGlzYWJsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtZXRob2RNYXAuZ2V0KG1ldGhvZCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEJvb2xlYW4gYWRkQW5ub3RhdGlvbiA9ICBtZXRob2RNYXAuZ2V0KG1ldGhvZCkuZ2V0KGFubm90YXRpb25LZXkpOwotICAgICAgICAgICAgICAgIGlmIChhZGRBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhZGRBbm5vdGF0aW9uSW1hZ2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlbW92ZUFubm90YXRpb25JbWFnZTsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgYWRkQW5ub3RhdGlvbkltYWdlLmRpc3Bvc2UoKTsKLSAgICAgICAgcmVtb3ZlQW5ub3RhdGlvbkltYWdlLmRpc3Bvc2UoKTsKLSAgICAgICAgZGlzYWJsZWQuZGlzcG9zZSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSkFYV1NBbm5vdGF0ZUphdmFXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0pBWFdTQW5ub3RhdGVKYXZhV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5M2U4Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSkFYV1NBbm5vdGF0ZUphdmFXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5KYXZhUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5qYXZhZWRpdG9yLkphdmFTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuU2ltcGxlSmF2YVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5JQ29sb3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LklKYXZhUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5KYXZhVGV4dFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5GaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5FZGl0aW5nU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkudmlld2Vycy5Bbm5vdGF0aW9uQ29sdW1uTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKQVhXU0Fubm90YXRlSmF2YVdpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciB7Ci0gICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgcHJpdmF0ZSBJVHlwZSB0eXBlOwotICAgIHByaXZhdGUgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIFRyZWVWaWV3ZXIgamF2YVRyZWVWaWV3ZXI7Ci0gICAgcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgYW5ub3RhdGlvblByZXZpZXdWaWV3ZXI7Ci0KLSAgICBwcml2YXRlIFRyZWVWaWV3ZXJDb2x1bW4gd2ViTWV0aG9kVmlld2VyQ29sdW1uOwotICAgIHByaXZhdGUgVHJlZVZpZXdlckNvbHVtbiB3ZWJQYXJhbVZpZXdlckNvbHVtbjsKLSAgICBwcml2YXRlIFRyZWVWaWV3ZXJDb2x1bW4gcmVxdWVzdFdyYXBwZXJWaWV3ZXJDb2x1bW47Ci0gICAgcHJpdmF0ZSBUcmVlVmlld2VyQ29sdW1uIHJlc3BvbmNlV3JhcHBlclZpZXdlckNvbHVtbjsKLSAgICAKLSAgICBwdWJsaWMgSkFYV1NBbm5vdGF0ZUphdmFXaWRnZXQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YTJXU0RhdGFNb2RlbChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpIHsKLSAgICAgICAgU2FzaEZvcm0gc2FzaEZvcm0gPSBuZXcgU2FzaEZvcm0ocGFyZW50LCBTV1QuVkVSVElDQUwgfCBTV1QuU01PT1RIKTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHNhc2hGb3JtLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAgICAgCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIHNhc2hGb3JtLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAKLSAgICAgICAgQ29tcG9zaXRlIGphdmFUcmVlY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzYXNoRm9ybSwgU1dULk5PTkUpOwotICAgICAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIGphdmFUcmVlY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBqYXZhVHJlZWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBMYWJlbCBvdXRsaW5lTGFiZWwgPSBuZXcgTGFiZWwoamF2YVRyZWVjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgb3V0bGluZUxhYmVsLnNldFRleHQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBWFdTX0FOTk9UQVRFX0pKQVZBX1dJREdFVF9TRUxFQ1RfTUVUSE9EX1RPX0FOTk9UQVRFKTsKLQotICAgICAgICBUcmVlIGphdmFUcmVlID0gbmV3IFRyZWUoamF2YVRyZWVjb21wb3NpdGUsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwKLSAgICAgICAgICAgICAgICB8IFNXVC5IX1NDUk9MTCk7Ci0gICAgICAgIGphdmFUcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoamF2YVRyZWUpOwotCi0gICAgICAgIGphdmFUcmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhlaWdodEhpbnQgPSAxMDsKLSAgICAgICAgZ3JpZERhdGEud2lkdGhIaW50ID0gMjAwOwotICAgICAgICBqYXZhVHJlZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBUcmVlVmlld2VyQ29sdW1uIGNsYXNzVmlld2VyQ29sdW1uID0gbmV3IFRyZWVWaWV3ZXJDb2x1bW4oamF2YVRyZWVWaWV3ZXIsIFNXVC5OT05FKTsKLSAgICAgICAgVHJlZUNvbHVtbiBjbGFzc0NvbHVtbiA9IGNsYXNzVmlld2VyQ29sdW1uLmdldENvbHVtbigpOwotICAgICAgICBjbGFzc0NvbHVtbi5zZXRXaWR0aCgyMDApOwotICAgICAgICBjbGFzc0NvbHVtbi5zZXRNb3ZlYWJsZShmYWxzZSk7Ci0KLSAgICAgICAgZmluYWwgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyIGphdmFFbGVtZW50TGFiZWxQcm92aWRlciA9IG5ldyBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoKTsKLSAgICAgICAgY2xhc3NWaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQ29sdW1uTGFiZWxQcm92aWRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gamF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLmdldEltYWdlKGVsZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiBqYXZhRWxlbWVudExhYmVsUHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgamF2YVRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBTdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyKHRydWUpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgSVR5cGVbXSB0eXBlcyA9IGNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJVHlwZSB0eXBlIDogdHlwZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIElUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10ge3R5cGV9OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElUeXBlIHNvdXJjZVR5cGUgPSAoSVR5cGUpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PElNZXRob2Q+IHB1YmxpY01ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PElNZXRob2Q+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJTWV0aG9kW10gbWV0aG9kcyA9IHNvdXJjZVR5cGUuZ2V0TWV0aG9kcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZVR5cGUuaXNJbnRlcmZhY2UoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2RzOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VUeXBlLmlzQ2xhc3MoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSU1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChKRFRVdGlscy5pc1B1YmxpY01ldGhvZChtZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNNZXRob2RzLmFkZChtZXRob2QpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHB1YmxpY01ldGhvZHMudG9BcnJheShuZXcgT2JqZWN0W3B1YmxpY01ldGhvZHMuc2l6ZSgpXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0NISUxEUkVOOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGphdmFUcmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJVHJlZVNlbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICBJVHJlZVNlbGVjdGlvbiB0cmVlU2VsZWN0aW9uID0gKFRyZWVTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBPYmplY3QgZmlyc3RFbGVtZW50ID0gdHJlZVNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIElEb2N1bWVudCBkb2N1bWVudCA9IGFubm90YXRpb25QcmV2aWV3Vmlld2VyLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIEZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyIGZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyID0gCi0gICAgICAgICAgICAgICAgICAgIAluZXcgRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIoZG9jdW1lbnQpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVR5cGUgc291cmNlVHlwZSA9IChJVHlwZSkgZmlyc3RFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtZW50TmFtZSA9IHNvdXJjZVR5cGUuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHJlZ2V4ID0gbmV3IFN0cmluZ0J1aWxkZXIoIlxcYnB1YmxpY1xcVysoPzpcXHcrXFxXKyl7MSwzfT8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQoZWxlbWVudE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4LmFwcGVuZCgiXFxiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJlZ2lvbiByZWdpb24gPSBmaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlci5maW5kKDAsIHJlZ2V4LnRvU3RyaW5nKCksIHRydWUsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5yZXZlYWxSYW5nZShyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTWV0aG9kIHNvdXJjZU1ldGhvZCA9IChJTWV0aG9kKSBmaXJzdEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVR5cGUgc291cmNlVHlwZSA9IChJVHlwZSkgc291cmNlTWV0aG9kLmdldFBhcmVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtZW50TmFtZSA9IHNvdXJjZU1ldGhvZC5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVnZXggPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VUeXBlLmlzQ2xhc3MoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQoIlxcYnB1YmxpYyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQoIlxcVysoPzpcXHcrXFxXKyl7MSwzfT8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQoZWxlbWVudE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4LmFwcGVuZCgiXFxzKj9cXChcXHMqPy4qPyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgCQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzID0gc291cmNlTWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcGFyYW10ZXJOYW1lcyA9IHNvdXJjZU1ldGhvZC5nZXRQYXJhbWV0ZXJOYW1lcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXguYXBwZW5kKCJcXHMqPyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBTaWduYXR1cmUudG9TdHJpbmcocGFyYW1ldGVyVHlwZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQodHlwZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQoIlxccyo/Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4LmFwcGVuZChwYXJhbXRlck5hbWVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJaWYgKGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICByZWdleC5hcHBlbmQoIlxccyo/LFxccyo/Lio/Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCX0KLQkJCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXguYXBwZW5kKCJcXHMqP1xcKSIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAJSVJlZ2lvbiByZWdpb24gPSBmaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlci5maW5kKDAsIHJlZ2V4LnRvU3RyaW5nKCksIHRydWUsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSZWdpb24gZWxlbWVudE5hbWVSZWdpb24gPSBmaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlci5maW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXJlZ2lvbi5nZXRPZmZzZXQoKSwgZWxlbWVudE5hbWUsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lUmVnaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWFubm90YXRpb25QcmV2aWV3Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZWxlbWVudE5hbWVSZWdpb24uZ2V0T2Zmc2V0KCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQllbGVtZW50TmFtZVJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5yZXZlYWxSYW5nZShlbGVtZW50TmFtZVJlZ2lvbi5nZXRPZmZzZXQoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWVsZW1lbnROYW1lUmVnaW9uLmdldExlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhibGUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhqbWUpOwotCQkJCQl9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBjcmVhdGVXZWJNZXRob2RWaWV3ZXJDb2x1bW4oamF2YVRyZWVWaWV3ZXIpOwotICAgICAgICBjcmVhdGVXZWJQYXJhbVZpZXdlckNvbHVtbihqYXZhVHJlZVZpZXdlcik7Ci0gICAgICAgIGNyZWF0ZVJlcXVlc3RXcmFwcGVyVmlld2VyQ29sdW1uKGphdmFUcmVlVmlld2VyKTsKLSAgICAgICAgY3JlYXRlUmVzcG9uc2VXcmFwcGVyVmlld2VyQ29sdW1uKGphdmFUcmVlVmlld2VyKTsKLQotICAgICAgICBqYXZhVHJlZVZpZXdlci5zZXRBdXRvRXhwYW5kTGV2ZWwoVHJlZVZpZXdlci5BTExfTEVWRUxTKTsKLSAgICAgICAgamF2YVRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIHByZXZpZXdDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNhc2hGb3JtLCBTV1QuTk9ORSk7Ci0gICAgICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgcHJldmlld0NvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgamF2YVRyZWVjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgTGFiZWwgcHJldmlld0xhYmVsID0gbmV3IExhYmVsKHByZXZpZXdDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgcHJldmlld0xhYmVsLnNldFRleHQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBWFdTX0FOTk9UQVRFX0pKQVZBX1dJREdFVF9QUkVWSUVXKTsKLQotICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlciA9IGNyZWF0ZUFubm90YXRpb25QcmV2aWV3ZXIocHJldmlld0NvbXBvc2l0ZSwgU1dULlJFQURfT05MWSB8IFNXVC5WX1NDUk9MTAotICAgICAgICAgICAgICAgIHwgU1dULkhfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhlaWdodEhpbnQgPSAxMDsKLSAgICAgICAgZ3JpZERhdGEud2lkdGhIaW50ID0gMjAwOwotICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIAotICAgICAgICBzYXNoRm9ybS5zZXRXZWlnaHRzKG5ldyBpbnRbXXs1MCwgNTB9KTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGludGVybmFsaXplKCkgewotICAgICAgICB0eXBlID0gbnVsbDsKLSAgICAgICAgdXBkYXRlTGFiZWxQcm92aWRlcnMoKTsKLSAgICAgICAgamF2YVRyZWVWaWV3ZXIuc2V0SW5wdXQoZ2V0VHlwZSgpLmdldFR5cGVSb290KCkpOwotICAgICAgICBqYXZhVHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgIGhhbmRsZUFubm90YXRpb24oZ2V0VHlwZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElUeXBlIGdldFR5cGUoKSB7Ci0gICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0eXBlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtb2RlbC5nZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgdHlwZSA9IEpEVFV0aWxzLmdldFR5cGUoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSksIG1vZGVsCi0gICAgICAgICAgICAgICAgICAgIC5nZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCkpOwotICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHR5cGUgPUpEVFV0aWxzLmdldFR5cGUoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSksIG1vZGVsCi0gICAgICAgICAgICAgICAgICAgIC5nZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHR5cGUgPSBKRFRVdGlscy5nZXRUeXBlKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KG1vZGVsLmdldFByb2plY3ROYW1lKCkpLCBtb2RlbAotICAgICAgICAgICAgICAgICAgICAuZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG1vZGVsLnNldE1ldGhvZE1hcChDWEZNb2RlbFV0aWxzLmdldE1ldGhvZE1hcCh0eXBlLCBtb2RlbCkpOwotCi0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFRyZWVWaWV3ZXJDb2x1bW4gY3JlYXRlV2ViTWV0aG9kVmlld2VyQ29sdW1uKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotICAgICAgICB3ZWJNZXRob2RWaWV3ZXJDb2x1bW4gPSBuZXcgVHJlZVZpZXdlckNvbHVtbih0cmVlVmlld2VyLCBTV1QuQ0VOVEVSKTsKLSAgICAgICAgVHJlZUNvbHVtbiB3ZWJNZXRob2RDb2x1bW4gPSB3ZWJNZXRob2RWaWV3ZXJDb2x1bW4uZ2V0Q29sdW1uKCk7Ci0gICAgICAgIHdlYk1ldGhvZENvbHVtbi5zZXRUZXh0KCJAIiArIENYRk1vZGVsVXRpbHMuV0VCX01FVEhPRCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgd2ViTWV0aG9kQ29sdW1uLnNldFdpZHRoKDEwMCk7Ci0gICAgICAgIHdlYk1ldGhvZENvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkNFTlRFUik7Ci0gICAgICAgIHdlYk1ldGhvZENvbHVtbi5zZXRNb3ZlYWJsZShmYWxzZSk7Ci0gICAgICAgIHdlYk1ldGhvZFZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBbm5vdGF0aW9uQ29sdW1uTGFiZWxQcm92aWRlcihtb2RlbCwKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLldFQl9NRVRIT0QsIGdldFR5cGUoKSkpOwotICAgICAgICB3ZWJNZXRob2RWaWV3ZXJDb2x1bW4uc2V0RWRpdGluZ1N1cHBvcnQobmV3IEFubm90YXRpb25FZGl0aW5nU3VwcG9ydCh0cmVlVmlld2VyLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuV0VCX01FVEhPRCkpOwotICAgICAgICByZXR1cm4gd2ViTWV0aG9kVmlld2VyQ29sdW1uOwotICAgIH0KLQotICAgIHByaXZhdGUgVHJlZVZpZXdlckNvbHVtbiBjcmVhdGVXZWJQYXJhbVZpZXdlckNvbHVtbihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLSAgICAgICAgd2ViUGFyYW1WaWV3ZXJDb2x1bW4gPSBuZXcgVHJlZVZpZXdlckNvbHVtbih0cmVlVmlld2VyLCBTV1QuQ0VOVEVSKTsKLSAgICAgICAgVHJlZUNvbHVtbiB3ZWJQYXJhbUNvbHVtbiA9IHdlYlBhcmFtVmlld2VyQ29sdW1uLmdldENvbHVtbigpOwotICAgICAgICB3ZWJQYXJhbUNvbHVtbi5zZXRUZXh0KCJAIiArIENYRk1vZGVsVXRpbHMuV0VCX1BBUkFNKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB3ZWJQYXJhbUNvbHVtbi5zZXRXaWR0aCgxMDApOwotICAgICAgICB3ZWJQYXJhbUNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkNFTlRFUik7Ci0gICAgICAgIHdlYlBhcmFtQ29sdW1uLnNldE1vdmVhYmxlKGZhbHNlKTsKLSAgICAgICAgd2ViUGFyYW1WaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIobW9kZWwsCi0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5XRUJfUEFSQU0sIGdldFR5cGUoKSkpOwotICAgICAgICB3ZWJQYXJhbVZpZXdlckNvbHVtbi5zZXRFZGl0aW5nU3VwcG9ydChuZXcgQW5ub3RhdGlvbkVkaXRpbmdTdXBwb3J0KHRyZWVWaWV3ZXIsCi0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5XRUJfUEFSQU0pKTsKLSAgICAgICAgcmV0dXJuIHdlYlBhcmFtVmlld2VyQ29sdW1uOwotICAgIH0KLQotICAgIHByaXZhdGUgVHJlZVZpZXdlckNvbHVtbiBjcmVhdGVSZXF1ZXN0V3JhcHBlclZpZXdlckNvbHVtbihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLSAgICAgICAgcmVxdWVzdFdyYXBwZXJWaWV3ZXJDb2x1bW4gPSBuZXcgVHJlZVZpZXdlckNvbHVtbih0cmVlVmlld2VyLCBTV1QuQ0VOVEVSKTsKLSAgICAgICAgVHJlZUNvbHVtbiBjcmVhdGVSZXF1ZXN0V3JhcHBlckNvbHVtbiA9IHJlcXVlc3RXcmFwcGVyVmlld2VyQ29sdW1uLmdldENvbHVtbigpOwotICAgICAgICBjcmVhdGVSZXF1ZXN0V3JhcHBlckNvbHVtbi5zZXRUZXh0KCJAIiArIENYRk1vZGVsVXRpbHMuUkVRVUVTVF9XUkFQUEVSKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjcmVhdGVSZXF1ZXN0V3JhcHBlckNvbHVtbi5zZXRXaWR0aCgxMDApOwotICAgICAgICBjcmVhdGVSZXF1ZXN0V3JhcHBlckNvbHVtbi5zZXRNb3ZlYWJsZShmYWxzZSk7Ci0gICAgICAgIHJlcXVlc3RXcmFwcGVyVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IEFubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyKG1vZGVsLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuUkVRVUVTVF9XUkFQUEVSLCBnZXRUeXBlKCkpKTsKLSAgICAgICAgcmVxdWVzdFdyYXBwZXJWaWV3ZXJDb2x1bW4uc2V0RWRpdGluZ1N1cHBvcnQobmV3IEFubm90YXRpb25FZGl0aW5nU3VwcG9ydCh0cmVlVmlld2VyLCAKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLlJFUVVFU1RfV1JBUFBFUikpOwotICAgICAgICByZXR1cm4gcmVxdWVzdFdyYXBwZXJWaWV3ZXJDb2x1bW47Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUcmVlVmlld2VyQ29sdW1uIGNyZWF0ZVJlc3BvbnNlV3JhcHBlclZpZXdlckNvbHVtbihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLSAgICAgICAgcmVzcG9uY2VXcmFwcGVyVmlld2VyQ29sdW1uID0gbmV3IFRyZWVWaWV3ZXJDb2x1bW4odHJlZVZpZXdlciwgU1dULkNFTlRFUik7Ci0gICAgICAgIFRyZWVDb2x1bW4gcmVzcG9uY2VXcmFwcGVyQ29sdW1uID0gcmVzcG9uY2VXcmFwcGVyVmlld2VyQ29sdW1uLmdldENvbHVtbigpOwotICAgICAgICByZXNwb25jZVdyYXBwZXJDb2x1bW4uc2V0VGV4dCgiQCIgKyBDWEZNb2RlbFV0aWxzLlJFU1BPTlNFX1dSQVBQRVIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJlc3BvbmNlV3JhcHBlckNvbHVtbi5zZXRXaWR0aCgxMDApOwotICAgICAgICByZXNwb25jZVdyYXBwZXJDb2x1bW4uc2V0TW92ZWFibGUoZmFsc2UpOwotICAgICAgICByZXNwb25jZVdyYXBwZXJWaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIobW9kZWwsCi0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5SRVNQT05TRV9XUkFQUEVSLCBnZXRUeXBlKCkpKTsKLSAgICAgICAgcmVzcG9uY2VXcmFwcGVyVmlld2VyQ29sdW1uLnNldEVkaXRpbmdTdXBwb3J0KG5ldyBBbm5vdGF0aW9uRWRpdGluZ1N1cHBvcnQodHJlZVZpZXdlciwKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLlJFU1BPTlNFX1dSQVBQRVIpKTsKLSAgICAgICAgcmV0dXJuIHJlc3BvbmNlV3JhcHBlclZpZXdlckNvbHVtbjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxhYmVsUHJvdmlkZXJzKCkgewotICAgICAgICB3ZWJNZXRob2RWaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIobW9kZWwsCi0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5XRUJfTUVUSE9ELCBnZXRUeXBlKCkpKTsKLSAgICAgICAgd2ViUGFyYW1WaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIobW9kZWwsCi0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5XRUJfUEFSQU0sIGdldFR5cGUoKSkpOwotICAgICAgICByZXF1ZXN0V3JhcHBlclZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBbm5vdGF0aW9uQ29sdW1uTGFiZWxQcm92aWRlcihtb2RlbCwKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLlJFUVVFU1RfV1JBUFBFUiwgZ2V0VHlwZSgpKSk7Ci0gICAgICAgIHJlc3BvbmNlV3JhcHBlclZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBbm5vdGF0aW9uQ29sdW1uTGFiZWxQcm92aWRlcihtb2RlbCwKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLlJFU1BPTlNFX1dSQVBQRVIsIGdldFR5cGUoKSkpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQW5ub3RhdGlvbihJVHlwZSB0eXBlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5zZXRSZWRyYXcoZmFsc2UpOwotCi0gICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSAgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIkFubm90YXRpb24gQ2hhbmdlcyIsIAotICAgICAgICAgICAgICAgICAgICAoSUZpbGUpY29tcGlsYXRpb25Vbml0LmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5zZXRLZWVwUHJldmlld0VkaXRzKHRydWUpOwotLy8gICAgICAgICAgICBjb21wb3NpdGVDaGFuZ2Uuc2V0U2F2ZU1vZGUoVGV4dEZpbGVDaGFuZ2UuRk9SQ0VfU0FWRSk7Ci0KLSAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0V2ViU2VydmljZUFubm90YXRpb25DaGFuZ2UodHlwZSwgbW9kZWwsIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICAgICAgSU1ldGhvZFtdIHR5cGVNZXRob2RzID0gSkRUVXRpbHMuZ2V0UHVibGljTWV0aG9kcyh0eXBlKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZU1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHR5cGVNZXRob2RzW2ldOwotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIEJvb2xlYW4+IG1ldGhvZEFubm90YXRpb25NYXAgPSBtb2RlbC5nZXRNZXRob2RNYXAoKS5nZXQobWV0aG9kKTsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kQW5ub3RhdGlvbk1hcC5nZXQoQ1hGTW9kZWxVdGlscy5XRUJfTUVUSE9EKSkgewotICAgICAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFdlYk1ldGhvZEFubm90YXRpb25DaGFuZ2UodHlwZSwgbWV0aG9kLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLlJFUVVFU1RfV1JBUFBFUikpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRSZXF1ZXN0V3JhcHBlckFubm90YXRpb25DaGFuZ2UodHlwZSwgbWV0aG9kLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLlJFU1BPTlNFX1dSQVBQRVIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0UmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbkNoYW5nZSh0eXBlLCBtZXRob2QsIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZEFubm90YXRpb25NYXAuZ2V0KENYRk1vZGVsVXRpbHMuV0VCX1BBUkFNKSkgewotICAgICAgICAgICAgICAgICAgICBMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TWV0aG9kUGFyYW1ldGVycygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBtZXRob2QpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRXZWJQYXJhbUFubm90YXRpb25DaGFuZ2UodHlwZSwgbWV0aG9kLCBwYXJhbWV0ZXIsIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0SW1wb3J0c0NoYW5nZShjb21waWxhdGlvblVuaXQsIG1vZGVsLCB0ZXh0RmlsZUNoYW5nZSwgZmFsc2UpOwotICAgICAgICAgICAgYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQodGV4dEZpbGVDaGFuZ2UuZ2V0UHJldmlld0NvbnRlbnQobW9uaXRvcikpOwotCi0gICAgICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5zZXRSZWRyYXcodHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBtdGUpIHsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKG10ZSk7Ci0gICAgICAgIH0gCi0gICAgfQotCi0gICAgcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgY3JlYXRlQW5ub3RhdGlvblByZXZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGVzKSB7Ci0gICAgICAgIEphdmFQbHVnaW4gamF2YVBsdWdpbiA9IEphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpOwotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gamF2YVBsdWdpbi5nZXRDb21iaW5lZFByZWZlcmVuY2VTdG9yZSgpOwotICAgICAgICBKYXZhVGV4dFRvb2xzIGphdmFUZXh0VG9vbHMgPSBqYXZhUGx1Z2luLmdldEphdmFUZXh0VG9vbHMoKTsKLSAgICAgICAgYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIgPSBuZXcgSmF2YVNvdXJjZVZpZXdlcihwYXJlbnQsIG51bGwsIG51bGwsIHRydWUsIHN0eWxlcywgc3RvcmUpOwotICAgICAgICBJQ29sb3JNYW5hZ2VyIGNvbG9yTWFuYWdlciA9IGphdmFUZXh0VG9vbHMuZ2V0Q29sb3JNYW5hZ2VyKCk7Ci0gICAgICAgIFNpbXBsZUphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgU2ltcGxlSmF2YVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oCi0gICAgICAgICAgICAgICAgY29sb3JNYW5hZ2VyLCBzdG9yZSwgbnVsbCwgSUphdmFQYXJ0aXRpb25zLkpBVkFfUEFSVElUSU9OSU5HLCB0cnVlKTsKLQotICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5jb25maWd1cmUoY29uZmlndXJhdGlvbik7Ci0KLSAgICAgICAgRm9udCBmb250ID0gSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9URVhUX0ZPTlQpOwotICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuc2V0Rm9udChmb250KTsKLSAgICAgICAgYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0KLSAgICAgICAgU3RyaW5nIHNvdXJjZSA9IEpEVFV0aWxzLmdldFNvdXJjZUZyb21UeXBlKGdldFR5cGUoKSk7Ci0gICAgICAgIElEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudChzb3VyY2UpOwotCi0gICAgICAgIEphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmFUZXh0VG9vbHMoKS5zZXR1cEphdmFEb2N1bWVudFBhcnRpdGlvbmVyKGRvY3VtZW50LAotICAgICAgICAgICAgICAgIElKYXZhUGFydGl0aW9ucy5KQVZBX1BBUlRJVElPTklORyk7Ci0gICAgICAgIGFubm90YXRpb25QcmV2aWV3Vmlld2VyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvblByZXZpZXdWaWV3ZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgQW5ub3RhdGlvbkVkaXRpbmdTdXBwb3J0IGV4dGVuZHMgRWRpdGluZ1N1cHBvcnQgewotICAgICAgICBwcml2YXRlIENoZWNrYm94Q2VsbEVkaXRvciBjaGVja2JveENlbGxFZGl0b3I7Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYW5ub3RhdGlvbktleTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBBbm5vdGF0aW9uRWRpdGluZ1N1cHBvcnQoVHJlZVZpZXdlciB2aWV3ZXIsIFN0cmluZyBhbm5vdGF0aW9uS2V5KSB7Ci0gICAgICAgICAgICBzdXBlcih2aWV3ZXIpOwotICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uS2V5ID0gYW5ub3RhdGlvbktleTsKLSAgICAgICAgICAgIGNoZWNrYm94Q2VsbEVkaXRvciA9IG5ldyBDaGVja2JveENlbGxFZGl0b3Iodmlld2VyLmdldFRyZWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuRWRpdChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTWV0aG9kKSB7Ci0gICAgICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICByZXR1cm4gIUFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHR5cGUuZmluZE1ldGhvZHMobWV0aG9kKVswXSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uS2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hlY2tib3hDZWxsRWRpdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIEJvb2xlYW4gYW5ub3RhdGUgPSBtb2RlbC5nZXRNZXRob2RNYXAoKS5nZXQoZWxlbWVudCkuZ2V0KGFubm90YXRpb25LZXkpOwotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHNldFZhbHVlKE9iamVjdCBlbGVtZW50LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkgewotICAgICAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgQm9vbGVhbiBhbm5vdGF0ZSA9IChCb29sZWFuKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBCb29sZWFuPiBhbm5vdGF0aW9uTWFwID0gbW9kZWwuZ2V0TWV0aG9kTWFwKCkuZ2V0KGVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGFubm90YXRpb25NYXAucHV0KGFubm90YXRpb25LZXksIGFubm90YXRlKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVBbm5vdGF0aW9uKG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCkpOwotICAgICAgICAgICAgICAgIGdldFZpZXdlcigpLnJlZnJlc2godHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KQVhXU0Fubm90YXRlV2lkZ2V0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSkFYV1NBbm5vdGF0ZVdpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI2ODE2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KQVhXU0Fubm90YXRlV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NEZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLkNYRkNyZWF0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKQVhXU0Fubm90YXRlV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB7Ci0gICAgcHJpdmF0ZSBTaW1wbGVXaWRnZXRDb250cmlidXRvciBqYXh3c0Fubm90YXRlV2lkZ2V0Q29udHJpYnV0b3I7Ci0KLSAgICBwcml2YXRlIEpBWFdTQW5ub3RhdGVKYXZhV2lkZ2V0IGpheHdzQW5ub3RhdGVKYXZhV2lkZ2V0ID0gbmV3IEpBWFdTQW5ub3RhdGVKYXZhV2lkZ2V0KCk7Ci0gICAgCi0gICAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldEZpcnN0TmFtZWRXaWRnZXQoKSB7Ci0gICAgICAgIGlmIChqYXh3c0Fubm90YXRlV2lkZ2V0Q29udHJpYnV0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBqYXh3c0Fubm90YXRlV2lkZ2V0Q29udHJpYnV0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldE5leHROYW1lZFdpZGdldChJTmFtZWRXaWRnZXRDb250cmlidXRvciB3aWRnZXRDb250cmlidXRvcikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotICAgICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsCi0gICAgICAgICAgICAgICAgIkphdmEyV1NEYXRhTW9kZWwiLCBKQVhXU0Fubm90YXRlV2lkZ2V0RmFjdG9yeS5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhMldTRGF0YU1vZGVsKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgamF4d3NBbm5vdGF0ZUphdmFXaWRnZXQuc2V0SmF2YTJXU0RhdGFNb2RlbChtb2RlbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gICAgICAgIGpheHdzQW5ub3RhdGVXaWRnZXRDb250cmlidXRvciA9IG5ldyBTaW1wbGVXaWRnZXRDb250cmlidXRvcigpOwotICAgICAgICBDWEZDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpOwotICAgICAgICBTdHJpbmcgdGl0bGUgPSBDWEZDcmVhdGlvblVJTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19KQVhXU19BTk5PVEFURV9QQUdFX1RJVExFLCAKLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117Y29udGV4dC5nZXRDeGZSdW50aW1lRWRpdGlvbigpLCBjb250ZXh0LmdldEN4ZlJ1bnRpbWVWZXJzaW9uKCl9KTsKLSAgICAgICAgamF4d3NBbm5vdGF0ZVdpZGdldENvbnRyaWJ1dG9yLnNldFRpdGxlKHRpdGxlKTsKLSAgICAgICAgamF4d3NBbm5vdGF0ZVdpZGdldENvbnRyaWJ1dG9yCi0gICAgICAgICAgICAgICAgLnNldERlc2NyaXB0aW9uKENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX0pBWFdTX0FOTk9UQVRFX1BBR0VfREVTQ1JJUFRJT04pOwotICAgICAgICBqYXh3c0Fubm90YXRlV2lkZ2V0Q29udHJpYnV0b3Iuc2V0RmFjdG9yeShuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgewotICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gamF4d3NBbm5vdGF0ZUphdmFXaWRnZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NDbGFzc0NvbmZpZ1dpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU0NsYXNzQ29uZmlnV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNmQ3ZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU0NsYXNzQ29uZmlnV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLkNYRkNyZWF0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLkNYRkNyZWF0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzLkphdmEyV1NXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKYXZhMldTQ2xhc3NDb25maWdXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgewotICAgIHByaXZhdGUgSVN0YXR1cyBKQVZBX1RZUEVfTkFNRV9TVEFUVVMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIHByaXZhdGUgSVN0YXR1cyBKQVZBX1RZUEVfRVhJU1RTX1NUQVRVUyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOwotICAgIAotICAgIHByaXZhdGUgaW50IE5VTUJFUl9PRl9QVUJMSUNfTUVUSE9EUzsKLSAgICBwcml2YXRlIGludCBOVU1CRVJfT0ZfQ0hFQ0tFRF9NRVRIT0RTOwotICAgIHByaXZhdGUgSU1ldGhvZFtdIHB1YmxpY01ldGhvZHM7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiB1c2VTRUlCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gc2VsZWN0U0VJQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGJyb3dzZVNFSUJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBleHRyYWN0U0VJQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBDb21ibyBzZWxlY3RTRUlDb21ibzsKLSAgICBwcml2YXRlIFRleHQgc2VpSW50ZXJmYWNlTmFtZVRleHQ7Ci0gICAgCi0gICAgcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlcjsKLSAgICBwcml2YXRlIFRhYmxlIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZTsKLSAgICBwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGxCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b247Ci0KLSAgICBwcml2YXRlIEphdmEyV1NEYXRhTW9kZWwgbW9kZWw7Ci0gICAgcHJpdmF0ZSBJVHlwZSBzdGFydGluZ1BvaW50VHlwZTsKLQotICAgIHB1YmxpYyBKYXZhMldTQ2xhc3NDb25maWdXaWRnZXQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YTJXU0RhdGFNb2RlbChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhU3RhcnRpbmdQb2ludFR5cGUoSVR5cGUgc3RhcnRpbmdQb2ludFR5cGUpIHsKLSAgICAgICAgdGhpcy5zdGFydGluZ1BvaW50VHlwZSA9IHN0YXJ0aW5nUG9pbnRUeXBlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGludGVybmFsaXplKCkgewotICAgICAgICBib29sZWFuIHVzZVNFSSA9IG1vZGVsLmlzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0gICAgICAgIHVzZVNFSUJ1dHRvbi5zZXRTZWxlY3Rpb24odXNlU0VJKTsKLSAgICAgICAgc2VsZWN0U0VJQnV0dG9uLnNldFNlbGVjdGlvbih1c2VTRUkpOwotICAgICAgICBzZWxlY3RTRUlCdXR0b24uc2V0RW5hYmxlZCh1c2VTRUkpOwotICAgICAgICBpZiAoIXVzZVNFSSkgewotICAgICAgICAgICAgc2VsZWN0U0VJQ29tYm8uZGVzZWxlY3RBbGwoKTsKLSAgICAgICAgfQotICAgICAgICBlbmFibGVTZWxlY3RTRUlDb250cm9scyh1c2VTRUkpOwotICAgICAgICBleHRyYWN0U0VJQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIGV4dHJhY3RTRUlCdXR0b24uc2V0RW5hYmxlZCh1c2VTRUkpOwotICAgICAgICBlbmFibGVFeHRyYWN0U0VJQ29udHJvbHModXNlU0VJKTsKLSAgICAgICAgc2VpSW50ZXJmYWNlTmFtZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLSAgICAgICAgTlVNQkVSX09GX0NIRUNLRURfTUVUSE9EUyA9IDA7Ci0gICAgICAgIHZhbGlkYXRlU0VJU2VsZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpIHsKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHVzZVNFSUJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVVzZVNFSUJ1dHRvbihjb21wb3NpdGUpOwotICAgICAgICB1c2VTRUlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHVzZVNFSSA9IHVzZVNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UodXNlU0VJKTsKLSAgICAgICAgICAgICAgICBzZWxlY3RTRUlCdXR0b24uc2V0RW5hYmxlZCh1c2VTRUkpOwotICAgICAgICAgICAgICAgIGV4dHJhY3RTRUlCdXR0b24uc2V0RW5hYmxlZCh1c2VTRUkpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVNFSVNlbGVjdGlvblN0YXR1cygpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgICAgIGlmICghdXNlU0VJKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoIiIpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0U0VJQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGVuYWJsZVNlbGVjdFNFSUNvbnRyb2xzKGZhbHNlKTsKLQotICAgICAgICAgICAgICAgICAgICBleHRyYWN0U0VJQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGVuYWJsZUV4dHJhY3RTRUlDb250cm9scyhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0pOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgdXNlU0VJQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAKLSAgICAgICAgTGFiZWwgcGFkZGluZ0xhYmVsID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlUGFkZGluZ0xhYmVsKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgcGFkZGluZ0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHNlbGVjdFNFSUJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVNlbGVjdFNFSUJ1dHRvbihjb21wb3NpdGUpOwotICAgICAgICBzZWxlY3RTRUlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBlbmFibGVTZWxlY3RTRUlDb250cm9scyhzZWxlY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgIGVuYWJsZUV4dHJhY3RTRUlDb250cm9scyghc2VsZWN0U0VJQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0U0VJQnV0dG9uLmdldFNlbGVjdGlvbigpICYmIHNlbGVjdFNFSUNvbWJvLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNFSVNlbGVjdGlvblN0YXR1cygpOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgc2VsZWN0U0VJQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIHNlbGVjdFNFSUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBzZWxlY3RTRUlCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgc2VsZWN0U0VJQ29tYm8gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVTZWxlY3RTRUlDb21ibyhjb21wb3NpdGUsIG1vZGVsLCBzdGFydGluZ1BvaW50VHlwZSk7Ci0gICAgICAgIHNlbGVjdFNFSUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNFSVNlbGVjdGlvblN0YXR1cygpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIHNlbGVjdFNFSUNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNFSVNlbGVjdGlvblN0YXR1cygpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotICAgICAgICBzZWxlY3RTRUlDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgCi0gICAgICAgIGJyb3dzZVNFSUJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUJyb3dzZUJ1dHRvbihjb21wb3NpdGUpOwotCi0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotICAgICAgICBicm93c2VTRUlCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgYnJvd3NlU0VJQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyBzZWxlY3Rpb25EaWFsb2cgPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZygKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5nZXRTaGVsbCgpLCBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfU0VJX0RJQUxPR19USVRMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX1NFTEVDVF9TRUlfRElBTE9HX0RFU0NSSVBUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSksIElKYXZhU2VhcmNoQ29uc3RhbnRzLklOVEVSRkFDRSk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgcmV0dXJuQ29kZSA9IHNlbGVjdGlvbkRpYWxvZy5vcGVuKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHVybkNvZGUgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgc2VsZWN0ZWRDb21waWxhdGlvblVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdCkgc2VsZWN0aW9uRGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3RlZEludGVyZmFjZSA9IHNlbGVjdGVkQ29tcGlsYXRpb25Vbml0LmZpbmRQcmltYXJ5VHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gc2VpcyA9IEFycmF5cy5hc0xpc3Qoc2VsZWN0U0VJQ29tYm8uZ2V0SXRlbXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc2Vpcy5jb250YWlucyhzZWxlY3RlZEludGVyZmFjZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdFNFSUNvbWJvLmFkZChzZWxlY3RlZEludGVyZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0U0VJQ29tYm8uc2V0VGV4dChzZWxlY3RlZEludGVyZmFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBwYWRkaW5nTGFiZWwgPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWRkaW5nTGFiZWwoY29tcG9zaXRlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBwYWRkaW5nTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgZXh0cmFjdFNFSUJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUV4dHJhY3RTRUlCdXR0b24oY29tcG9zaXRlKTsKLSAgICAgICAgZXh0cmFjdFNFSUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gZXh0cmFjdCA9IGV4dHJhY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0RXh0cmFjdEludGVyZmFjZShleHRyYWN0KTsKLSAgICAgICAgICAgICAgICBlbmFibGVFeHRyYWN0U0VJQ29udHJvbHMoZXh0cmFjdCk7Ci0gICAgICAgICAgICAgICAgZW5hYmxlU2VsZWN0U0VJQ29udHJvbHMoIWV4dHJhY3QpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVNFSVNlbGVjdGlvblN0YXR1cygpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZXh0cmFjdFNFSUJ1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNFeHRyYWN0SW50ZXJmYWNlKCkpOwotICAgICAgICBleHRyYWN0U0VJQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgZXh0cmFjdFNFSUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgCi0gICAgICAgIHNlaUludGVyZmFjZU5hbWVUZXh0ID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlU0VJSW50ZXJmYWNlTmFtZVRleHQoY29tcG9zaXRlKTsKLSAgICAgICAgc2VpSW50ZXJmYWNlTmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV4dHJhY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUgPSBzZWlJbnRlcmZhY2VOYW1lVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWlOYW1lID0gaW50ZXJmYWNlTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gc3RhcnRpbmdQb2ludFR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VpTmFtZSA9IHBhY2thZ2VOYW1lICsgIi4iICsgaW50ZXJmYWNlTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKHNlaU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21waWxhdGlvblVuaXROYW1lID0gaW50ZXJmYWNlTmFtZSArICIuamF2YSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgSkFWQV9UWVBFX05BTUVfU1RBVFVTID0gSkRUVXRpbHMudmFsaWRhdGVKYXZhVHlwZU5hbWUobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSwgaW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIEpBVkFfVFlQRV9FWElTVFNfU1RBVFVTID0gSkRUVXRpbHMuY2hlY2tUeXBlRXhpc3RzKHN0YXJ0aW5nUG9pbnRUeXBlLCBjb21waWxhdGlvblVuaXROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU0VJU2VsZWN0aW9uU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLSAgICAgICAgc2VpSW50ZXJmYWNlTmFtZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlUGFkZGluZ0xhYmVsKGNvbXBvc2l0ZSk7Ci0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhZGRpbmdMYWJlbChjb21wb3NpdGUpOwotCi0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZU1lbWViZXJzVG9FeHRyYWN0TGFiZWwoY29tcG9zaXRlKTsKLQotICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWRkaW5nTGFiZWwoY29tcG9zaXRlKTsKLSAgICAgICAgSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlUGFkZGluZ0xhYmVsKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyID0gSmF2YTJXU1dpZGdldEZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlU0VJTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyKGNvbXBvc2l0ZSk7Ci0gICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZSA9IHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0W10gY2hlY2tlZE1ldGhvZHMgPSBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiBtZXRob2RNYXAgPSBuZXcgSGFzaE1hcDxJTWV0aG9kLCBNYXA8U3RyaW5nLCBCb29sZWFuPj4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrZWRNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZE1hcC5wdXQoKElNZXRob2QpY2hlY2tlZE1ldGhvZHNbaV0sIG1vZGVsLmdldEFubm90YXRpb25NYXAoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1vZGVsLnNldE1ldGhvZE1hcChtZXRob2RNYXApOwotCi0gICAgICAgICAgICAgICAgTlVNQkVSX09GX0NIRUNLRURfTUVUSE9EUyA9IGNoZWNrZWRNZXRob2RzLmxlbmd0aDsKLQotICAgICAgICAgICAgICAgIGlmIChOVU1CRVJfT0ZfQ0hFQ0tFRF9NRVRIT0RTIDwgTlVNQkVSX09GX1BVQkxJQ19NRVRIT0RTKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTlVNQkVSX09GX0NIRUNLRURfTUVUSE9EUyA9PSBOVU1CRVJfT0ZfUFVCTElDX01FVEhPRFMpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChOVU1CRVJfT0ZfQ0hFQ0tFRF9NRVRIT0RTID4gMCkgewotICAgICAgICAgICAgICAgICAgICBkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1cGRhdGVTRUlTZWxlY3Rpb25TdGF0dXMoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDM7Ci0gICAgICAgIGdyaWREYXRhLmhlaWdodEhpbnQgPSAxMDA7Ci0gICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBzZWxlY3RBbGxCdXR0b24gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVTZWxlY3RBbGxCdXR0b24oY29tcG9zaXRlKTsKLSAgICAgICAgc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyLnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIGRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICBUYWJsZUl0ZW1bXSBjaGVja2VkTWV0aG9kcyA9IHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja2VkTWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gY2hlY2tlZE1ldGhvZHNbaV07Ci0gICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkV2ZW50IHNlbGVjdGlvbkV2ZW50ID0gZXZlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkV2ZW50LmRldGFpbCA9IFNXVC5DSEVDSzsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRXZlbnQuaXRlbSA9IHRhYmxlSXRlbTsKLSAgICAgICAgICAgICAgICAgICAgc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyLmhhbmRsZVNlbGVjdChzZWxlY3Rpb25FdmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVwZGF0ZVNFSVNlbGVjdGlvblN0YXR1cygpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0pOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIHNlbGVjdEFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWRkaW5nTGFiZWwoY29tcG9zaXRlKTsKLQotICAgICAgICBkZXNlbGVjdEFsbEJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZURlc2VsZWN0QWxsQnV0dG9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGRlc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyLnNldEFsbENoZWNrZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIGRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgVGFibGVJdGVtW10gY2hlY2tlZE1ldGhvZHMgPSBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tlZE1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgVGFibGVJdGVtIHRhYmxlSXRlbSA9IGNoZWNrZWRNZXRob2RzW2ldOwotICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25FdmVudCBzZWxlY3Rpb25FdmVudCA9IGV2ZW50OwotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25FdmVudC5kZXRhaWwgPSBTV1QuQ0hFQ0s7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkV2ZW50Lml0ZW0gPSB0YWJsZUl0ZW07Ci0gICAgICAgICAgICAgICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5oYW5kbGVTZWxlY3Qoc2VsZWN0aW9uRXZlbnQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHVwZGF0ZVNFSVNlbGVjdGlvblN0YXR1cygpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBkZXNlbGVjdEFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBwdWJsaWNNZXRob2RzID0gSkRUVXRpbHMuZ2V0UHVibGljTWV0aG9kcyhzdGFydGluZ1BvaW50VHlwZSk7Ci0gICAgICAgIE5VTUJFUl9PRl9QVUJMSUNfTUVUSE9EUyA9IHB1YmxpY01ldGhvZHMubGVuZ3RoOwotICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuc2V0SW5wdXQocHVibGljTWV0aG9kcyk7Ci0KLSAgICAgICAgZW5hYmxlU2VsZWN0U0VJQ29udHJvbHMoZmFsc2UpOwotICAgICAgICBlbmFibGVFeHRyYWN0U0VJQ29udHJvbHMoZmFsc2UpOwotICAgICAgICBzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIGlmIChtb2RlbC5pc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpKSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0U0VJQ29tYm8uaW5kZXhPZihtb2RlbC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0U0VJQ29tYm8uYWRkKG1vZGVsLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZWxlY3RTRUlDb21iby5zZXRUZXh0KG1vZGVsLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKG1vZGVsLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU0VJU2VsZWN0aW9uKCkgewotICAgICAgICBpZiAoIXVzZVNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgU0VJX1NFTEVDVElPTl9TVEFUVVMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIElUeXBlIHNlaVR5cGUgPSBKRFRVdGlscy5nZXRUeXBlKG1vZGVsLmdldFByb2plY3ROYW1lKCksIHNlbGVjdFNFSUNvbWJvLmdldFRleHQoKSk7Ci0gICAgICAgIGlmIChzZWlUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSU1ldGhvZFtdIHNlaU1ldGhvZHMgPSBzZWlUeXBlLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKElNZXRob2Qgc2VpTWV0aG9kIDogc2VpTWV0aG9kcykgewotICAgICAgICAgICAgICAgICAgICBJTWV0aG9kW10gaW1wbE1ldGhvZHMgPSBzdGFydGluZ1BvaW50VHlwZS5maW5kTWV0aG9kcyhzZWlNZXRob2QpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW1wbE1ldGhvZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU0VJX1NFTEVDVElPTl9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKENYRkNyZWF0aW9uVUlNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTVVTVF9JTVBMRU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbXBsZW1lbnRzTWVzc2FnZShzZWlUeXBlLCBzZWlNZXRob2QpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gdmFsaWRhdGVTRUlBZGRpdGlvbigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1vZGVsLnNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoc2VsZWN0U0VJQ29tYm8uZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKHNlbGVjdFNFSUNvbWJvLmdldFRleHQoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuYmluZChDWEZDcmVhdGlvblVJTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9GT1VORCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RTRUlDb21iby5nZXRUZXh0KCkpKTsgICAKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW1wbGVtZW50c01lc3NhZ2UoSVR5cGUgc2VpVHlwZSwgSU1ldGhvZCBzZWlNZXRob2QpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1aWxkZXIoc2VpVHlwZS5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtZXNzYWdlLmFwcGVuZChzZWlNZXRob2QuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIoIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMgPSBzZWlNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlclR5cGUgPSBTaWduYXR1cmUudG9TdHJpbmcocGFyYW1ldGVyVHlwZXNbaV0pOwotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQocGFyYW1ldGVyVHlwZSk7Ci0gICAgICAgICAgICBpZiAoaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2UudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVTRUlBZGRpdGlvbigpIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUFubm90YXRpb24gd2ViU2VydmljZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHN0YXJ0aW5nUG9pbnRUeXBlLCBXZWJTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgICAgIGlmICh3ZWJTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUod2ViU2VydmljZSwgTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX1NFTEVDVF9TRUlfV0VCU0VSVklDRV9OQU1FX0FUVFJJQlVURV9QUkVTRU5UKTsgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgCi0gICAgcHVibGljIHZvaWQgZW5hYmxlU2VsZWN0U0VJQ29udHJvbHMoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgc2VsZWN0U0VJQ29tYm8uc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICBicm93c2VTRUlCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuYWJsZUV4dHJhY3RTRUlDb250cm9scyhib29sZWFuIGVuYWJsZSkgewotICAgICAgICBzZWlJbnRlcmZhY2VOYW1lVGV4dC5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZS5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgICAgIGlmIChlbmFibGUgJiYgKE5VTUJFUl9PRl9DSEVDS0VEX01FVEhPRFMgPCBOVU1CRVJfT0ZfUFVCTElDX01FVEhPRFMpKSB7Ci0gICAgICAgICAgICBzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbmFibGUgJiYgKE5VTUJFUl9PRl9DSEVDS0VEX01FVEhPRFMgPiAwKSkgewotICAgICAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZW5hYmxlKSB7Ci0gICAgICAgICAgICBzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLSAgICAgICAgcmV0dXJuIGZpbmRNb3N0U2V2ZXJlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNFSVNlbGVjdGlvblN0YXR1cygpIHsKLSAgICAgICAgaWYgKHVzZVNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgaWYgKCFzZWxlY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkgJiYgIWV4dHJhY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBTRUlfU0VMRUNUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfU0VJX09QVElPTik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzZWxlY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkgJiYgc2VsZWN0U0VJQ29tYm8uZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBTRUlfU0VMRUNUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfU0VJX01FU1NBR0UpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkgJiYgc2VsZWN0U0VJQ29tYm8uZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHZhbGlkYXRlU0VJU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChleHRyYWN0U0VJQnV0dG9uLmdldFNlbGVjdGlvbigpICYmIHNlaUludGVyZmFjZU5hbWVUZXh0LmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX0VOVEVSX1NFSV9OQU1FKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXh0cmFjdFNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSAmJiBOVU1CRVJfT0ZfUFVCTElDX01FVEhPRFMgPiAwCi0gICAgICAgICAgICAgICAgICAgICYmIE5VTUJFUl9PRl9DSEVDS0VEX01FVEhPRFMgPT0gMCkgewotICAgICAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfU0VJX0VYVFJBQ1RFRF9NRVRIT0RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZ1BvaW50VHlwZS5nZXRFbGVtZW50TmFtZSgpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV4dHJhY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkgJiYgc2VpSW50ZXJmYWNlTmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDAKLSAgICAgICAgICAgICAgICAgICAgJiYgTlVNQkVSX09GX1BVQkxJQ19NRVRIT0RTID4gMCAmJiBOVU1CRVJfT0ZfQ0hFQ0tFRF9NRVRIT0RTID4gMCkgewotICAgICAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU0VJX1NFTEVDVElPTl9TVEFUVVMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICAgICAgSkFWQV9UWVBFX05BTUVfU1RBVFVTID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgIEpBVkFfVFlQRV9FWElTVFNfU1RBVFVTID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgSVN0YXR1cyBmaW5kTW9zdFNldmVyZSgpIHsKLSAgICAgICAgaWYgKEpBVkFfVFlQRV9OQU1FX1NUQVRVUy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSkFWQV9UWVBFX05BTUVfU1RBVFVTOwotICAgICAgICB9Ci0gICAgICAgIGlmIChKQVZBX1RZUEVfRVhJU1RTX1NUQVRVUy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSkFWQV9UWVBFX0VYSVNUU19TVEFUVVM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFNFSV9TRUxFQ1RJT05fU1RBVFVTLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpIHsKLSAgICAgICAgICAgIHJldHVybiBTRUlfU0VMRUNUSU9OX1NUQVRVUzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKFNFSV9TRUxFQ1RJT05fU1RBVFVTLmdldFNldmVyaXR5KCkgPj0gSkFWQV9UWVBFX05BTUVfU1RBVFVTLmdldFNldmVyaXR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBTRUlfU0VMRUNUSU9OX1NUQVRVUzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChKQVZBX1RZUEVfRVhJU1RTX1NUQVRVUy5nZXRTZXZlcml0eSgpID49IEpBVkFfVFlQRV9OQU1FX1NUQVRVUy5nZXRTZXZlcml0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSkFWQV9UWVBFX0VYSVNUU19TVEFUVVM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gSkFWQV9UWVBFX05BTUVfU1RBVFVTOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU0NvbmZpZ1dpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU0NvbmZpZ1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2VmY2JiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NDb25maWdXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuSmF2YTJXU1dpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuV1NETFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKYXZhMldTQ29uZmlnV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIHsKLSAgICBwcml2YXRlIElTdGF0dXMgV1NETF9GSUxFTkFNRV9PS19TVEFUVVMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIHByaXZhdGUgSVN0YXR1cyBXU0RMX0ZJTEVOQU1FX0VSUk9SX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19FTlRFUl9WQUxJRF9XU0RMX05BTUUpOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVDbGllbnRCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVTZXJ2ZXJCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVXcmFwZXJGYXVsdEJlYW5zQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlV1NETEJ1dHRvbjsKLSAgICBwcml2YXRlIENvbWJvIHNvYXBCaW5kaW5nQ29tYm87Ci0gICAgcHJpdmF0ZSBCdXR0b24gY3JlYXRlWFNESW1wb3J0czsKLSAgICBwcml2YXRlIFRleHQgd3NkbEZpbGVUZXh0OwotICAgIHByaXZhdGUgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbDsKLQotICAgIHB1YmxpYyBKYXZhMldTQ29uZmlnV2lkZ2V0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmEyV1NEYXRhTW9kZWwoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGludGVybmFsaXplKCkgewotICAgICAgICBpZiAobW9kZWwuZ2V0Q3hmUnVudGltZVZlcnNpb24oKS5jb21wYXJlVG8oQ1hGQ29yZVBsdWdpbi5DWEZfVkVSU0lPTl8yXzEpID49IDApIHsKLSAgICAgICAgICAgIGdlbmVyYXRlQ2xpZW50QnV0dG9uLnNldFNlbGVjdGlvbihtb2RlbC5pc0dlbmVyYXRlQ2xpZW50KCkpOwotICAgICAgICAgICAgZ2VuZXJhdGVTZXJ2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzR2VuZXJhdGVTZXJ2ZXIoKSk7Ci0gICAgICAgICAgICBnZW5lcmF0ZVdyYXBlckZhdWx0QmVhbnNCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpKTsKLSAgICAgICAgICAgIGdlbmVyYXRlV1NETEJ1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNHZW5lcmF0ZVdTREwoKSk7Ci0gICAgICAgICAgICBlbmFibGVXU0RMR3JvdXAobW9kZWwuaXNHZW5lcmF0ZVdTREwoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vZGVsLmlzU29hcDEyQmluZGluZygpKSB7Ci0gICAgICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldFRleHQoIlNPQVAgMS4yIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VGV4dCgiU09BUCAxLjEiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGNyZWF0ZVhTREltcG9ydHMuc2V0U2VsZWN0aW9uKG1vZGVsLmlzR2VuZXJhdGVYU0RJbXBvcnRzKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBHcm91cCBqYXZhMndzR3JvdXAgPSBudWxsOwotICAgICAgICBpZiAobW9kZWwuZ2V0Q3hmUnVudGltZVZlcnNpb24oKS5jb21wYXJlVG8oQ1hGQ29yZVBsdWdpbi5DWEZfVkVSU0lPTl8yXzEpID49IDApIHsKLSAgICAgICAgICAgIC8vIEZyb250ZW5kCi0vLyAgICAgICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUZyb250ZW5kTGFiZWwoY29tcG9zaXRlKTsKLS8vCi0vLyAgICAgICAgICAgIGZpbmFsIENvbWJvIGZyb250ZW5kQ29tYm8gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVGcm9udGVuZENvbWJvKGNvbXBvc2l0ZSwgbW9kZWwpOwotLy8gICAgICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLS8vICAgICAgICAgICAgZnJvbnRlbmRDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAKLSAgICAgICAgICAgIC8vIEphdmEyV1MgR3JvdXAKLSAgICAgICAgICAgIGphdmEyd3NHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICAgICAgamF2YTJ3c0dyb3VwLnNldFRleHQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfR1JPVVBfTEFCRUwpOwotICAgICAgICAgICAgR3JpZExheW91dCBqYXZhMndzbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAKLSAgICAgICAgICAgIGphdmEyd3NsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgCi0gICAgICAgICAgICBqYXZhMndzbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotICAgICAgICAgICAgamF2YTJ3c0dyb3VwLnNldExheW91dChqYXZhMndzbGF5b3V0KTsKLSAgICAgICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgICAgICBqYXZhMndzR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgCi0gICAgICAgICAgICAvLyBHZW4gQ2xpZW50Ci0gICAgICAgICAgICBnZW5lcmF0ZUNsaWVudEJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlQ2xpZW50QnV0dG9uKGphdmEyd3NHcm91cCwgbW9kZWwpOwotCi0gICAgICAgICAgICAvLyBHZW4gU2VydmVyCi0gICAgICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlU2VydmVyQnV0dG9uKGphdmEyd3NHcm91cCwgbW9kZWwpOwotICAgIAotICAgICAgICAgICAgLy8gR2VuIFdyYXBwZXIgYW5kIEZhdWx0IEJlYW4KLSAgICAgICAgICAgIGdlbmVyYXRlV3JhcGVyRmF1bHRCZWFuc0J1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbkJ1dHRvbigKLSAgICAgICAgICAgICAgICAgICAgamF2YTJ3c0dyb3VwLCBtb2RlbCk7Ci0gICAgCi0gICAgICAgICAgICAvLyBHZW4gV1NETAotICAgICAgICAgICAgZ2VuZXJhdGVXU0RMQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVXU0RMQnV0dG9uKGphdmEyd3NHcm91cCwgbW9kZWwpOwotICAgICAgICAgICAgZ2VuZXJhdGVXU0RMQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5hYmxlV1NETEdyb3VwKGdlbmVyYXRlV1NETEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICAgICAgZ2VuZXJhdGVXU0RMQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBHcm91cCB3c2RsR3JvdXAgPSBuZXcgR3JvdXAoamF2YTJ3c0dyb3VwID09IG51bGwgPyBjb21wb3NpdGUgOiBqYXZhMndzR3JvdXAsIFNXVC5TSEFET1dfRVRDSEVEX0lOKTsKLSAgICAgICAgR3JpZExheW91dCB3c2RsR3JvdXBMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgICAgIHdzZGxHcm91cC5zZXRMYXlvdXQod3NkbEdyb3VwTGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICB3c2RsR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlV1NETEZpbGVOYW1lTGFiZWwod3NkbEdyb3VwKTsKLQotICAgICAgICB3c2RsRmlsZVRleHQgPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVXU0RMRmlsZU5hbWVUZXh0KHdzZGxHcm91cCwgbW9kZWwpOwotICAgICAgICB3c2RsRmlsZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB3c2RsRmlsZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlU09BUEJpbmRpbmdMYWJlbCh3c2RsR3JvdXApOwotCi0gICAgICAgIHNvYXBCaW5kaW5nQ29tYm8gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVTT0FQQmluZ0NvbWJvKHdzZGxHcm91cCwgbW9kZWwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlWFNESW1wb3J0c0J1dHRvbih3c2RsR3JvdXAsIG1vZGVsKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgY3JlYXRlWFNESW1wb3J0cy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBlbmFibGVXU0RMR3JvdXAobW9kZWwuaXNHZW5lcmF0ZVdTREwoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuYWJsZVdTRExHcm91cChib29sZWFuIGVuYWJsZSkgewotICAgICAgICB3c2RsRmlsZVRleHQuc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICAgICAgY3JlYXRlWFNESW1wb3J0cy5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotICAgICAgICByZXR1cm4gZ2V0V1NETEZpbGVOYW1lU3RhdHVzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJU3RhdHVzIGdldFdTRExGaWxlTmFtZVN0YXR1cygpIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBXU0RMX0ZJTEVOQU1FX09LX1NUQVRVUzsKLSAgICAgICAgU3RyaW5nIHdzZGxGaWxlTmFtZSA9IHdzZGxGaWxlVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgIGlmICghV1NETFV0aWxzLmlzVmFsaWRXU0RMRmlsZU5hbWUod3NkbEZpbGVOYW1lKSkgewotICAgICAgICAgICAgc3RhdHVzID0gV1NETF9GSUxFTkFNRV9FUlJPUl9TVEFUVVM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU0NvbmZpZ1dpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2Y2YwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NEZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLkNYRkNyZWF0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKYXZhMldTQ29uZmlnV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIGphdmEyV1NXaWRnZXRDb250cmlidXRvcjsKLQotICAgIHByaXZhdGUgSmF2YTJXU0NvbmZpZ1dpZGdldCBqYXZhMldTQ29uZmlnV2lkZ2V0ID0gbmV3IEphdmEyV1NDb25maWdXaWRnZXQoKTsKLSAgICAKLSAgICBwdWJsaWMgSmF2YTJXU0NvbmZpZ1dpZGdldEZhY3RvcnkoKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0Rmlyc3ROYW1lZFdpZGdldCgpIHsKLSAgICAgICAgaWYgKGphdmEyV1NXaWRnZXRDb250cmlidXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGphdmEyV1NXaWRnZXRDb250cmlidXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0TmV4dE5hbWVkV2lkZ2V0KElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIHdpZGdldENvbnRyaWJ1dG9yKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSB7Ci0gICAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEphdmEyV1NEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLSAgICAgICAgICAgICAgICAiSmF2YTJXU0RhdGFNb2RlbCIsIEphdmEyV1NDb25maWdXaWRnZXRGYWN0b3J5LmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmEyV1NEYXRhTW9kZWwoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBqYXZhMldTQ29uZmlnV2lkZ2V0LnNldEphdmEyV1NEYXRhTW9kZWwobW9kZWwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICBqYXZhMldTV2lkZ2V0Q29udHJpYnV0b3IgPSBuZXcgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IoKTsKLSAgICAgICAgQ1hGQ29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfUEFHRV9USVRMRSwgbmV3IE9iamVjdFtde2NvbnRleHQuZ2V0Q3hmUnVudGltZUVkaXRpb24oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldEN4ZlJ1bnRpbWVWZXJzaW9uKCl9KTsKLQotICAgICAgICBqYXZhMldTV2lkZ2V0Q29udHJpYnV0b3Iuc2V0VGl0bGUodGl0bGUpOwotICAgICAgICBqYXZhMldTV2lkZ2V0Q29udHJpYnV0b3IKLSAgICAgICAgICAgICAgICAuc2V0RGVzY3JpcHRpb24oQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmJpbmQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfUEFHRV9ERVNDUklQVElPTiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldEN4ZlJ1bnRpbWVFZGl0aW9uKCkpKTsKLSAgICAgICAgamF2YTJXU1dpZGdldENvbnRyaWJ1dG9yLnNldEZhY3RvcnkobmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGphdmEyV1NDb25maWdXaWRnZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NJbnRlcmZhY2VDb25maWdXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NJbnRlcmZhY2VDb25maWdXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY1NGQxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTSW50ZXJmYWNlQ29uZmlnV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5KYXZhMldTV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSmF2YTJXU0ludGVyZmFjZUNvbmZpZ1dpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciB7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIElNUExfU0VMRUNUSU9OX1NUQVRVUyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0KLSAgICBwcml2YXRlIEphdmEyV1NEYXRhTW9kZWwgbW9kZWw7Ci0gICAgcHJpdmF0ZSBJVHlwZSBzdGFydGluZ1BvaW50VHlwZTsKLQotICAgIHByaXZhdGUgQ29tYm8gc2VsZWN0SW1wbGVtZW50YXRpb25Db21ibzsKLSAgICAKLSAgICBwdWJsaWMgSmF2YTJXU0ludGVyZmFjZUNvbmZpZ1dpZGdldCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhMldTRGF0YU1vZGVsKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmFTdGFydGluZ1BvaW50VHlwZShJVHlwZSBzdGFydGluZ1BvaW50VHlwZSkgewotICAgICAgICB0aGlzLnN0YXJ0aW5nUG9pbnRUeXBlID0gc3RhcnRpbmdQb2ludFR5cGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpIHsKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAKLSAgICAgICAgSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlU2VsZWN0SW1wbGVtZW50YXRpb25MYWJlbChjb21wb3NpdGUpOwotICAgICAgICAKLSAgICAgICAgc2VsZWN0SW1wbGVtZW50YXRpb25Db21ibyA9IEphdmEyV1NXaWRnZXRGYWN0b3J5Ci0gICAgICAgICAgICAuY3JlYXRlU2VsZWN0SW1wbGVtZW50YXRpb25Db21ibyhjb21wb3NpdGUsIG1vZGVsLCBzdGFydGluZ1BvaW50VHlwZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAKLSAgICAgICAgc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZUltcGxlbWVudGF0aW9uU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIAl2YWxpZGF0ZUltcGxlbWVudGF0aW9uU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgQnV0dG9uIGJyb3dzZUltcGxCdXR0b24gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVCcm93c2VCdXR0b24oY29tcG9zaXRlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBicm93c2VJbXBsQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAKLSAgICAgICAgYnJvd3NlSW1wbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgc2VsZWN0aW9uRGlhbG9nID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUuZ2V0U2hlbGwoKSwgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX0lNUExfRElBTE9HX1RJVExFLAotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX0lNUExfRElBTE9HX0RFU0NSSVBUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSksIElKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTKTsKLQotICAgICAgICAgICAgICAgIGludCByZXR1cm5Db2RlID0gc2VsZWN0aW9uRGlhbG9nLm9wZW4oKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0dXJuQ29kZSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBzZWxlY3RlZENvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBzZWxlY3Rpb25EaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGVkSW1wbGVtZW50YXRpb24gPSBzZWxlY3RlZENvbXBpbGF0aW9uVW5pdC5maW5kUHJpbWFyeVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGltcGxzID0gQXJyYXlzLmFzTGlzdChzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvLmdldEl0ZW1zKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWltcGxzLmNvbnRhaW5zKHNlbGVjdGVkSW1wbGVtZW50YXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIAlzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvLmFkZChzZWxlY3RlZEltcGxlbWVudGF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvLnNldFRleHQoc2VsZWN0ZWRJbXBsZW1lbnRhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotICAgICAgICByZXR1cm4gSU1QTF9TRUxFQ1RJT05fU1RBVFVTOwotICAgIH0KLSAgICAKLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVJbXBsZW1lbnRhdGlvblNlbGVjdGlvbigpIHsKLSAgICAgICAgSVR5cGUgaW1wbFR5cGUgPSBKRFRVdGlscy5nZXRUeXBlKG1vZGVsLmdldFByb2plY3ROYW1lKCksIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uZ2V0VGV4dCgpKTsKLSAgICAgICAgaWYgKGltcGxUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSU1ldGhvZFtdIHNlaU1ldGhvZHMgPSBzdGFydGluZ1BvaW50VHlwZS5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJTWV0aG9kIHNlaU1ldGhvZCA6IHNlaU1ldGhvZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgSU1ldGhvZFtdIGltcGxNZXRob2QgPSBpbXBsVHlwZS5maW5kTWV0aG9kcyhzZWlNZXRob2QpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW1wbE1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIAlJTVBMX1NFTEVDVElPTl9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAJICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKENYRkNyZWF0aW9uVUlNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTVVTVF9JTVBMRU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbXBsZW1lbnRzTWVzc2FnZShzdGFydGluZ1BvaW50VHlwZSwgc2VpTWV0aG9kKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgSU1QTF9TRUxFQ1RJT05fU1RBVFVTID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZShzdGFydGluZ1BvaW50VHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAJSU1QTF9TRUxFQ1RJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgCSAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuYmluZChDWEZDcmVhdGlvblVJTWVzc2FnZXMuV0VCU0VSVklDRV9JTVBMRU1FTlRBVElPTl9OT1RfRk9VTkQsCi0gICAgICAgICAgICAgICAgICAgIAkJc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5nZXRUZXh0KCkpKTsgICAKLSAgICAgICAgfSAgICAgICAgCi0JfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW1wbGVtZW50c01lc3NhZ2UoSVR5cGUgc2VpVHlwZSwgSU1ldGhvZCBzZWlNZXRob2QpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1aWxkZXIoc2VpVHlwZS5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtZXNzYWdlLmFwcGVuZChzZWlNZXRob2QuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIoIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMgPSBzZWlNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlclR5cGUgPSBTaWduYXR1cmUudG9TdHJpbmcocGFyYW1ldGVyVHlwZXNbaV0pOwotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQocGFyYW1ldGVyVHlwZSk7Ci0gICAgICAgICAgICBpZiAoaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2UudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NTZWxlY3RTRUlXaWRnZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTU2VsZWN0U0VJV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWU0MDkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NTZWxlY3RTRUlXaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0RlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKYXZhMldTU2VsZWN0U0VJV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVORFBPSU5UX0lOVEVSRkFDRSA9ICJlbmRwb2ludEludGVyZmFjZSI7Ci0gICAgCi0gICAgcHJpdmF0ZSBTaW1wbGVXaWRnZXRDb250cmlidXRvciBjbGFzc1dpZGdldENvbnRyaWJ1dG9yOwotICAgIHByaXZhdGUgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IgaW50ZXJmYWNlV2lkZ2V0Q29udHJpYnV0b3I7Ci0gICAgCi0gICAgcHJpdmF0ZSBKYXZhMldTQ2xhc3NDb25maWdXaWRnZXQgamF2YTJXU0NsYXNzQ29uZmlnV2lkZ2V0ID0gbmV3IEphdmEyV1NDbGFzc0NvbmZpZ1dpZGdldCgpOwotICAgIHByaXZhdGUgSmF2YTJXU0ludGVyZmFjZUNvbmZpZ1dpZGdldCBqYXZhMldTSW50ZXJmYWNlQ29uZmlnV2lkZ2V0ID0gbmV3IEphdmEyV1NJbnRlcmZhY2VDb25maWdXaWRnZXQoKTsKLQotICAgIHByaXZhdGUgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIElUeXBlIHN0YXJ0aW5nUG9pbnRUeXBlOwotCi0gICAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldEZpcnN0TmFtZWRXaWRnZXQoKSB7Ci0gICAgICAgIGlmIChzdGFydGluZ1BvaW50VHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGludGVyZmFjZVdpZGdldENvbnRyaWJ1dG9yID09IG51bGwgfHwgY2xhc3NXaWRnZXRDb250cmlidXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0YXJ0aW5nUG9pbnRUeXBlLmlzSW50ZXJmYWNlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW50ZXJmYWNlV2lkZ2V0Q29udHJpYnV0b3I7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0aW5nUG9pbnRUeXBlLmlzQ2xhc3MoKSkgewotICAgICAgICAgICAgICAgIGNoZWNrRm9yU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzV2lkZ2V0Q29udHJpYnV0b3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRm9yU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIElBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBzdGFydGluZ1BvaW50VHlwZS5nZXRBbm5vdGF0aW9ucygpOwotICAgICAgICBmb3IgKElBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgewotICAgICAgICAgICAgaWYgKGFubm90YXRpb24uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgSU1lbWJlclZhbHVlUGFpcltdIG1lbWJlclZhbHVlUGFpcnMgPSBhbm5vdGF0aW9uLmdldE1lbWJlclZhbHVlUGFpcnMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKElNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyIDogbWVtYmVyVmFsdWVQYWlycykgewotICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyLmdldE1lbWJlck5hbWUoKS5lcXVhbHMoRU5EUE9JTlRfSU5URVJGQUNFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuZHBvaW50SW50ZXJmYWNlID0gbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIElUeXBlIHNlaVR5cGUgPSBzdGFydGluZ1BvaW50VHlwZS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKGVuZHBvaW50SW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWlUeXBlICE9IG51bGwgJiYgc2VpVHlwZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKGVuZHBvaW50SW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXROZXh0TmFtZWRXaWRnZXQoSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Q29udHJpYnV0b3IpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIHsKLSAgICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoSmF2YTJXU0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLAotICAgICAgICAgICAgICAgICJKYXZhMldTRGF0YU1vZGVsIiwgSmF2YTJXU1NlbGVjdFNFSVdpZGdldEZhY3RvcnkuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEphdmEyV1NEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLSAgICAgICAgICAgICAgICAiSmF2YVN0YXJ0aW5nUG9pbnRUeXBlIiwgSmF2YTJXU1NlbGVjdFNFSVdpZGdldEZhY3RvcnkuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YTJXU0RhdGFNb2RlbChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICAgICAgamF2YTJXU0NsYXNzQ29uZmlnV2lkZ2V0LnNldEphdmEyV1NEYXRhTW9kZWwobW9kZWwpOwotICAgICAgICBqYXZhMldTSW50ZXJmYWNlQ29uZmlnV2lkZ2V0LnNldEphdmEyV1NEYXRhTW9kZWwobW9kZWwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmFTdGFydGluZ1BvaW50VHlwZShJVHlwZSBzdGFydGluZ1BvaW50VHlwZSkgewotICAgICAgICB0aGlzLnN0YXJ0aW5nUG9pbnRUeXBlID0gc3RhcnRpbmdQb2ludFR5cGU7Ci0gICAgICAgIGphdmEyV1NDbGFzc0NvbmZpZ1dpZGdldC5zZXRKYXZhU3RhcnRpbmdQb2ludFR5cGUoc3RhcnRpbmdQb2ludFR5cGUpOwotICAgICAgICBqYXZhMldTSW50ZXJmYWNlQ29uZmlnV2lkZ2V0LnNldEphdmFTdGFydGluZ1BvaW50VHlwZShzdGFydGluZ1BvaW50VHlwZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gICAgICAgIGNsYXNzV2lkZ2V0Q29udHJpYnV0b3IgPSBuZXcgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IoKTsKLSAgICAgICAgQ1hGQ29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLSAgICAgICAgU3RyaW5nIGNsYXNzQ29uZmlnVGl0bGUgPSBDWEZDcmVhdGlvblVJTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19DTEFTU19DT05GSUdfUEFHRV9USVRMRSwgCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde2NvbnRleHQuZ2V0Q3hmUnVudGltZUVkaXRpb24oKSwgY29udGV4dC5nZXRDeGZSdW50aW1lVmVyc2lvbigpfSk7Ci0gICAgICAgIGNsYXNzV2lkZ2V0Q29udHJpYnV0b3Iuc2V0VGl0bGUoY2xhc3NDb25maWdUaXRsZSk7Ci0gICAgICAgIGNsYXNzV2lkZ2V0Q29udHJpYnV0b3IKLSAgICAgICAgICAgICAgICAuc2V0RGVzY3JpcHRpb24oQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfQ0xBU1NfQ09ORklHX1BBR0VfREVTQ1JJUFRJT04pOwotICAgICAgICBjbGFzc1dpZGdldENvbnRyaWJ1dG9yLnNldEZhY3RvcnkobmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGphdmEyV1NDbGFzc0NvbmZpZ1dpZGdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgaW50ZXJmYWNlV2lkZ2V0Q29udHJpYnV0b3IgPSBuZXcgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IoKTsKLSAgICAgICAgU3RyaW5nIGludGVyZmFjZUNvbmZpZ1RpdGxlID0gQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfSU5URVJGQUNFX0NPTkZJR19QQUdFX1RJVExFLAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtjb250ZXh0LmdldEN4ZlJ1bnRpbWVFZGl0aW9uKCksIGNvbnRleHQuZ2V0Q3hmUnVudGltZVZlcnNpb24oKX0pOwotICAgICAgICBpbnRlcmZhY2VXaWRnZXRDb250cmlidXRvci5zZXRUaXRsZShpbnRlcmZhY2VDb25maWdUaXRsZSk7Ci0gICAgICAgIGludGVyZmFjZVdpZGdldENvbnRyaWJ1dG9yCi0gICAgICAgICAgICAgICAgLnNldERlc2NyaXB0aW9uKENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX0lOVEVSRkFDRV9DT05GSUdfUEFHRV9ERVNDUklQVElPTik7Ci0gICAgICAgIGludGVyZmFjZVdpZGdldENvbnRyaWJ1dG9yLnNldEZhY3RvcnkobmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGphdmEyV1NJbnRlcmZhY2VDb25maWdXaWRnZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ29uZmlnV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDb25maWdXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5MWQ0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDb25maWdXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzLlBhY2thZ2VOYW1lRWRpdGluZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzLlBhY2thZ2VOYW1lVGFibGVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzLldTREwySmF2YVdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFDb25maWdXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgewotICAgIHByaXZhdGUgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLSAgICBwcml2YXRlIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyOwotCi0gICAgcHJpdmF0ZSBXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWw7Ci0gICAgCi0gICAgcHJpdmF0ZSBDb21ibyBvdXRwdXREaXJDb21ibzsKLSAgICBwcml2YXRlIFRleHQgcGFja2FnZU5hbWVUZXh0OwotICAgIHByaXZhdGUgQnV0dG9uIG5hbWVzcGFjZU1hcHBpbmdCdXR0b247Ci0gICAgcHJpdmF0ZSBUYWJsZVZpZXdlciBwYWNrYWdlTmFtZVRhYmxlVmlld2VyOwotICAgIHByaXZhdGUgQ29tYm8gc2VydmljZU5hbWVDb21ibzsKLSAgICBwcml2YXRlIExpc3QgYmluZGluZ0ZpbGVzTGlzdDsKLSAgICAKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXI7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbmFtZXNwYWNlQ29tcG9zaXRlOwotICAgIHByaXZhdGUgaW50IG5hbWVzcGFjZUNvbXBvc2l0ZUhlaWdodCA9IC0xOwotCi0gICAgcHVibGljIFdTREwySmF2YUNvbmZpZ1dpZGdldCgpIHsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0V1NETDJKYXZhRGF0YU1vZGVsKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGludGVybmFsaXplKCkgewotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LnBvcHVsYXRlT3V0cHV0RGlyZWN0b3J5Q29tYm8ob3V0cHV0RGlyQ29tYm8sIG1vZGVsLmdldFByb2plY3ROYW1lKCkpOwotICAgICAgICBwYWNrYWdlTmFtZVRleHQuc2V0VGV4dChtb2RlbC5nZXRJbmNsdWRlZE5hbWVzcGFjZXMoKS5nZXQobW9kZWwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKTsKLSAgICAgICAgbmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICBleHBhbmROYW1lc3BhY2VDb21wb3NpdGUoZmFsc2UpOwotICAgICAgICBpZiAocGFja2FnZU5hbWVUYWJsZVZpZXdlciAhPSBudWxsICYmIHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFja2FnZU5hbWVUYWJsZVZpZXdlci5zZXRJbnB1dChtb2RlbC5nZXRXc2RsRGVmaW5pdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LnBvcHVsYXRlU2VydmljZU5hbWVDb21ibyhzZXJ2aWNlTmFtZUNvbWJvLCBtb2RlbCk7Ci0KLSAgICAgICAgYmluZGluZ0ZpbGVzTGlzdC5yZW1vdmVBbGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikgewotICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgdGhpcy5zdGF0dXNMaXN0ZW5lciA9IHN0YXR1c0xpc3RlbmVyOwotCi0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBtYWluQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotICAgICAgICBtYWluQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBtYWluQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vIE91dHB1dCBEaXIKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVPdXRwdXREaXJlY3RvcnlMYWJlbChtYWluQ29tcG9zaXRlKTsKLQotICAgICAgICBvdXRwdXREaXJDb21ibyA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlT3V0cHV0RGlyZWN0b3J5Q29tYm8obWFpbkNvbXBvc2l0ZSwgbW9kZWwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBvdXRwdXREaXJDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBQYWNrYWdlIE5hbWU6Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUGFja2FnZU5hbWVMYWJlbChtYWluQ29tcG9zaXRlKTsKLQotICAgICAgICBwYWNrYWdlTmFtZVRleHQgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhY2thZ2VOYW1lVGV4dChtYWluQ29tcG9zaXRlLCBtb2RlbCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBwYWNrYWdlTmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWVUZXh0LmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBKRFRVdGlscy52YWxpZGF0ZVBhY2thZ2VOYW1lKG1vZGVsLmdldFByb2plY3ROYW1lKCksIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbmFtZXNwYWNlTWFwcGluZ0J1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlTmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24obWFpbkNvbXBvc2l0ZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIG5hbWVzcGFjZU1hcHBpbmdCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIG5hbWVzcGFjZU1hcHBpbmdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBleHBhbmROYW1lc3BhY2VDb21wb3NpdGUobmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlciA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy8gU2VydmljZSBOYW1lOgotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVNlcnZpY2VOYW1lTGFiZWwobWFpbkNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgc2VydmljZU5hbWVDb21ibyA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlU2VydmljZU5hbWVDb21ibyhtYWluQ29tcG9zaXRlLCBtb2RlbCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIHNlcnZpY2VOYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgTGFiZWwgYmluZGluZ0ZpbGVzTGFiZWwgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUJpbmRpbmdGaWxlc0xhYmVsKG1haW5Db21wb3NpdGUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDM7Ci0gICAgICAgIGJpbmRpbmdGaWxlc0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGJpbmRpbmdGaWxlc0xpc3QgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUJpbmRpbmdGaWxlc0xpc3QobWFpbkNvbXBvc2l0ZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAzOwotICAgICAgICBiaW5kaW5nRmlsZXNMaXN0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEJ1dHRvbiBhZGRCaW5kaW5nRmlsZUJ1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlQWRkQmluZGluZ0ZpbGVCdXR0b24obWFpbkNvbXBvc2l0ZSwgbW9kZWwsCi0gICAgICAgICAgICAgICAgYmluZGluZ0ZpbGVzTGlzdCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgYWRkQmluZGluZ0ZpbGVCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgQnV0dG9uIHJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVSZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbihtYWluQ29tcG9zaXRlLAotICAgICAgICAgICAgICAgIG1vZGVsLCBiaW5kaW5nRmlsZXNMaXN0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICByZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhZGRpbmdMYWJlbChtYWluQ29tcG9zaXRlKTsKLQotICAgICAgICAvKgotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhNTENhdGFsb2dMYWJlbChtYWluQ29tcG9zaXRlKTsKLQotICAgICAgICBUZXh0IHhtbENhdGFsb2dUZXh0ID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYTUxDYXRhbG9nVGV4dChtYWluQ29tcG9zaXRlLCBtb2RlbCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB4bWxDYXRhbG9nVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhNTENhdGFsb2dCcm93c2VCdXR0b24obWFpbkNvbXBvc2l0ZSk7Ci0gICAgICAgICAqLwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXhwYW5kTmFtZXNwYWNlQ29tcG9zaXRlKGJvb2xlYW4gZXhwYW5kKSB7Ci0gICAgICAgIGlmIChleHBhbmQpIHsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VDb21wb3NpdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSA3OwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIucGFjaygpOwotCi0gICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlID0gZ2V0TmFtZXNwYWNlTWFwcGluZ0NvbXBvc2l0ZShuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VDb21wb3NpdGVIZWlnaHQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgUG9pbnQgZ3JvdXBTaXplID0gbmFtZXNwYWNlQ29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhlaWdodCA9IGdyb3VwU2l6ZS55OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTaGVsbCBzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotICAgICAgICAgICAgICAgIFBvaW50IHNoZWxsU2l6ZSA9IHNoZWxsLmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICBzaGVsbC5zZXRTaXplKHNoZWxsU2l6ZS54LCBzaGVsbFNpemUueSArIG5hbWVzcGFjZUNvbXBvc2l0ZUhlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIubGF5b3V0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIucGFjaygpOwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIubGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLSAgICAgICAgICAgICAgICBQb2ludCBzaGVsbFNpemUgPSBzaGVsbC5nZXRTaXplKCk7Ci0gICAgICAgICAgICAgICAgc2hlbGwuc2V0U2l6ZShzaGVsbFNpemUueCwgc2hlbGxTaXplLnkgLSBuYW1lc3BhY2VDb21wb3NpdGVIZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgQ29tcG9zaXRlIGdldE5hbWVzcGFjZU1hcHBpbmdDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFRhYmxlIHBhY2thZ2VOYW1lVGFibGUgPSBjcmVhdGVOYW1lc3BhY2VNYXBwaW5nVGFibGUobmFtZXNwYWNlQ29tcG9zaXRlKTsKLQotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDY7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZUNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRhYmxlIGNyZWF0ZU5hbWVzcGFjZU1hcHBpbmdUYWJsZShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIocGFyZW50LCBTV1QuQ0hFQ0sgfCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSCi0gICAgICAgICAgICAgICAgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCi0gICAgICAgIFRhYmxlIHBhY2thZ2VOYW1lVGFibGUgPSBwYWNrYWdlTmFtZVRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0KLSAgICAgICAgVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlV1NETE5hbWVzcGFjZVZpZXdlckNvbHVtbihwYWNrYWdlTmFtZVRhYmxlVmlld2VyKTsKLQotICAgICAgICBDb2x1bW5XZWlnaHREYXRhIGNvbHVtbldlaWdodERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMDAsIDEwMCwgdHJ1ZSk7Ci0gICAgICAgIHRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sdW1uV2VpZ2h0RGF0YSk7Ci0KLSAgICAgICAgVGFibGVWaWV3ZXJDb2x1bW4gcGFja2FnZU5hbWVWaWV3ZXJDb2x1bW4gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhY2thZ2VOYW1lQ29sdW1uKAotICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIsIG1vZGVsKTsKLSAgICAgICAgCi0gICAgICAgIFRleHRDZWxsRWRpdG9yIHRleHRDZWxsRWRpdG9yID0gbmV3IFRleHRDZWxsRWRpdG9yKHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIuZ2V0VGFibGUoKSk7Ci0gICAgICAgIHRleHRDZWxsRWRpdG9yLmFkZExpc3RlbmVyKCBuZXcgSUNlbGxFZGl0b3JMaXN0ZW5lcigpIHsKLQkJCi0JCQlwdWJsaWMgdm9pZCBlZGl0b3JWYWx1ZUNoYW5nZWQoYm9vbGVhbiBvbGRWYWxpZFN0YXRlLCBib29sZWFuIG5ld1ZhbGlkU3RhdGUpIHsKLQkJCQlzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsJCQkJCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgY2FuY2VsRWRpdG9yKCkgewotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIGFwcGx5RWRpdG9yVmFsdWUoKSB7Ci0JCQl9Ci0JCX0pOwotICAgICAgICAKLSAgICAgICAgdGV4dENlbGxFZGl0b3Iuc2V0VmFsaWRhdG9yKG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQkJCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IHBhY2thZ2VOYW1lKSB7Ci0JICAgICAgICAgICAgc3RhdHVzID0gSkRUVXRpbHMudmFsaWRhdGVQYWNrYWdlTmFtZShtb2RlbC5nZXRQcm9qZWN0TmFtZSgpLCBwYWNrYWdlTmFtZS50b1N0cmluZygpKTsKLQkgICAgICAgICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSykgewotCSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgcmV0dXJuIHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCQl9Ci0JCX0pOwotCi0gICAgICAgIHBhY2thZ2VOYW1lVmlld2VyQ29sdW1uLnNldEVkaXRpbmdTdXBwb3J0KG5ldyBQYWNrYWdlTmFtZUVkaXRpbmdTdXBwb3J0KHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIsCi0gICAgICAgIAkJdGV4dENlbGxFZGl0b3IsIG1vZGVsKSk7Ci0KLSAgICAgICAgY29sdW1uV2VpZ2h0RGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCwgMTAwLCB0cnVlKTsKLSAgICAgICAgdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2x1bW5XZWlnaHREYXRhKTsKLQotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUGFja2FnZU5hbWVUYWJsZUNvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZVZpZXdlci5zZXRJbnB1dChtb2RlbC5nZXRXc2RsRGVmaW5pdGlvbigpKTsKLQotICAgICAgICBUYWJsZUl0ZW1bXSB0YWJsZUl0ZW1zID0gcGFja2FnZU5hbWVUYWJsZS5nZXRJdGVtcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlSXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSB0YWJsZUl0ZW1zW2ldOwotICAgICAgICAgICAgaWYgKG1vZGVsLmdldEluY2x1ZGVkTmFtZXNwYWNlcygpLmNvbnRhaW5zS2V5KHRhYmxlSXRlbS5nZXRUZXh0KDApKSkgewotICAgICAgICAgICAgICAgIHRhYmxlSXRlbS5zZXRDaGVja2VkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZVRhYmxlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDb25maWdXaWRnZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDb25maWdXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZWRkMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhQ29uZmlnV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIHdzZGwySmF2YVdpZGdldENvbnRyaWJ1dG9yOwotICAgIHByaXZhdGUgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3Igd3NkbDJKYXZhRGVmYXVsdHNXaWRnZXRDb250cmlidXRvcjsKLQotICAgIHByaXZhdGUgV1NETDJKYXZhQ29uZmlnV2lkZ2V0IHdzZGwySmF2YUNvbmZpZ1dpZGdldCA9IG5ldyBXU0RMMkphdmFDb25maWdXaWRnZXQoKTsKLSAgICBwcml2YXRlIFdTREwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0IHdzZGwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0ID0gbmV3IFdTREwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0KCk7Ci0gICAgCi0gICAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldEZpcnN0TmFtZWRXaWRnZXQoKSB7Ci0gICAgICAgIGlmICgod3NkbDJKYXZhV2lkZ2V0Q29udHJpYnV0b3IgPT0gbnVsbCB8fCB3c2RsMkphdmFEZWZhdWx0c1dpZGdldENvbnRyaWJ1dG9yID09IG51bGwpKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdzZGwySmF2YVdpZGdldENvbnRyaWJ1dG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXROZXh0TmFtZWRXaWRnZXQoSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Q29udHJpYnV0b3IpIHsKLSAgICAgICAgaWYgKHdpZGdldENvbnRyaWJ1dG9yID09IHdzZGwySmF2YVdpZGdldENvbnRyaWJ1dG9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gd3NkbDJKYXZhRGVmYXVsdHNXaWRnZXRDb250cmlidXRvcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotICAgICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMMkphdmFEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLSAgICAgICAgICAgICAgICAiV1NETDJKYXZhRGF0YU1vZGVsIiwgV1NETDJKYXZhQ29uZmlnV2lkZ2V0RmFjdG9yeS5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMMkphdmFEYXRhTW9kZWwoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHdzZGwySmF2YUNvbmZpZ1dpZGdldC5zZXRXU0RMMkphdmFEYXRhTW9kZWwobW9kZWwpOwotICAgICAgICB3c2RsMkphdmFEZWZhdWx0c0NvbmZpZ1dpZGdldC5zZXRXU0RMMkphdmFEYXRhTW9kZWwobW9kZWwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICB3c2RsMkphdmFXaWRnZXRDb250cmlidXRvciA9IG5ldyBTaW1wbGVXaWRnZXRDb250cmlidXRvcigpOwotICAgICAgICBDWEZDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXU0RMMkphdmFDb250ZXh0KCk7Ci0gICAgICAgIFN0cmluZyB3c2RsMkphdmFQYWdlVGl0bGUgPSBDWEZDcmVhdGlvblVJTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuV1NETDJKQVZBX1BBR0VfVElUTEUsIG5ldyBPYmplY3RbXXtjb250ZXh0LmdldEN4ZlJ1bnRpbWVFZGl0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldEN4ZlJ1bnRpbWVWZXJzaW9uKCl9KTsKLSAgICAgICAgd3NkbDJKYXZhV2lkZ2V0Q29udHJpYnV0b3Iuc2V0VGl0bGUod3NkbDJKYXZhUGFnZVRpdGxlKTsKLSAgICAgICAgd3NkbDJKYXZhV2lkZ2V0Q29udHJpYnV0b3IKLSAgICAgICAgICAgICAgICAuc2V0RGVzY3JpcHRpb24oQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmJpbmQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLldTREwySkFWQV9QQUdFX0RFU0NSSVBUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRDeGZSdW50aW1lRWRpdGlvbigpKSk7Ci0gICAgICAgIHdzZGwySmF2YVdpZGdldENvbnRyaWJ1dG9yLnNldEZhY3RvcnkobmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHdzZGwySmF2YUNvbmZpZ1dpZGdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgd3NkbDJKYXZhRGVmYXVsdHNXaWRnZXRDb250cmlidXRvciA9IG5ldyBTaW1wbGVXaWRnZXRDb250cmlidXRvcigpOwotICAgICAgICBTdHJpbmcgd3NkbDJKYXZhRGVmYXVsdHNQYWdlVGl0bGUgPSBDWEZDcmVhdGlvblVJTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuV1NETDJKQVZBX0RFRkFVTFRTX1BBR0VfVElUTEUsIG5ldyBPYmplY3RbXXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0Q3hmUnVudGltZUVkaXRpb24oKSwgY29udGV4dC5nZXRDeGZSdW50aW1lVmVyc2lvbigpfSk7Ci0gICAgICAgIHdzZGwySmF2YURlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3Iuc2V0VGl0bGUod3NkbDJKYXZhRGVmYXVsdHNQYWdlVGl0bGUpOwotICAgICAgICB3c2RsMkphdmFEZWZhdWx0c1dpZGdldENvbnRyaWJ1dG9yCi0gICAgICAgICAgICAgICAgLnNldERlc2NyaXB0aW9uKENYRkNyZWF0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfREVGQVVMVFNfUEFHRV9ERVNDUklQVElPTik7Ci0gICAgICAgIHdzZGwySmF2YURlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3Iuc2V0RmFjdG9yeShuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgewotICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gd3NkbDJKYXZhRGVmYXVsdHNDb25maWdXaWRnZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL1dTREwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFEZWZhdWx0c0NvbmZpZ1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDJkNjRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL1dTREwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5XU0RMMkphdmFXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdTREwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIHsKLSAgICBwcml2YXRlIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbDsKLSAgICAKLSAgICBwdWJsaWMgV1NETDJKYXZhRGVmYXVsdHNDb25maWdXaWRnZXQoKSB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFdTREwySmF2YURhdGFNb2RlbChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikgewotICAgICAgICBmaW5hbCBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBHcm91cCB3c2RsMmphdmFHcm91cCA9IG5ldyBHcm91cChtYWluQ29tcG9zaXRlLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0VGV4dChDWEZDcmVhdGlvblVJTWVzc2FnZXMuV1NETDJKQVZBX0dST1VQX0xBQkVMKTsKLSAgICAgICAgR3JpZExheW91dCB3c2RsMmphdmFsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0TGF5b3V0KHdzZGwyamF2YWxheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlU2VydmVyQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRGVmYXVsdFZhbHVlc0J1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVOYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgaWYgKENYRk1vZGVsVXRpbHMuaXNBdXRvTmFtZVJlc29sdXRpb25QZXJtaXR0ZWQoKSkgewotICAgICAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVBdXRvTmFtZVJlc29sdXRpb25CdXR0b24od3NkbDJqYXZhR3JvdXAsIG1vZGVsKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtb2RlbC5nZXRDeGZSdW50aW1lVmVyc2lvbigpLmNvbXBhcmVUbyhDWEZDb3JlUGx1Z2luLkNYRl9WRVJTSU9OXzJfMSkgPj0gMCkgewotICAgICAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVOb0FkZHJlc3NCaW5kaW5nQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEdyb3VwIHhqY0FyZ0dyb3VwID0gbmV3IEdyb3VwKG1haW5Db21wb3NpdGUsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICB4amNBcmdHcm91cC5zZXRUZXh0KENYRkNyZWF0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX0FSR19HUk9VUF9MQUJFTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgeGpjQXJnTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHhqY0FyZ0dyb3VwLnNldExheW91dCh4amNBcmdMYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgeGpjQXJnR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgVGFibGUgeGpjQXJnc1RhYmxlID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNBcmdUYWJsZSh4amNBcmdHcm91cCwgbW9kZWwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDY7Ci0gICAgICAgIHhqY0FyZ3NUYWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDVG9TdHJpbmdUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDTG9jYXRvclRhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNTeW5jTWV0aG9kc1RhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNNYXJrR2VuZXJhdGVkVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgbW9kZWwpOwotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL1dTREwySmF2YVByb2plY3RTZWxlY3Rpb25XaWRnZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDdjMDQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL1dTREwySmF2YVByb2plY3RTZWxlY3Rpb25XaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLlNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLlNlcnZlcldpemFyZFdpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5TZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHN0b3AgZ2FwIHdvcmthcm91bmQgZm9yIGJ1Z3MgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MzI4NiI+IzI0MzI4NjwvYT4KLSAqIGFuZCA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQzMjkwIj4jMjQzMjkwPC9hPgotICogPHA+Ci0gKiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggPGNvZGU+V1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbkNvbW1hbmQ8L2NvZGU+Ci0gKiAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB7Ci0KLQlwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0Rmlyc3ROYW1lZFdpZGdldCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldE5leHROYW1lZFdpZGdldChJTmFtZWRXaWRnZXRDb250cmlidXRvciB3aWRnZXRDb250cmlidXRvcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotCQlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkluaXRpYWxQcm9qZWN0IiwgIC8vJE5PTi1OTFMtMSQKLQkJCQlXU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZC5jbGFzcyk7Ci0JICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsICAvLyROT04tTkxTLTEkCi0JICAgIAkJV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsgLy8kTk9OLU5MUy0xJAotCSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MsICJQcm9qZWN0IiwgV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dzcnQvQ1hGV2ViU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dzcnQvQ1hGV2ViU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzkzOGI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93c3J0L0NYRldlYlNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndzcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5DbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5DWEZEZXBsb3lDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5KQVhXU0Fubm90YXRlSmF2YUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5KYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NTZWxlY3RTRUlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5KYXZhMldTVmFsaWRhdGVJbnB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YURlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5JQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5lY2xpcHNlLkVjbGlwc2VFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5BYnN0cmFjdFdlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlU2NlbmFyaW87Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgQ1hGV2ViU2VydmljZSBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZSB7Ci0KLSAgICBwdWJsaWMgQ1hGV2ViU2VydmljZShXZWJTZXJ2aWNlSW5mbyBpbmZvKSB7Ci0gICAgICAgIHN1cGVyKGluZm8pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgYXNzZW1ibGUoSUVudmlyb25tZW50IGVudmlyb25tZW50LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsZWN0aW9uLCAKLSAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGVhclByb2plY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXBsb3koSUVudmlyb25tZW50IGVudmlyb25tZW50LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsZWN0aW9uLCAKLSAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGVhclByb2plY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXZlbG9wKElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbGVjdGlvbiwKLSAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGVhclByb2plY3QpIHsKLSAgICAgICAgVmVjdG9yIGNvbW1hbmRzID0gbmV3IFZlY3RvcigpOwotCi0gICAgICAgIEVjbGlwc2VFbnZpcm9ubWVudCBlY2xpcHNlRW52aXJvbm1lbnQgPSAoRWNsaXBzZUVudmlyb25tZW50KSBlbnZpcm9ubWVudDsKLSAgICAgICAgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoZWNsaXBzZUVudmlyb25tZW50LmdldENvbW1hbmRNYW5hZ2VyKCkuZ2V0TWFwcGluZ1JlZ2lzdHJ5KCkpOwotCi0gICAgICAgIGlmIChjdHguZ2V0U2NlbmFyaW8oKS5nZXRWYWx1ZSgpID09IFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01VUCkgewotICAgICAgICAgICAgSmF2YTJXU0RhdGFNb2RlbCBqYXZhMldTRGF0YU1vZGVsID0gQ1hGRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YTJXU0RhdGFNb2RlbCgpOwotICAgICAgICAgICAgamF2YTJXU0RhdGFNb2RlbC5zZXRQcm9qZWN0TmFtZShwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICBqYXZhMldTRGF0YU1vZGVsLnNldEphdmFTdGFydGluZ1BvaW50KHRoaXMuZ2V0V2ViU2VydmljZUluZm8oKS5nZXRJbXBsVVJMKCkpOwotICAgICAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBKYXZhMldTVmFsaWRhdGVJbnB1dENvbW1hbmQoamF2YTJXU0RhdGFNb2RlbCkpOwotICAgICAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBKYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQoamF2YTJXU0RhdGFNb2RlbCkpOwotICAgICAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBKYXZhMldTU2VsZWN0U0VJQ29tbWFuZChqYXZhMldTRGF0YU1vZGVsKSk7Ci0gICAgICAgICAgICBjb21tYW5kcy5hZGQobmV3IEpBWFdTQW5ub3RhdGVKYXZhQ29tbWFuZChqYXZhMldTRGF0YU1vZGVsKSk7Ci0gICAgICAgICAgICBjb21tYW5kcy5hZGQobmV3IEphdmEyV1NDb21tYW5kKGphdmEyV1NEYXRhTW9kZWwpKTsKLSAgICAgICAgfSBlbHNlIGlmIChjdHguZ2V0U2NlbmFyaW8oKS5nZXRWYWx1ZSgpID09IFdlYlNlcnZpY2VTY2VuYXJpby5UT1BET1dOKSB7Ci0gICAgICAgICAgICBXU0RMMkphdmFEYXRhTW9kZWwgd3NkbDJKYXZhRGF0YU1vZGVsID0gQ1hGRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1NETDJKYXZhRGF0YU1vZGVsKCk7Ci0gICAgICAgICAgICB3c2RsMkphdmFEYXRhTW9kZWwuc2V0UHJvamVjdE5hbWUocHJvamVjdE5hbWUpOwotICAgICAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBXU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZCh3c2RsMkphdmFEYXRhTW9kZWwpKTsKLSAgICAgICAgICAgIGNvbW1hbmRzLmFkZChuZXcgV1NETDJKYXZhRGVmYXVsdGluZ0NvbW1hbmQod3NkbDJKYXZhRGF0YU1vZGVsLCBwcm9qZWN0TmFtZSwgCi0gICAgICAgICAgICAJCWdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0V3NkbFVSTCgpKSk7Ci0gICAgICAgICAgICBjb21tYW5kcy5hZGQobmV3IFdTREwySmF2YUNvbW1hbmQod3NkbDJKYXZhRGF0YU1vZGVsLCB0aGlzKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotICAgICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhMldTQ29tbWFuZC5jbGFzcywgIkNYRkRhdGFNb2RlbCIsIENYRkRlcGxveUNvbW1hbmQuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTREwySmF2YUNvbW1hbmQuY2xhc3MsICJDWEZEYXRhTW9kZWwiLCBDWEZEZXBsb3lDb21tYW5kLmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDWEZEZXBsb3lDb21tYW5kLmNsYXNzLCAiQ2xpZW50Q29tcG9uZW50VHlwZSIsICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgaW5zdGFsbChJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24sIAotICAgICAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgZWFyUHJvamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IHJ1bihJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24sIAotICAgICAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgZWFyUHJvamVjdCkgewotICAgICAgICBWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIGNvbW1hbmRzLmFkZChuZXcgQ1hGRGVwbG95Q29tbWFuZChwcm9qZWN0TmFtZSwgdGhpcykpOwotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KGNvbW1hbmRzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgV2ViU2VydmljZUluZm8gZ2V0V2ViU2VydmljZUluZm8oKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRXZWJTZXJ2aWNlSW5mbygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93c3J0L0NYRldlYlNlcnZpY2VSdW50aW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd3NydC9DWEZXZWJTZXJ2aWNlUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OThjNjg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93c3J0L0NYRldlYlNlcnZpY2VSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLndzcnQuQ1hGV2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5BYnN0cmFjdFdlYlNlcnZpY2VSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklXZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VDbGllbnRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VJbmZvOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIENYRldlYlNlcnZpY2VSdW50aW1lIGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlUnVudGltZSB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVdlYlNlcnZpY2UgZ2V0V2ViU2VydmljZShXZWJTZXJ2aWNlSW5mbyBpbmZvKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ1hGV2ViU2VydmljZShpbmZvKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVdlYlNlcnZpY2VDbGllbnQgZ2V0V2ViU2VydmljZUNsaWVudChXZWJTZXJ2aWNlQ2xpZW50SW5mbyBpbmZvKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ1hGV2ViU2VydmljZUNsaWVudChpbmZvKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzIxZDBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MDM0MWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhZGQxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jRnJpIE5vdiAwNyAyMzo1ODo1NSBFU1QgMjAwOAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZDc5OGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC40LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLmRpYWxvZ3M7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnZpZXdlcnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aSxvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aSxvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpIgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZTtidW5kbGUtdmVyc2lvbj0iMC40LjMiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBqYXZheC53c2RsO2J1bmRsZS12ZXJzaW9uPSJbMS42LjIsMS43LjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjtidW5kbGUtdmVyc2lvbj0iWzEuMC4zMDUsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4yMDQsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlO2J1bmRsZS12ZXJzaW9uPSIwLjUuMCIKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNy4wCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUNyZWF0ZWQtQnk6IDEuNS4wXzE0LWIwMyAoU3VuIE1pY3Jvc3lzdGVtcyBJbmMuKQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMTY5YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+U2VwdGVtYmVyIDEyLCAyMDA4PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0YjhlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxYjg5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1DWEYgV2ViIFNlcnZpY2VzIFVJIChJbmN1YmF0aW9uKQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotUFJFRkVSRU5DRV9DQVRFR09SWV9DWEZfUlVOVElNRT1DWEYgMi54IFByZWZlcmVuY2VzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2RiNzM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnByZWZlcmVuY2VzLm5hbWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5wcmVmZXJlbmNlcy5DWEZSdW50aW1lUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS5DWEZSdW50aW1lUHJlZmVyZW5jZXNQYWdlIgotICAgICAgICAgICAgbmFtZT0iJVBSRUZFUkVOQ0VfQ0FURUdPUllfQ1hGX1JVTlRJTUUiPgotICAgICAgPC9wYWdlPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9DWEZVSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvQ1hGVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzU2YTRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9DWEZVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBDWEZVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSW1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX0hPTUVfVEFCX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1JVTlRJTUVfSE9NRV9UQUJfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQ1hGX0hPTUVfRElSX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX05PVF9TRVQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0JST1dTRV9CVVRUT05fTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0NYRl9WRVJTT05fTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1BSRUZFUkVOQ0VTX1RBQl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfUFJFRkVSRU5DRVNfVEFCX1RPT0xUSVA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTRExfUFJFRkVSRU5DRVNfVEFCX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU0RMX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTlNfUFJFRkVSRU5DRVNfVEFCX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTlNfUFJFRkVSRU5DRVNfVEFCX1RPT0xUSVA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUFJFRkVSRU5DRVNfVEFCX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNQUklOR19DT05GSUdfUFJFRkVSRU5DRVNfVEFCX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU1BSSU5HX0NPTkZJR19QUkVGRVJFTkNFU19UQUJfVE9PTFRJUDsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OU19QUkVGRVJFTkNFU19MSU5LOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9ERUZBVUxUX0ZST05URU5EX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9ERUZBVUxUX0RBVEFCSU5ESU5HX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR1JPVVBfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU0RMX0dST1VQX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9HUk9VUF9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dFTl9DTElFTlRfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19HRU5fU0VSVkVSX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR0VOX0lNUExFTUVOVEFUSU9OX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR0VOX1dSQVBQRVJfRkFVTFRfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19HRU5fV1NETF9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0RFRkFVTFRfU09BUEJJTkRJTkdfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19HRU5fWFNEX0lNUE9SVFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX0lOVkFMSURfVkVSU0lPTl9GT1JNQVQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1ZFUlNJT05fTk9UX1NQRUNJRklFRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTUFJJTkdfQ09ORklHX0dST1VQX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNQUklOR19DT05GSUdfVVNFX0NYRl9TRVJWTEVUOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNQUklOR19DT05GSUdfVVNFX0NYRl9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUFJPQ0VTU19TT0FQX0hFQURFUlM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9NQVBQSU5HOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9VU0VfREVGQVVMVF9FWENMVURFU19OQU1FU1BBQ0VfTUFQUElORzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfV1NETF9WRVJTSU9OX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9VU0VfREVGQVVMVF9WQUxVRVM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19BTk5PVEFUSU9OU19HUk9VUF9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19BTk5PVEFUSU9OU19HUk9VUF9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0dFTkVSQVRFX1dFQl9NRVRIT0Q7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfR0VORVJBVEVfV0VCX1BBUkFNOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0FOTk9UQVRJT05TX1BST0NFU1NJTkdfR1JPVVBfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfRU5BQkxFX0FOTk9UQVRJT05fUFJPQ0VTU0lORzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19FTkFCTEVfQU5OT1RBVElPTl9QUk9DRVNTSU5HX1RPT0xUSVA7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TT0FQMTJfQklORElOR19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfQ1JFQVRFX1hTRF9JTVBPUlRTX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19EQVRBQklORElOR19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfRlJPTlRFTkRfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dFTkVSQVRFX1dTRExfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dFTkVSQVRFX1dSQVBQRVJCRUFOX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19HRU5FUkFURV9DTElFTlRfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dFTkVSQVRFX1NFUlZFUl9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR0VORVJBVEVfQU5UX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19CRUFOU19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfVEFSR0VUX05BTUVTUEFDRV9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VSVklDRV9OQU1FX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19QT1JUX05BTUVfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0FERFJFU1NfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfV1NETF9GSUxFX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19PVVRQVVRfRklMRV9UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19VU0VfU0VJX0JVVFRPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1VTRV9TRUlfSU5GT19MQUJFTDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX1NFSTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1NFTEVDVF9TRUlfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfU0VJX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19CUk9XU0VfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19FWFRSQUNUX1NFSTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0VYVFJBQ1RfU0VJX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfRVhUUkFDVF9TRUlfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0VYVFJBQ1RfTUVNQkVSU19MQUJFTDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX0FMTF9CVVRUT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19ERVNFTEVDVF9BTExfQlVUVE9OOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfSU1QTEVNRU5UQVRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfSU1QTEVNRU5UQVRJT05fVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9GUk9OVEVORF9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9EQVRBQklORElOR19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9XU0RMX1ZFUlNJT05fVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfR0VORVJBVEVfSU1QTEVNRU5UQVRJT05fVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfR0VORVJBVEVfQ0xJRU5UX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0dFTkVSQVRFX1NFUlZFUl9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9ERUZBVUxUX1ZBTFVFU19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9FWENMVURFX05BTUVTUEFDRV9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9QUk9DRVNTX1NPQVBfSEVBREVSU19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9ERUZBVUxUX05BTUVTUEFDRV9MT0FESU5HX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0VYQ0xVREVfTkFNRVNQQUNFX0xPQURJTkdfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfV1NETF9MT0NBVElPTl9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9OT19BRERSRVNTX0JJTkRJTkc7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX05PX0FERFJFU1NfQklORElOR19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9BVVRPX05BTUVfUkVTT0xVVElPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfQVVUT19OQU1FX1JFU09MVVRJT05fVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWE1MX0NBVEFMT0dfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0FSR1NfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0FSR19HUk9VUF9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0FSR19DT0xVTU5fTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0RFU0NSSVBUSU9OX0NPTFVNTl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YSkNfREVGQVVMVF9WQUxVRVM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hKQ19UT1NUUklORzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX1RPU1RSSU5HX01VTFRJTElORTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX1RPU1RSSU5HX1NJTVBMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0xPQ0FUT1I7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hKQ19TWU5DX01FVEhPRFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hKQ19NQVJLX0dFTkVSQVRFRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0VQSVNPREVfRklMRTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFU09VUkNFX1NFTEVDVElOX0RJQUxPR19CUk9XU0VfV09SS1NQQUNFX0JVVFRPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRVNPVVJDRV9TRUxFQ1RJTl9ESUFMT0dfQlJPV1NFX0ZJTEVfU1lTVEVNX0JVVFRPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRVNPVVJDRV9TRUxFQ1RJTl9ESUFMT0dfQlJPV1NFX0ZJTEVfTk9UX0ZPVU5EX0VSUk9SOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX09VVFBVVF9ESVJFQ1RPUlk7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX09VVFBVVF9ESVJFQ1RPUllfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9QQUNLQUdFX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9PUFRJT05BTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUEFDS0FHRV9OQU1FX09QVElPTkFMX1RPT0xUSVA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfV1NETF9OQU1FU1BBQ0VfQ09MVU1OX0hFQURFUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUEFDS0FHRV9OQU1FX0NPTFVNTl9IRUFERVI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfU0VSVklDRV9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9TRVJWSUNFX05BTUVfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9CSU5ESU5HX0ZJTEVTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9CSU5ESU5HX05BTUVfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfQklORElOR19GSUxFU19BREQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0JJTkRJTkdfRklMRVNfUkVNT1ZFOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0JJTkRJTkdfRklMRV9ESUFMT0dfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0JJTkRJTkdfRklMRV9ESUFMT0dfTUVTU0FHRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfQklORElOR19GSUxFX0RJQUxPR19GSUxURVJfTkFNRTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YTUxfQ0FUTE9HOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YTUxfQ0FUTE9HX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hNTF9DQVRMT0dfQlJPV1NFOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0gICAgICAgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIENYRlVJTWVzc2FnZXMuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ1hGVUlNZXNzYWdlcygpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvQ1hGVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9DWEZVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDEyMjk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9DWEZVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENYRlVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLSAgICAvLyBUaGUgcGx1Zy1pbiBJRAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotICAgIHByaXZhdGUgc3RhdGljIENYRlVJUGx1Z2luIHBsdWdpbjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBDWEZVSVBsdWdpbigpIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICBwbHVnaW4gPSB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBsdWdpbiA9IG51bGw7Ci0gICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDWEZVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gcGx1Z2luOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgQ1hGVUlQbHVnaW4ubG9nKG5ldyBTdGF0dXMoc2V2ZXJpdHksIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgQ1hGVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgQ1hGVUlQbHVnaW4ubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCAKLSAgICAgICAgICAgIGV4Y2VwdGlvbi50b1N0cmluZygpLCBleGNlcHRpb24pKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvQ1hGVUltZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL0NYRlVJbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM0YWUyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvQ1hGVUltZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jQ1hGIFByZWZlcmVuY2UgUGFnZXMKLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX0hPTUVfVEFCX05BTUU9JkNYRiBSdW50aW1lCi1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUlVOVElNRV9IT01FX1RBQl9UT09MVElQPUJyb3dzZSBhbmQgc2VsZWN0IENYRiBCaW5hcnkgZGlzdHJpYnV0aW9uIGZvbGRlcgotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0NYRl9IT01FX0RJUl9MQUJFTD1DWEYgJkhvbWU6Ci1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUlVOVElNRV9OT1RfU0VUPU1pc3NpbmcgQ1hGIGphcjogUGxlYXNlIHNlbGVjdCB0aGUgQ1hGIGhvbWUgZGlyZWN0b3J5LgotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0JST1dTRV9CVVRUT05fTEFCRUw9JkJyb3dzZS4uLgotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0NYRl9WRVJTT05fTEFCRUw9VmVyc2lvbjoKLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVI9RXhwb3J0IHJ1bnRpbWUgbGlicmFyaWVzIHRvIFdFQi1JTkYvbGliIGF0IGRlcGxveW1lbnQgdGltZQotCi1KQVZBMldTRExfUFJFRkVSRU5DRVNfVEFCX05BTUU9SmF2YTJXU0RMCi1KQVZBMldTRExfUFJFRkVSRU5DRVNfVEFCX1RPT0xUSVA9UGxlYXNlIHNlbGVjdCB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlcyBmb3IgdGhlIEphdmEyV1NETCB0b29sCi0KLUpBVkEyV1NfUFJFRkVSRU5DRVNfVEFCX05BTUU9JkphdmEyV1MKLUpBVkEyV1NfUFJFRkVSRU5DRVNfVEFCX1RPT0xUSVA9UGxlYXNlIHNlbGVjdCB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlcyBmb3IgdGhlIEphdmEyV1MgdG9vbAotCi1BTk5PVEFUSU9OU19QUkVGRVJFTkNFU19MSU5LPVNlZSB0aGUgPEE+J0pBWC1XUyc8L0E+IHRhYiBmb3IgdGhlIGFubm90YXRpb24gcHJlZmVyZW5jZXMuCi0KLUFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX1RBQl9OQU1FPUpBJlgtV1MKLUFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQPVBsZWFzZSBzZWxlY3QgdGhlIEpBWC1XUyBhbm5vdGF0aW9ucyB0aGF0IGFyZSBnZW5lcmF0ZWQgYnkgZGVmYXVsdCBvbiB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlIGJlZm9yZSBpbnB1dCB0byBKYXZhMldTCi0KLVdTREwySkFWQV9QUkVGRVJFTkNFU19UQUJfTkFNRT0mV1NETDJKYXZhCi1XU0RMMkpBVkFfUFJFRkVSRU5DRVNfVEFCX1RPT0xUSVA9UGxlYXNlIHNlbGVjdCB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlcyBmb3IgdGhlIFdTREwySmF2YSB0b29sCi0KLVNQUklOR19DT05GSUdfUFJFRkVSRU5DRVNfVEFCX05BTUU9JkVuZHBvaW50IENvbmZpZwotU1BSSU5HX0NPTkZJR19QUkVGRVJFTkNFU19UQUJfVE9PTFRJUD1QbGVhc2Ugc2VsZWN0IHRoZSBkZWZhdWx0IG9wdGlvbiBmb3IgU3ByaW5nIGNvbmZpZ3VyYXRpb24gZ2VuZXJhdGlvbgotU1BSSU5HX0NPTkZJR19VU0VfQ1hGX1NFUlZMRVQ9VXNlIENYJkYgU2VydmxldAotU1BSSU5HX0NPTkZJR19VU0VfQ1hGX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUPVVzZSBTcHJpbmcgJkFwcGxpY2F0aW9uIENvbnRleHQKLQotQ1hGX0RFRkFVTFRfRlJPTlRFTkRfTEFCRUw9RGVmYXVsdCAmRnJvbnRlbmQ6Ci1DWEZfREVGQVVMVF9EQVRBQklORElOR19MQUJFTD1EZWZhdWx0ICZEYXRhYmluZG5nOgotSkFWQTJXU19HUk9VUF9MQUJFTD1KYXZhMldTIEdlbmVyYXRpb24gT3B0aW9uczoKLUpBVkEyV1NETF9HUk9VUF9MQUJFTD1KYXZhMldTREwgR2VuZXJhdGlvbiBPcHRpb25zOgotV1NETDJKQVZBX0dST1VQX0xBQkVMPVdTREwySmF2YSBHZW5lcmF0aW9uIE9wdGlvbnM6Ci1KQVZBMldTX0dFTl9DTElFTlRfTEFCRUw9R2VuZXJhdGUgQ2xpJmVudAotSkFWQTJXU19HRU5fU0VSVkVSX0xBQkVMPUdlbmVyYXRlIFNlciZ2ZXIKLUpBVkEyV1NfR0VOX0lNUExFTUVOVEFUSU9OX0xBQkVMPUdlbmVyYXRlICZJbXBsZW1lbnRhdGlvbgotSkFWQTJXU19HRU5fV1JBUFBFUl9GQVVMVF9MQUJFTD1HZW5lcmF0ZSBXcmFwcGVyIGFuZCBGYXVsdCAmQmVhbnMKLUpBVkEyV1NfR0VOX1dTRExfTEFCRUw9R2VuZXJhdGUgV1NEJkwKLUpBVkEyV1NfREVGQVVMVF9TT0FQQklORElOR19MQUJFTD1EZWZhdWx0IFMmT0FQIEJpbmRpbmc6Ci1KQVZBMldTX0dFTl9YU0RfSU1QT1JUUz1HZW5lcmF0ZSBzZXBhcmF0ZSBYU0QgZm9yIHRoZSAmdHlwZXMKLUNYRl9JTlZBTElEX1ZFUlNJT05fRk9STUFUPUludmFsaWQgVmVyc2lvbiBGb3JtYXQKLUNYRl9WRVJTSU9OX05PVF9TUEVDSUZJRUQ9Q1hGIHZlcnNpb24gdmFsdWUgbm90IHNwZWNpZmllZAotU1BSSU5HX0NPTkZJR19HUk9VUF9MQUJFTD1DWEYgRW5kcG9pbnQgQ29uZmlndXJhdGlvbiBPcHRpb25zOgotV1NETDJKQVZBX1BST0NFU1NfU09BUF9IRUFERVJTPUVuYWJsZSAmcHJvY2Vzc2luZyBvZiBpbXBsaWNpdCBTT0FQIGhlYWRlcnMKLVdTREwySkFWQV9MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTUFQUElORz1FbmFibGUgJmxvYWRpbmcgb2YgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIHBhY2thZ2UgbmFtZSBtYXBwaW5nCi1XU0RMMkpBVkFfVVNFX0RFRkFVTFRfRVhDTFVERVNfTkFNRVNQQUNFX01BUFBJTkc9RW5hYmxlIHRoZSB1c2Ugb2YgdGhlIGRlZmF1bHQgJmV4Y2x1ZGVzIG5hbWVzcGFjZSBtYXBwaW5nCi1XU0RMMkpBVkFfV1NETF9WRVJTSU9OX0xBQkVMPVdTREwgVmVyc2lvbjoKLVdTREwySkFWQV9VU0VfREVGQVVMVF9WQUxVRVM9R2VuZXJhdGUgJmRlZmF1bHQgdmFsdWVzIGZvciB0aGUgZ2VuZXJhdGVkIGFydGlmYWN0cwotCi1KQVhXU19BTk5PVEFUSU9OU19HUk9VUF9MQUJFTD1KQVgtV1MgQW5ub3RhdGlvbiBHZW5lcmF0aW9uCi1KQVhXU19BTk5PVEFUSU9OU19HUk9VUF9UT09MVElQPVNlbGVjdCB0aGUgYW5ub3RhdGlvbnMgd2hpY2ggYXJlIGdlbmVyYXRlZCBieSBkZWZhdWx0IG9uIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgYmVmb3JlIGlucHV0IHRvIEphdmEyV1MKLUpBWFdTX0dFTkVSQVRFX1dFQl9NRVRIT0Q9QFdlYiZNZXRob2QKLUpBWFdTX0dFTkVSQVRFX1dFQl9QQVJBTT1AV2ViJlBhcmFtCi1KQVhXU19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVI9QFJlJnF1ZXN0V3JhcHBlcgotSkFYV1NfR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUj1AJlJlc3BvbnNlV3JhcHBlcgotSkFYV1NfQU5OT1RBVElPTlNfUFJPQ0VTU0lOR19HUk9VUF9MQUJFTD1KQVgtV1MgQW5ub3RhdGlvbiBQcm9jZXNzaW5nCi1KQVhXU19FTkFCTEVfQU5OT1RBVElPTl9QUk9DRVNTSU5HPSZFbmFibGUgYW5ub3RhdGlvbiB2YWxpZGF0aW9uIHByb2Nlc3NpbmcKLUpBWFdTX0VOQUJMRV9BTk5PVEFUSU9OX1BST0NFU1NJTkdfVE9PTFRJUD1UdXJuIEpBWC1XUyBhbm5vdGF0aW9uIHByb2Nlc3Npbmcgb24gb3Igb2ZmIGluIHByb2plY3RzIGNvbmZpZ3VyZWQgZm9yIHswfSB3ZWIgc2VydmljZXMKLSAgICAKLUpBVkEyV1NfU09BUDEyX0JJTkRJTkdfVE9PTFRJUD1TcGVjaWZ5IHRvIGdlbmVyYXRlIFNPQVAgMS4yIGJpbmRpbmcKLUpBVkEyV1NfQ1JFQVRFX1hTRF9JTVBPUlRTX1RPT0xUSVA9IE91dHB1dCBzY2hlbWFzIHRvIHNlcGFyYXRlIGZpbGVzIGFuZCB1c2UgaW1wb3J0cyB0byBsb2FkIHRoZW0gaW5zdGVhZCBvZiBpbmxpbmluZyB0aGVtIGludG8gdGhlIHdzZGwKLUpBVkEyV1NfREFUQUJJTkRJTkdfVE9PTFRJUD0gU3BlY2lmeSB0aGUgZGF0YSBiaW5kaW5nLiBEZWZhdWx0IGlzIGpheGIgZm9yIGpheHdzIGZyb250ZW5kCi0jSkFWQTJXU19EQVRBQklORElOR19UT09MVElQPSBTcGVjaWZ5IHRoZSBkYXRhIGJpbmRpbmcgKGFlZ2lzIG9yIGpheGIpLiBEZWZhdWx0IGlzIGpheGIgZm9yIGpheHdzIGZyb250ZW5kLCBhbmQgYWVnaXMgZm9yIHNpbXBsZSBmcm9udGVuZAotSkFWQTJXU19GUk9OVEVORF9UT09MVElQPVNwZWNpZnkgdGhlIGZyb250ZW5kIHRvIHVzZQotI0pBVkEyV1NfRlJPTlRFTkRfVE9PTFRJUD1TcGVjaWZ5IHRoZSBmcm9udGVuZCB0byB1c2UuIGpheHdzIGFuZCB0aGUgc2ltcGxlIGZyb250ZW5kIGFyZSBzdXBwb3J0ZWQKLUpBVkEyV1NfR0VORVJBVEVfV1NETF9UT09MVElQPVNwZWNpZnkgdG8gZ2VuZXJhdGUgdGhlIFdTREwgZmlsZQotSkFWQTJXU19HRU5FUkFURV9XUkFQUEVSQkVBTl9UT09MVElQPVNwZWNpZnkgdG8gZ2VuZXJhdGUgdGhlIHdyYXBwZXIgYW5kIGZhdWx0IGJlYW4KLUpBVkEyV1NfR0VORVJBVEVfQ0xJRU5UX1RPT0xUSVA9R2VuZXJhdGUgYSBjbGllbnQgbWFpbmxpbmUgdXNpbmcgSkFYLVdTIEFQSXNcbi4uLi4uXG4gamF2YXgueG1sLndzLlNlcnZpY2Ugc2VydmljZSA9IGphdmF4LnhtbC53cy5TZXJ2aWNlLmNyZWF0ZSguLi4pO1xuLi4uIGNsaWVudCA9IHNlcnZpY2UuZ2V0UG9ydCguLi4pO1xuCi1KQVZBMldTX0dFTkVSQVRFX1NFUlZFUl9UT09MVElQPUdlbmVyYXRlIGEgc2VydmVyIG1haW5saW5lIHVzaW5nIEpBWC1XUyBBUElzXG4uLi4uLlxuIGphdmF4LnhtbC53cy5FbmRwb2ludC5wdWJsaXNoKC4uLik7XG4uLi4uLlxuCi1KQVZBMldTX0dFTkVSQVRFX0FOVF9UT09MVElQPVNwZWNpZnkgdG8gZ2VuZXJhdGUgYW4gQW50IGJ1aWxkLnhtbCBmaWxlCi1KQVZBMldTX0JFQU5TX1RPT0xUSVA9U3BlY2lmeSB0aGUgcGF0aG5hbWUgb2YgYSBmaWxlIGRlZmluaW5nIGFkZGl0aW9uYWwgU3ByaW5nIGJlYW5zIHRvIGN1c3RvbWlzZSBkYXRhIGJpbmRpbmcgY29uZmlndXJhdGlvbgotSkFWQTJXU19UQVJHRVRfTkFNRVNQQUNFX1RPT0xUSVA9U3BlY2lmeSB0aGUgdGFyZ2V0IG5hbWVzcGFjZSB0byB1c2UgaW4gdGhlIHdzZGwKLUpBVkEyV1NfU0VSVklDRV9OQU1FX1RPT0xUSVA9U3BlY2lmeSB0aGUgc2VydmljZSBuYW1lIHRvIHVzZSBpbiB0aGUgZ2VuZXJhdGVkIHdzZGwKLUpBVkEyV1NfUE9SVF9OQU1FX1RPT0xUSVA9U3BlY2lmeSB0aGUgcG9ydCBuYW1lIHRvIHVzZSBpbiB0aGUgZ2VuZXJhdGVkIHdzZGwKLUpBVkEyV1NfQUREUkVTU19UT09MVElQPSBTcGVjaWZ5IHRoZSBwb3J0IGFkZHJlc3MKLQotSkFWQTJXU19XU0RMX0ZJTEVfTkFNRT0mV1NETCBGaWxlOgotSkFWQTJXU19PVVRQVVRfRklMRV9UT09MVElQPVNwZWNpZnkgdGhlIG91dHB1dCB3c2RsIGZpbGUgbmFtZQotCi1KQVZBMldTX1VTRV9TRUlfQlVUVE9OPSZVc2UgYSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZToKLUpBVkEyV1NfVVNFX1NFSV9JTkZPX0xBQkVMPShZb3UgbWF5IHdvcmsgZGlyZWN0bHkgd2l0aCB0aGUgezB9IEphdmEgY2xhc3MuIEJ1dCB3b3JraW5nIGZyb20gYW4gaW50ZXJmYWNlIGlzIHRoZSByZWNvbW1lbmRlZCBhcHByb2FjaC4gVHdvIG9wdGlvbnMgYXJlIHByb3ZpZGVkIGhlcmUuKQotSkFWQTJXU19TRUxFQ1RfU0VJPVNlbGVjdCBTRUk6Ci0jSkFWQTJXU19TRUxFQ1RfU0VJX0xBQkVMPVNlbGVjdCBTRUkgZnJvbSAmVHlwZSBIaWVyYXJjaHk6Ci1KQVZBMldTX1NFTEVDVF9TRUlfTEFCRUw9U2VsZWMmdCBhbiBTRUk6Ci1KQVZBMldTX1NFTEVDVF9TRUlfVE9PTFRJUD1TZWxlY3QgdGhlIEludGVyZmFjZSBmcm9tIHRoZSBUeXBlIEhpZXJhcmNoeSB0byB1c2UgYXMgdGhlIFNFSQotSkFWQTJXU19CUk9XU0VfTEFCRUw9QnJvd3NlLi4uCi1KQVZBMldTX0VYVFJBQ1RfU0VJPUV4dHJhY3QgU0VJOgotSkFWQTJXU19FWFRSQUNUX1NFSV9MQUJFTD0mQ3JlYXRlIGFuIFNFSToKLUpBVkEyV1NfRVhUUkFDVF9TRUlfVE9PTFRJUD1UeXBlIHRoZSBuYW1lIG9mIHRoZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSB0byBleHRyYWN0Ci1KQVZBMldTX0VYVFJBQ1RfTUVNQkVSU19MQUJFTD1NZW1iZXJzIHRvIGRlY2xhcmUgaW4gdGhlIGV4dHJhY3RlZCBTRUk6Ci1KQVZBMldTX1NFTEVDVF9BTExfQlVUVE9OPSZTZWxlY3QgQWxsLi4uCi1KQVZBMldTX0RFU0VMRUNUX0FMTF9CVVRUT049JkRlc2VsZWN0IEFsbC4uLgotSkFWQTJXU19TRUxFQ1RfSU1QTEVNRU5UQVRJT049U2VsZWN0ICZJbXBsZW1lbnRhdGlvbjoKLUpBVkEyV1NfU0VMRUNUX0lNUExFTUVOVEFUSU9OX1RPT0xUSVA9U2VsZWN0IHRoZSBJbXBsZW1lbnRhdGlvbgotCi1XU0RMMkpBVkFfRlJPTlRFTkRfVE9PTFRJUD1TcGVjaWZ5IHRoZSBmcm9udGVuZC4gRGVmYXVsdCBpcyBKQVhXUy4gQ3VycmVudGx5IHN1cHBvcnRzIG9ubHkgSkFYV1MgZnJvbnRlbmQKLVdTREwySkFWQV9EQVRBQklORElOR19UT09MVElQPVNwZWNpZnkgdGhlIGRhdGFiaW5kaW5nLiBEZWZhdWx0IGlzIEpBWEIuIEN1cnJlbnRseSBzdXBwb3J0cyBvbmx5IEpBWEIgZGF0YWJpbmRpbmcKLVdTREwySkFWQV9XU0RMX1ZFUlNJT05fVE9PTFRJUD1TcGVjaWZ5IHRoZSB3c2RsIHZlcnNpb24gLkRlZmF1bHQgaXMgV1NETDEuMS4gQ3VycmVudGx5IHN1cHBwb3J0cyBvbmx5IFdTREwxLjEgdmVyc2lvbgotV1NETDJKQVZBX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OX1RPT0xUSVA9R2VuZXJhdGUgc3RhcnRpbmcgcG9pbnQgY29kZSBmb3IgYW4gaW1wbGVtZW50YXRpb24gb2JqZWN0Ci1XU0RMMkpBVkFfR0VORVJBVEVfQ0xJRU5UX1RPT0xUSVA9R2VuZXJhdGUgdGhlIGNsaWVudCBjb2RlCi1XU0RMMkpBVkFfR0VORVJBVEVfU0VSVkVSX1RPT0xUSVA9R2VuZXJhdGUgdGhlIHNlcnZlciBjb2RlCi1XU0RMMkpBVkFfREVGQVVMVF9WQUxVRVNfVE9PTFRJUD1HZW5lcmF0ZSBkZWZhdWx0IHZhbHVlcyBpbiB0aGUgaW1wbGVtZW50YXRpb24gYW5kIGNsaWVudC4gSWdub3JlZCBpZiBpbXBsZW1lbnRhdGlvbiBvciBjbGllbnQgaXMgbm90IGJlaW5nIGdlbmVyYXRlZAotV1NETDJKQVZBX0VYQ0xVREVfTkFNRVNQQUNFX1RPT0xUSVA9SWdub3JlIHRoZSBzcGVjaWZpZWQgV1NETCBzY2hlbWEgbmFtZXNwYWNlcyB3aGVuIGdlbmVyYXRpbmcgY29kZQotV1NETDJKQVZBX1BST0NFU1NfU09BUF9IRUFERVJTX1RPT0xUSVA9RW5hYmxlcyBvciBkaXNhYmxlcyBwcm9jZXNzaW5nIG9mIGV4dGVuZGVkIHNvYXAgaGVhZGVyIG1lc3NhZ2UgYmluZGluZwotV1NETDJKQVZBX0RFRkFVTFRfTkFNRVNQQUNFX0xPQURJTkdfVE9PTFRJUD1FbmFibGVzIG9yIGRpc2FibGVzIGxvYWRpbmcgb2YgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIHBhY2thZ2UgbmFtZSBtYXBwaW5nCi1XU0RMMkpBVkFfRVhDTFVERV9OQU1FU1BBQ0VfTE9BRElOR19UT09MVElQPUVuYWJsZXMgb3IgZGlzYWJsZXMgbG9hZGluZyBvZiB0aGUgZGVmYXVsdCBleGNsdWRlcyBuYW1lc3BhY2UgbWFwcGluZwotV1NETDJKQVZBX1dTRExfTE9DQVRJT05fVE9PTFRJUD1TcGVjaWZpZXMgdGhlIHZhbHVlIG9mIHRoZSBAV2ViU2VydmljZSBhbm5vdGF0aW9uJ3Mgd3NkbExvY2F0aW9uIHByb3BlcnR5Ci1XU0RMMkpBVkFfWE1MX0NBVEFMT0dfVE9PTFRJUD1TcGVjaWZ5IHRoZSBVUkwgb2YgYW4gWE1MIGNhdGFsb2cgdG8gdXNlIGZvciByZXNvbHZpbmcgaW1wb3J0ZWQgc2NoZW1hcyBhbmQgV1NETCBkb2N1bWVudHMKLVdTREwySkFWQV9OT19BRERSRVNTX0JJTkRJTkc9VXNlIHRoZSB7MH0gcHJvcHJpZXRhcnkgV1MtJkFkZHJlc3NpbmcgdHlwZQotV1NETDJKQVZBX05PX0FERFJFU1NfQklORElOR19UT09MVElQPVVzZSB0aGUgezB9IHByb3ByaWV0YXJ5IFdTLUFkZHJlc3NpbmcgdHlwZSBpbnN0ZWFkIG9mIHRoZSBKQVgtV1MgMi4xIGNvbXBsaWFudCBtYXBwaW5nCi1XU0RMMkpBVkFfQVVUT19OQU1FX1JFU09MVVRJT049RW5hYmxlIEF1dG8gTmFtZSBSZXNvbHV0aW9uCi1XU0RMMkpBVkFfQVVUT19OQU1FX1JFU09MVVRJT05fVE9PTFRJUD1BdXRvbWF0aWNhbGx5IHJlc29sdmUgbmFtaW5nIGNvbmZsaWN0cyB3aXRob3V0IHJlcXVpcmluZyB0aGUgdXNlIG9mIGJpbmRpbmcgY3VzdG9taXphdGlvbnMKLVdTREwySkFWQV9YSkNfQVJHU19UT09MVElQPVNwZWNpZnkgdGhlIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gZGlyZWN0bHkgdG8gdGhlIFhKQwotV1NETDJKQVZBX1hKQ19BUkdfR1JPVVBfVElUTEU9WEpDIEFyZ3VtZW50cwotV1NETDJKQVZBX1hKQ19BUkdfQ09MVU1OX05BTUU9WEpDIEFyZwotV1NETDJKQVZBX1hKQ19ERVNDUklQVElPTl9DT0xVTU5fTkFNRT1EZXNjcmlwdGlvbgotV1NETDJKQVZBX1hKQ19ERUZBVUxUX1ZBTFVFUz1Jbml0aWFsaXNlIGZpZWxkcyBtYXBwZWQgZnJvbSBlbGVtZW50cyB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWVzCi1XU0RMMkpBVkFfWEpDX1RPU1RSSU5HPUFjdGl2YXRlIHBsdWdpbiB0byBhZGQgYSB0b1N0cmluZygpIG1ldGhvZCB0byBnZW5lcmF0ZWQgY2xhc3NlcwotV1NETDJKQVZBX1hKQ19UT1NUUklOR19NVUxUSUxJTkU9SGF2ZSB0b1N0cmluZyBwcm9kdWNlIG11bHRpIGxpbmUgb3V0cHV0Ci1XU0RMMkpBVkFfWEpDX1RPU1RSSU5HX1NJTVBMRT1IYXZlIHRvU3RyaW5nIHByb2R1Y2Ugc2luZ2xlIGxpbmUgdGVyc2Ugb3V0cHV0Ci1XU0RMMkpBVkFfWEpDX0xPQ0FUT1I9RW5hYmxlIHNvdXJjZSBsb2NhdGlvbiBzdXBwb3J0IGZvciBnZW5lcmF0ZWQgY29kZQotV1NETDJKQVZBX1hKQ19TWU5DX01FVEhPRFM9R2VuZXJhdGUgYWNjZXNzb3IgbWV0aG9kcyB3aXRoIHRoZSAnc3luY2hyb25pemVkJyBrZXl3b3JkCi1XU0RMMkpBVkFfWEpDX01BUktfR0VORVJBVEVEPUFkZCBAR2VuZXJhdGVkIGFubm90YXRpb25zIHRvIHRoZSBnZW5lcmF0ZWQgY29kZQotI01hcmsgdGhlIGdlbmVyYXRlZCBjb2RlIGFzIEBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZAotV1NETDJKQVZBX1hKQ19FUElTT0RFX0ZJTEU9IEdlbmVyYXRlIHRoZSBlcGlzb2RlIGZpbGUgZm9yIHNlcGFyYXRlIGNvbXBpbGF0aW9uCi0jUmVzb3VyY2UgU2VsZWN0aW9uIERpYWxvZwotUkVTT1VSQ0VfU0VMRUNUSU5fRElBTE9HX0JST1dTRV9XT1JLU1BBQ0VfQlVUVE9OPUJyb3dzZSBXb3Jrc3BhY2UuLi4KLVJFU09VUkNFX1NFTEVDVElOX0RJQUxPR19CUk9XU0VfRklMRV9TWVNURU1fQlVUVE9OPUJyb3dzZSBGaWxlIFN5c3RlbS4uLgotUkVTT1VSQ0VfU0VMRUNUSU5fRElBTE9HX0JST1dTRV9GSUxFX05PVF9GT1VORF9FUlJPUj1GaWxlIE5vdCBGb3VuZAotCi1XU0RMMkpBVkFfT1VUUFVUX0RJUkVDVE9SWT0mT3V0cHV0IERpcmVjdG9yeToKLVdTREwySkFWQV9PVVRQVVRfRElSRUNUT1JZX1RPT0xUSVA9U3BlY2lmeSB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIGdlbmVyYXRlZCBjb2RlIGZpbGVzIGFyZSB3cml0dGVuCi0KLVdTREwySkFWQV9QQUNLQUdFX05BTUU9JlBhY2thZ2UgTmFtZToKLVdTREwySkFWQV9QQUNLQUdFX05BTUVfVE9PTFRJUD1UaGUgamF2YSBwYWNrYWdlIG5hbWUgdG8gdXNlIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGUKLQotV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9PUFRJT05BTD1TcGVjaWZ5ICZXU0RMIE5hbWVwc2FjZSB0byBQYWNrYWdlIE5hbWUgTWFwcGluZ3MKLVdTREwySkFWQV9QQUNLQUdFX05BTUVfT1BUSU9OQUxfVE9PTFRJUD1PcHRpb25hbGx5IHNwZWNpZnkgdGhlIHdzZGwgbmFtZXNwYWNlIG1hcHBpbmcgdG8gYSBwYXJ0aWN1bGFyIGphdmEgcGFja2FnZSBuYW1lCi0KLVdTREwySkFWQV9XU0RMX05BTUVTUEFDRV9DT0xVTU5fSEVBREVSPVdTREwgTmFtZXNwYWNlCi1XU0RMMkpBVkFfUEFDS0FHRV9OQU1FX0NPTFVNTl9IRUFERVI9UGFja2FnZSBOYW1lCi0KLVdTREwySkFWQV9TRVJWSUNFX05BTUU9JlNlcnZpY2UgTmFtZToKLVdTREwySkFWQV9TRVJWSUNFX05BTUVfVE9PTFRJUD1TcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBXU0RMIHNlcnZpY2UgZm9yIHdoaWNoIGNvZGUgaXMgdG8gYmUgZ2VuZXJhdGVkLiBUaGUgZGVmYXVsdCBpcyB0byBnZW5lcmF0ZSBjb2RlIGZvciBldmVyeSBzZXJ2aWNlIGluIHRoZSBXU0RMIGRvY3VtZW50Ci0KLVdTREwySkFWQV9CSU5ESU5HX0ZJTEVTPSZCaW5kaW5nIEZpbGVzOgotV1NETDJKQVZBX0JJTkRJTkdfTkFNRV9UT09MVElQPVNwZWNpZnkgemVybywgb3IgbW9yZSwgSkFYV1Mgb3IgSkFYQiBiaW5kaW5nIGZpbGVzCi1XU0RMMkpBVkFfQklORElOR19GSUxFU19BREQ9JkFkZC4uLgotV1NETDJKQVZBX0JJTkRJTkdfRklMRVNfUkVNT1ZFPSZSZW1vdmUuLi4KLQotV1NETDJKQVZBX0JJTkRJTkdfRklMRV9ESUFMT0dfVElUTEU9QnJvd3NlIGZvciBCaW5kaW5nIEZpbGUKLVdTREwySkFWQV9CSU5ESU5HX0ZJTEVfRElBTE9HX01FU1NBR0U9QmluZGluZyBGaWxlOgotV1NETDJKQVZBX0JJTkRJTkdfRklMRV9ESUFMT0dfRklMVEVSX05BTUU9SkFYV1Mgb3IgSkFYQiBCaW5kaW5nIEZpbGVzICgqLnhtbCkKLQotV1NETDJKQVZBX1hNTF9DQVRMT0c9WE1MIENhdGFsb2c6Ci1XU0RMMkpBVkFfWE1MX0NBVExPR19UT09MVElQPVNwZWNpZnkgY2F0YWxvZyBmaWxlIHRvIG1hcCB0aGUgaW1wb3J0ZWQgd3NkbC9zY2hlbWEKLVdTREwySkFWQV9YTUxfQ0FUTE9HX0JST1dTRT1Ccm93c2UuLi4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9kaWFsb2dzL1Jlc291cmNlU2VsZWN0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvZGlhbG9ncy9SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmVmY2QxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9kaWFsb2dzL1Jlc291cmNlU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvblN0YXR1c0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBBIDxjb2RlPlNlbGVjdGlvblN0YXR1c0RpYWxvZzwvY29kZT4gd2hpY2ggYWxsb3dzIHRoZSBzZWxlY3Rpb24gb2YgZmlsZXMKLSAqIHdpdGggYSBzcGVjaWZpYyBleHRlbnNpb24gZnJvbSB0aGUgd29ya3NwYWNlIG9yIGZpbGUgc3lzdGVtLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIFNlbGVjdGlvblN0YXR1c0RpYWxvZyB7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIE9LX0ZJTEVfU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBJU3RhdHVzIEVSUk9SX0ZJTEVfU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICBDWEZVSU1lc3NhZ2VzLlJFU09VUkNFX1NFTEVDVElOX0RJQUxPR19CUk9XU0VfRklMRV9OT1RfRk9VTkRfRVJST1IpOwotCi0gICAgcHJpdmF0ZSBJU3RhdHVzIFZBTElEQVRFX1NFTEVDVElPTl9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIFRleHQgcmVzb3VyY2VUZXh0OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlsdGVyRXh0ZW5zaW9uOwotICAgIHByaXZhdGUgU3RyaW5nIGZpbHRlck5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIDxjb2RlPlJlc291cmNlU2VsZWN0aW9uRGlhbG9nPC9jb2RlPgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiBAcGFyYW0gZmlsdGVyRXh0ZW5zaW9uCi0gICAgICogICAgICAgICAgICB0aGUgZmlsZSBuYW1lIGV4dGVuc2lvbiB3aGljaCB0aGUgZGlhbG9ncyB3aWxsIHVzZSB0byBmaWx0ZXIKLSAgICAgKiAgICAgICAgICAgIGZpbGVzCi0gICAgICogQHBhcmFtIGZpbHRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIHRoYXQgZGVzY3JpYmVzIHRoZSBmaWx0ZXJFeHRlbnNpb24KLSAgICAgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBkaWFsb2cgdGl0bGUKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgZmlsdGVyRXh0ZW5zaW9uLCBTdHJpbmcgZmlsdGVyTmFtZSwgU3RyaW5nIGRpYWxvZ1RpdGxlKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCk7Ci0KLSAgICAgICAgdGhpcy5maWx0ZXJFeHRlbnNpb24gPSBmaWx0ZXJFeHRlbnNpb247Ci0gICAgICAgIHRoaXMuZmlsdGVyTmFtZSA9IGZpbHRlck5hbWU7Ci0KLSAgICAgICAgc2V0VGl0bGUoZGlhbG9nVGl0bGUpOwotICAgICAgICBzZXRTdGF0dXNMaW5lQWJvdmVCdXR0b25zKHRydWUpOwotICAgICAgICBpbnQgc2hlbGxTdHlsZSA9IGdldFNoZWxsU3R5bGUoKTsKLSAgICAgICAgc2V0U2hlbGxTdHlsZShzaGVsbFN0eWxlIHwgU1dULk1BWCB8IFNXVC5SRVNJWkUpOwotICAgICAgICB1cGRhdGVTdGF0dXMoVkFMSURBVEVfU0VMRUNUSU9OX1NUQVRVUyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS53aWR0aEhpbnQgPSA1MDA7Ci0gICAgICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0gICAgICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgTGFiZWwgbWVzc2FnZUxhYmVsID0gY3JlYXRlTWVzc2FnZUFyZWEoYnV0dG9uQ29tcG9zaXRlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBtZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgQnV0dG9uIGJyb3dzZVdvcmtzcGFjZSA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgICAgIGJyb3dzZVdvcmtzcGFjZS5zZXRUZXh0KENYRlVJTWVzc2FnZXMuUkVTT1VSQ0VfU0VMRUNUSU5fRElBTE9HX0JST1dTRV9XT1JLU1BBQ0VfQlVUVE9OKTsKLSAgICAgICAgYnJvd3NlV29ya3NwYWNlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IGNyZWF0ZVdvcmtzcGFjZVJlc291cmNlRGlhbG9nKGNvbXBvc2l0ZS5nZXRTaGVsbCgpKTsKLSAgICAgICAgICAgICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBTZWxlY3Rpb25EaWFsb2cuT0spIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gcmVzdWx0ID0gZGlhbG9nLmdldFJlc3VsdCgpOwotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSByZXN1bHRbMF07Ci0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlVGV4dC5zZXRUZXh0KHJlc291cmNlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBicm93c2VXb3Jrc3BhY2Uuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgQnV0dG9uIGJyb3dzZUZpbGVTeXN0ZW0gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgICAgICBicm93c2VGaWxlU3lzdGVtLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5SRVNPVVJDRV9TRUxFQ1RJTl9ESUFMT0dfQlJPV1NFX0ZJTEVfU1lTVEVNX0JVVFRPTik7Ci0gICAgICAgIGJyb3dzZUZpbGVTeXN0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBGaWxlRGlhbG9nIGRpYWxvZyA9IGNyZWF0ZUZpbGVTeXN0ZW1SZXNvdXJjZURpYWxvZyhjb21wb3NpdGUuZ2V0U2hlbGwoKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSVBhdGggZmlsdGVyUGF0aCA9IG5ldyBQYXRoKGRpYWxvZy5nZXRGaWx0ZXJQYXRoKCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBidWlsZEZpbGVOYW1lID0gZGlhbG9nLmdldEZpbGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgSVBhdGggcGF0aCA9IGZpbHRlclBhdGguYXBwZW5kKGJ1aWxkRmlsZU5hbWUpLm1ha2VBYnNvbHV0ZSgpOwotCi0gICAgICAgICAgICAgICAgcmVzb3VyY2VUZXh0LnNldFRleHQocGF0aC50b09TU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGJyb3dzZUZpbGVTeXN0ZW0uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgcmVzb3VyY2VUZXh0ID0gbmV3IFRleHQoYnV0dG9uQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHJlc291cmNlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2UgPSByZXNvdXJjZVRleHQuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlc291cmNlKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBzZXRSZXN1bHQoQXJyYXlzLmFzTGlzdChyZXNvdXJjZSkpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdGF0dXMoT0tfRklMRV9TVEFUVVMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhFUlJPUl9GSUxFX1NUQVRVUyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICByZXNvdXJjZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNlbGVjdGlvbkRpYWxvZyBjcmVhdGVXb3Jrc3BhY2VSZXNvdXJjZURpYWxvZyhTaGVsbCBzaGVsbCkgewotICAgICAgICBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyB3b3Jrc3BhY2VSZXNvdXJjZURpYWxvZyA9IG5ldyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyhzaGVsbCwKLSAgICAgICAgICAgICAgICBuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkpOwotCi0gICAgICAgIHdvcmtzcGFjZVJlc291cmNlRGlhbG9nLnNldFRpdGxlKGdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIHdvcmtzcGFjZVJlc291cmNlRGlhbG9nLnNldE1lc3NhZ2UoZmlsdGVyTmFtZSk7Ci0gICAgICAgIHdvcmtzcGFjZVJlc291cmNlRGlhbG9nLnNldEFsbG93TXVsdGlwbGUoZmFsc2UpOwotCi0gICAgICAgIHdvcmtzcGFjZVJlc291cmNlRGlhbG9nLmFkZEZpbHRlcihuZXcgVmlld2VyRmlsdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSkgewotICAgICAgICAgICAgICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5pc0FjY2Vzc2libGUoKSAmJiBmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoZmlsdGVyRXh0ZW5zaW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0ICYmICEoKElQcm9qZWN0KSBlbGVtZW50KS5pc09wZW4oKSkgewotICAgICAgICAgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvamVjdC5pc0FjY2Vzc2libGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElDb250YWluZXIgY29udGFpbmVyID0gKElDb250YWluZXIpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBjb250YWluZXIubWVtYmVycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiByZXNvdXJjZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0KHZpZXdlciwgcGFyZW50RWxlbWVudCwgcmVzb3VyY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGVUlQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHdvcmtzcGFjZVJlc291cmNlRGlhbG9nLnNldFZhbGlkYXRvcihuZXcgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcigpIHsKLQotICAgICAgICAgICAgcHVibGljIElTdGF0dXMgdmFsaWRhdGUoT2JqZWN0W10gc2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBzZWxlY3RlZCA9IHNlbGVjdGlvblswXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgSUZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElGaWxlIGZpbGUgPSAoSUZpbGUpIHNlbGVjdGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscyhmaWx0ZXJFeHRlbnNpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LX0ZJTEVfU1RBVFVTOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBWQUxJREFURV9TRUxFQ1RJT05fU1RBVFVTOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB3b3Jrc3BhY2VSZXNvdXJjZURpYWxvZy5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQotICAgICAgICByZXR1cm4gd29ya3NwYWNlUmVzb3VyY2VEaWFsb2c7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWxlRGlhbG9nIGNyZWF0ZUZpbGVTeXN0ZW1SZXNvdXJjZURpYWxvZyhTaGVsbCBzaGVsbCkgewotICAgICAgICBGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7Ci0gICAgICAgIGRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqIiArIGZpbHRlckV4dGVuc2lvbiB9KTsgLy8kTk9OLU5MUy0xJDsKLSAgICAgICAgZGlhbG9nLnNldEZpbHRlck5hbWVzKG5ldyBTdHJpbmdbXSB7IGZpbHRlck5hbWUgfSk7Ci0gICAgICAgIHJldHVybiBkaWFsb2c7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVJlc3VsdCgpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3ByZWZlcmVuY2VzL0NYRlJ1bnRpbWVQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3ByZWZlcmVuY2VzL0NYRlJ1bnRpbWVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTEwMGQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9wcmVmZXJlbmNlcy9DWEZSdW50aW1lUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuTGF1bmNoVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzLkFubm90YXRpb25zQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5CbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuQ1hGMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuQ1hGMjFXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuSmF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5KYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5TcHJpbmdDb25maWdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBDWEZSdW50aW1lUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIENYRl9MT0NBVElPTl9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgbnVsbCk7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIE9LX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIFBhdHRlcm4gZGlnaXRQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJcXGQiKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLSAgICBwcml2YXRlIFRleHQgY3hmSG9tZURpclRleHQ7Ci0KLSAgICBwcml2YXRlIExhYmVsIGN4ZlRvb2xWZXJzaW9uTGFiZWw7Ci0gICAgCi0gICAgcHJpdmF0ZSBCdXR0b24gZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBDWEZDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICBwcml2YXRlIEphdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSBqYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgcHJpdmF0ZSBKYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlIGphdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUgOwotICAgIAotICAgIHByaXZhdGUgQ1hGMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZSBjeGYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgIHByaXZhdGUgQ1hGMjFXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZSBjeGYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgIAotICAgIHByaXZhdGUgQW5ub3RhdGlvbnNDb21wb3NpdGUgYW5ub3RhdGlvbnNDb21wb3NpdGU7Ci0gICAgCi0gICAgcHJpdmF0ZSBTcHJpbmdDb25maWdDb21wb3NpdGUgc3ByaW5nQ29uZmlnQ29tcG9zaXRlOwotICAgIAotICAgIHByaXZhdGUgU3RhY2tMYXlvdXQgamF2YTJXU1N0YWNrTGF5b3V0OwotICAgIHByaXZhdGUgU3RhY2tMYXlvdXQgd3NkbDJqYXZhU3RhY2tMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBTdGFja0xheW91dCBqYXh3c1N0YWNrTGF5b3V0OwotICAgIHByaXZhdGUgU3RhY2tMYXlvdXQgc3ByaW5nQ29uZmlnU3RhY2tMYXlvdXQ7Ci0gICAgCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgamF2YTJXU1ByZWZlcm5jZXNHcm91cDsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSB3c2RsMkphdmFQcmVmZXJlbmNlc0dyb3VwOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIGpheHdzUHJlZmVyZW5jZXNHcm91cDsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBzcHJpbmdDb25maWdQcmVmZXJuY2VzR3JvdXA7Ci0gICAgCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgamF2YTJXU0RMUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgamF2YTJXU1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgIAotICAgIHByaXZhdGUgQ29tcG9zaXRlIGpheHdzUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgd3NkbDJKYXZhMjBQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSB3c2RsMkphdmEyMVByZWZlcmVuY2VzQ29tcG9zaXRlOwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgc3ByaW5nUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgCi0gICAgcHJpdmF0ZSBCbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSBqYXZhMldTQmxhbmtQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICBwcml2YXRlIEJsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlIHdzZGwySmF2YUJsYW5rUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgcHJpdmF0ZSBCbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSBqYXh3c0JsYW5rUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgcHJpdmF0ZSBCbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSBzcHJpbmdDb25maWdCbGFua1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotCi0gICAgcHVibGljIENYRlJ1bnRpbWVQcmVmZXJlbmNlUGFnZSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLQotICAgICAgICBmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotICAgICAgICBHcmlkTGF5b3V0IG1haW5MYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KG1haW5MYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgVGFiRm9sZGVyIGN4ZlByZWZlcmVuY2VUYWIgPSBuZXcgVGFiRm9sZGVyKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBjeGZQcmVmZXJlbmNlVGFiLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vQ1hGIFJ1bnRpbWUgTG9jYXRpb24KLSAgICAgICAgVGFiSXRlbSBydW50aW1lSW5zdGFsTG9jYXRpb25JdGVtID0gbmV3IFRhYkl0ZW0oY3hmUHJlZmVyZW5jZVRhYiwgU1dULk5PTkUpOwotICAgICAgICBydW50aW1lSW5zdGFsTG9jYXRpb25JdGVtLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUlVOVElNRV9IT01FX1RBQl9OQU1FKTsKLSAgICAgICAgcnVudGltZUluc3RhbExvY2F0aW9uSXRlbQotICAgICAgICAgICAgICAgIC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX0hPTUVfVEFCX1RPT0xUSVApOwotCi0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBydW50aW1lR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGN4ZlByZWZlcmVuY2VUYWIsIFNXVC5OT05FKTsKLQotICAgICAgICBydW50aW1lSW5zdGFsTG9jYXRpb25JdGVtLnNldENvbnRyb2wocnVudGltZUdyb3VwKTsKLSAgICAgICAgcnVudGltZUdyb3VwLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1JVTlRJTUVfSE9NRV9UQUJfVE9PTFRJUCk7Ci0KLSAgICAgICAgR3JpZExheW91dCBydW50aW1lTG9hY3Rpb25sYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCi0gICAgICAgIHJ1bnRpbWVMb2FjdGlvbmxheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICAgICAgcnVudGltZUxvYWN0aW9ubGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotICAgICAgICBydW50aW1lR3JvdXAuc2V0TGF5b3V0KHJ1bnRpbWVMb2FjdGlvbmxheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgIHJ1bnRpbWVHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChydW50aW1lR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9DWEZfSE9NRV9ESVJfTEFCRUwpOwotCi0gICAgICAgIGN4ZkhvbWVEaXJUZXh0ID0gbmV3IFRleHQocnVudGltZUdyb3VwLCBTV1QuQk9SREVSKTsKLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0Q3hmUnVudGltZUxvY2F0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgY3hmSG9tZURpclRleHQuc2V0VGV4dChjb250ZXh0LmdldEN4ZlJ1bnRpbWVMb2NhdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0KLSAgICAgICAgY3hmSG9tZURpclRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIGN4ZkhvbWVEaXJUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0Q3hmUnVudGltZUxvY2F0aW9uKGN4ZkhvbWVEaXJUZXh0LmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlUHJlZmVyZW5jZUNvbnRyb2xzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24ocnVudGltZUdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIGJyb3dzZUJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0JST1dTRV9CVVRUT05fTEFCRUwpOwotCi0gICAgICAgIGJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBEaXJlY3RvcnlEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coY29tcG9zaXRlLmdldFNoZWxsKCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGZpbGVEaWFsb2cub3BlbigpOwotICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN4ZkhvbWVEaXJUZXh0LnNldFRleHQoZmlsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldEN4ZlJ1bnRpbWVMb2NhdGlvbihjeGZIb21lRGlyVGV4dC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gQ1hGIFZlcnNpb24KLSAgICAgICAgTGFiZWwgY3hmVmVyc2lvbkxhYmVsID0gbmV3IExhYmVsKHJ1bnRpbWVHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBjeGZWZXJzaW9uTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9DWEZfVkVSU09OX0xBQkVMKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBjeGZWZXJzaW9uTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgY3hmVG9vbFZlcnNpb25MYWJlbCA9IG5ldyBMYWJlbChydW50aW1lR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGN4ZlRvb2xWZXJzaW9uTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIAotICAgICAgICBMYWJlbCBwYWRkaW5nTGFiZWwgPSBuZXcgTGFiZWwocnVudGltZUdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBwYWRkaW5nTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIAotICAgICAgICBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b24gPSBuZXcgQnV0dG9uKHJ1bnRpbWVHcm91cCwgU1dULkNIRUNLKTsKLSAgICAgICAgZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyQnV0dG9uLnNldFRleHQoCi0gICAgICAgICAgICAgICAgQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSKTsKLSAgICAgICAgZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCkpOwotICAgICAgICBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAKLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0Q3hmUnVudGltZVZlcnNpb24oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGN4ZlRvb2xWZXJzaW9uTGFiZWwuc2V0VGV4dChjb250ZXh0LmdldEN4ZlJ1bnRpbWVFZGl0aW9uKCkgKyAiICIgKyBjb250ZXh0LmdldEN4ZlJ1bnRpbWVWZXJzaW9uKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lckJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy9KYXZhMldTCi0gICAgICAgIFRhYkl0ZW0gamF2YTJXU1RhYkl0ZW0gPSBuZXcgVGFiSXRlbShjeGZQcmVmZXJlbmNlVGFiLCBTV1QuTk9ORSk7Ci0gICAgICAgIGphdmEyV1NUYWJJdGVtLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX1BSRUZFUkVOQ0VTX1RBQl9OQU1FKTsKLSAgICAgICAgamF2YTJXU1RhYkl0ZW0uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQKTsKLQotICAgICAgICBqYXZhMldTUHJlZmVybmNlc0dyb3VwID0gbmV3IENvbXBvc2l0ZShjeGZQcmVmZXJlbmNlVGFiLCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgamF2YTJXU1N0YWNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0gICAgICAgIGphdmEyV1NQcmVmZXJuY2VzR3JvdXAuc2V0TGF5b3V0KGphdmEyV1NTdGFja0xheW91dCk7Ci0KLSAgICAgICAgamF2YTJXU0RMUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGphdmEyV1NQcmVmZXJuY2VzR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBqYXZhMldTR3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBqYXZhMldTRExQcmVmZXJlbmNlc0NvbXBvc2l0ZS5zZXRMYXlvdXQoamF2YTJXU0dyaWRMYXlvdXQpOwotCi0gICAgICAgIGphdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBKYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUoCi0gICAgICAgICAgICAgICAgamF2YTJXU0RMUHJlZmVyZW5jZXNDb21wb3NpdGUsIFNXVC5OT05FLCBjeGZQcmVmZXJlbmNlVGFiKTsKLSAgICAgICAgamF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLmFkZENvbnRyb2xzKCk7Ci0KLSAgICAgICAgamF2YTJXU1ByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShqYXZhMldTUHJlZmVybmNlc0dyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgamF2YTJXU0RMR3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBqYXZhMldTUHJlZmVyZW5jZXNDb21wb3NpdGUuc2V0TGF5b3V0KGphdmEyV1NETEdyaWRMYXlvdXQpOwotCi0gICAgICAgIGphdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgSmF2YTJXU1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSgKLSAgICAgICAgICAgICAgICBqYXZhMldTUHJlZmVyZW5jZXNDb21wb3NpdGUsIFNXVC5OT05FLCBjeGZQcmVmZXJlbmNlVGFiKTsKLSAgICAgICAgamF2YTJXU1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5hZGRDb250cm9scygpOwotCi0gICAgICAgIGphdmEyV1NCbGFua1ByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IEJsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlKGphdmEyV1NQcmVmZXJuY2VzR3JvdXAsCi0gICAgICAgICAgICAgICAgU1dULk5PTkUpOwotCi0gICAgICAgIGphdmEyV1NUYWJJdGVtLnNldENvbnRyb2woamF2YTJXU1ByZWZlcm5jZXNHcm91cCk7Ci0gICAgICAgIAotICAgICAgICAvL1dTREwySmF2YQotICAgICAgICBUYWJJdGVtIHdzZGwySmF2YVRhYkl0ZW0gPSBuZXcgVGFiSXRlbShjeGZQcmVmZXJlbmNlVGFiLCBTV1QuTk9ORSk7Ci0gICAgICAgIHdzZGwySmF2YVRhYkl0ZW0uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9QUkVGRVJFTkNFU19UQUJfTkFNRSk7Ci0gICAgICAgIHdzZGwySmF2YVRhYkl0ZW0uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfUFJFRkVSRU5DRVNfVEFCX1RPT0xUSVApOwotCi0gICAgICAgIHdzZGwySmF2YVByZWZlcmVuY2VzR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGN4ZlByZWZlcmVuY2VUYWIsIFNXVC5OT05FKTsKLSAgICAgICAgCi0gICAgICAgIHdzZGwyamF2YVN0YWNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0gICAgICAgIHdzZGwySmF2YVByZWZlcmVuY2VzR3JvdXAuc2V0TGF5b3V0KHdzZGwyamF2YVN0YWNrTGF5b3V0KTsKLQotICAgICAgICB3c2RsMkphdmEyMFByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh3c2RsMkphdmFQcmVmZXJlbmNlc0dyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgd3NkbDJKYXZhMjBHcmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHdzZGwySmF2YTIwUHJlZmVyZW5jZXNDb21wb3NpdGUuc2V0TGF5b3V0KHdzZGwySmF2YTIwR3JpZExheW91dCk7Ci0KLSAgICAgICAgY3hmMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBDWEYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlKAotICAgICAgICAgICAgICAgIHdzZGwySmF2YTIwUHJlZmVyZW5jZXNDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgY3hmMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5hZGRDb250cm9scygpOwotCi0gICAgICAgIHdzZGwySmF2YTIxUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHdzZGwySmF2YVByZWZlcmVuY2VzR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCB3c2RsMkphdmEyMUdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgd3NkbDJKYXZhMjFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5zZXRMYXlvdXQod3NkbDJKYXZhMjFHcmlkTGF5b3V0KTsKLQotICAgICAgICBjeGYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IENYRjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUoCi0gICAgICAgICAgICAgICAgd3NkbDJKYXZhMjFQcmVmZXJlbmNlc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBjeGYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlLmFkZENvbnRyb2xzKCk7Ci0KLSAgICAgICAgd3NkbDJKYXZhQmxhbmtQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBCbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSh3c2RsMkphdmFQcmVmZXJlbmNlc0dyb3VwLAotICAgICAgICAgICAgICAgIFNXVC5OT05FKTsKLQotICAgICAgICB3c2RsMkphdmFUYWJJdGVtLnNldENvbnRyb2wod3NkbDJKYXZhUHJlZmVyZW5jZXNHcm91cCk7Ci0gICAgICAgIAotICAgICAgICAvL0pBWC1XUwotICAgICAgICBUYWJJdGVtIGFubm90YXRpb25zVGFiSXRlbSA9IG5ldyBUYWJJdGVtKGN4ZlByZWZlcmVuY2VUYWIsIFNXVC5OT05FKTsKLSAgICAgICAgYW5ub3RhdGlvbnNUYWJJdGVtLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5BTk5PVEFUSU9OU19QUkVGRVJFTkNFU19UQUJfTkFNRSk7Ci0gICAgICAgIGFubm90YXRpb25zVGFiSXRlbS5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQKTsKLSAgICAgICAgCi0gICAgICAgIGpheHdzUHJlZmVyZW5jZXNHcm91cCA9IG5ldyBDb21wb3NpdGUoY3hmUHJlZmVyZW5jZVRhYiwgU1dULk5PTkUpOwotICAgICAgICAKLSAgICAgICAgamF4d3NTdGFja0xheW91dCA9IG5ldyBTdGFja0xheW91dCgpOwotICAgICAgICBqYXh3c1ByZWZlcmVuY2VzR3JvdXAuc2V0TGF5b3V0KGpheHdzU3RhY2tMYXlvdXQpOwotICAgICAgICAKLSAgICAgICAgamF4d3NQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoamF4d3NQcmVmZXJlbmNlc0dyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgamF4d3NHcmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIGpheHdzUHJlZmVyZW5jZXNDb21wb3NpdGUuc2V0TGF5b3V0KGpheHdzR3JpZExheW91dCk7Ci0gICAgICAgIGFubm90YXRpb25zQ29tcG9zaXRlID0gbmV3IEFubm90YXRpb25zQ29tcG9zaXRlKGpheHdzUHJlZmVyZW5jZXNDb21wb3NpdGUsICBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgCi0gICAgICAgIGpheHdzQmxhbmtQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBCbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZShqYXh3c1ByZWZlcmVuY2VzR3JvdXAsCi0gICAgICAgICAgICAgICAgU1dULk5PTkUpOwotICAgICAgICAKLSAgICAgICAgYW5ub3RhdGlvbnNUYWJJdGVtLnNldENvbnRyb2woamF4d3NQcmVmZXJlbmNlc0dyb3VwKTsKLSAgICAgICAgCi0gICAgICAgIC8vU3ByaW5nIENvbmZpZwotICAgICAgICBUYWJJdGVtIHNwcmluZ0NvbmZpZ1RhYkl0ZW0gPSBuZXcgVGFiSXRlbShjeGZQcmVmZXJlbmNlVGFiLCBTV1QuTk9ORSk7Ci0gICAgICAgIHNwcmluZ0NvbmZpZ1RhYkl0ZW0uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLlNQUklOR19DT05GSUdfUFJFRkVSRU5DRVNfVEFCX05BTUUpOwotICAgICAgICBzcHJpbmdDb25maWdUYWJJdGVtLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuU1BSSU5HX0NPTkZJR19QUkVGRVJFTkNFU19UQUJfVE9PTFRJUCk7Ci0gICAgICAgIAotICAgICAgICBzcHJpbmdDb25maWdQcmVmZXJuY2VzR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGN4ZlByZWZlcmVuY2VUYWIsIFNXVC5OT05FKTsKLSAgICAgICAgCi0gICAgICAgIHNwcmluZ0NvbmZpZ1N0YWNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0gICAgICAgIHNwcmluZ0NvbmZpZ1ByZWZlcm5jZXNHcm91cC5zZXRMYXlvdXQoc3ByaW5nQ29uZmlnU3RhY2tMYXlvdXQpOwotICAgICAgICAKLSAgICAgICAgc3ByaW5nUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNwcmluZ0NvbmZpZ1ByZWZlcm5jZXNHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IHNwcmluZ0dyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgc3ByaW5nUHJlZmVyZW5jZXNDb21wb3NpdGUuc2V0TGF5b3V0KHNwcmluZ0dyaWRMYXlvdXQpOwotICAgICAgICBzcHJpbmdDb25maWdDb21wb3NpdGUgPSBuZXcgU3ByaW5nQ29uZmlnQ29tcG9zaXRlKHNwcmluZ1ByZWZlcmVuY2VzQ29tcG9zaXRlLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgCi0gICAgICAgIHNwcmluZ0NvbmZpZ0JsYW5rUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgQmxhbmtSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUoc3ByaW5nQ29uZmlnUHJlZmVybmNlc0dyb3VwLAotICAgICAgICAgICAgICAgIFNXVC5OT05FKTsKLQotICAgICAgICBzcHJpbmdDb25maWdUYWJJdGVtLnNldENvbnRyb2woc3ByaW5nQ29uZmlnUHJlZmVybmNlc0dyb3VwKTsKLQotICAgICAgICBoYW5kbGVQcmVmZXJlbmNlQ29udHJvbHMoKTsKLQotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVQcmVmZXJlbmNlQ29udHJvbHMoKSB7Ci0gICAgICAgIGlmIChjb250ZXh0LmdldEN4ZlJ1bnRpbWVMb2NhdGlvbigpLmVxdWFscygiIikgfHwgY29udGV4dC5nZXRDeGZSdW50aW1lVmVyc2lvbigpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICBqYXZhMldTU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IGphdmEyV1NCbGFua1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgICAgICAgICAgd3NkbDJqYXZhU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IHdzZGwySmF2YUJsYW5rUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgICAgICAgICBqYXh3c1N0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBqYXh3c0JsYW5rUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgICAgICAgICBzcHJpbmdDb25maWdTdGFja0xheW91dC50b3BDb250cm9sID0gc3ByaW5nQ29uZmlnQmxhbmtQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0LmdldEN4ZlJ1bnRpbWVWZXJzaW9uKCkuY29tcGFyZVRvKENYRkNvcmVQbHVnaW4uQ1hGX1ZFUlNJT05fMl8xKSA+PSAwKSB7Ci0gICAgICAgICAgICBqYXZhMldTU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IGphdmEyV1NQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICAgICAgICAgIHdzZGwyamF2YVN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSB3c2RsMkphdmEyMVByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgICAgICAgICAgamF4d3NTdGFja0xheW91dC50b3BDb250cm9sID0gamF4d3NQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICAgICAgICAgIHNwcmluZ0NvbmZpZ1N0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBzcHJpbmdQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGphdmEyV1NTdGFja0xheW91dC50b3BDb250cm9sID0gamF2YTJXU0RMUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgICAgICAgICB3c2RsMmphdmFTdGFja0xheW91dC50b3BDb250cm9sID0gd3NkbDJKYXZhMjBQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICAgICAgICAgIGpheHdzU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IGpheHdzUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgICAgICAgICBzcHJpbmdDb25maWdTdGFja0xheW91dC50b3BDb250cm9sID0gc3ByaW5nUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgICAgIH0KLSAgICAgICAgamF2YTJXU1ByZWZlcm5jZXNHcm91cC5sYXlvdXQoKTsKLSAgICAgICAgd3NkbDJKYXZhUHJlZmVyZW5jZXNHcm91cC5sYXlvdXQoKTsKLSAgICAgICAgamF4d3NQcmVmZXJlbmNlc0dyb3VwLmxheW91dCgpOwotICAgICAgICBzcHJpbmdDb25maWdQcmVmZXJuY2VzR3JvdXAubGF5b3V0KCk7Ci0gICAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgY2hlY2tSdW50aW1lRXhpc3QoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgRmlsZSBjeGZIb21lRGlyID0gbmV3IEZpbGUocGF0aCk7Ci0gICAgICAgIGlmIChjeGZIb21lRGlyVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBDWEZfTE9DQVRJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgIENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1JVTlRJTUVfTk9UX1NFVCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGN4ZkxpYlBhdGggPSBjeGZIb21lRGlyICsgU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpICsgImxpYiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBpZiAoY3hmSG9tZURpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBGaWxlIGN4ZkxpYkZvbGRlciA9IG5ldyBGaWxlKGN4ZkxpYlBhdGgpOwotICAgICAgICAgICAgaWYgKGN4ZkxpYkZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gY3hmSmFyRmlsZXMgPSBnZXRDWEZKYXJGaWxlcyhjeGZMaWJGb2xkZXIpOwotICAgICAgICAgICAgICAgIGlmIChjeGZKYXJGaWxlcyAhPSBudWxsICYmIGN4ZkphckZpbGVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgSVN0YXR1cyB0b29sVmVyc2lvblN0YXR1cyA9IGdldFRvb2xWZXJzaW9uKGN4ZkxpYlBhdGgpOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVG9vbFZlcnNpb24odG9vbFZlcnNpb25TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICBDWEZfTE9DQVRJT05fU1RBVFVTID0gT0tfU1RBVFVTOwotICAgICAgICAgICAgICAgICAgICBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENYRl9MT0NBVElPTl9TVEFUVVM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnRleHQuc2V0Q3hmUnVudGltZUxvY2F0aW9uKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjb250ZXh0LnNldEN4ZlJ1bnRpbWVWZXJzaW9uKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjeGZUb29sVmVyc2lvbkxhYmVsLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lckJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgQ1hGX0xPQ0FUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoU3RhdHVzLkVSUk9SLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUlVOVElNRV9OT1RfU0VUKTsKLSAgICAgICAgcmV0dXJuIENYRl9MT0NBVElPTl9TVEFUVVM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJU3RhdHVzIGdldFRvb2xWZXJzaW9uKFN0cmluZyBjeExpYkZvbGRlclBhdGgpIHsKLSAgICAgICAgRmlsZSBjeGZMaWJGb2xkZXIgPSBuZXcgRmlsZShjeExpYkZvbGRlclBhdGgpOwotICAgICAgICBMaXN0PFN0cmluZz4gY3hmTGliID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIFN0cmluZ1tdIGphckZpbGVzID0gY3hmTGliRm9sZGVyLmxpc3QobmV3IEZpbGVuYW1lRmlsdGVyKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBmb3IgKFN0cmluZyBqYXJGaWxlIDogamFyRmlsZXMpIHsKLSAgICAgICAgICAgIGN4ZkxpYi5hZGQoY3hMaWJGb2xkZXJQYXRoICsgU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpICsgamFyRmlsZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIElTdGF0dXMgdG9vbFZlcnNpb25TdGF0dXMgPSBMYXVuY2hVdGlscy5sYXVuY2goY3hmTGliLnRvQXJyYXkobmV3IFN0cmluZ1tjeGZMaWIuc2l6ZSgpXSksCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY3hmLnRvb2xzLndzZGx0by5XU0RMVG9KYXZhIiwgbmV3IFN0cmluZ1tdIHsgIi12IiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHJldHVybiB0b29sVmVyc2lvblN0YXR1czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIGdldENYRkphckZpbGVzKEZpbGUgZGlyZWN0b3J5KSB7Ci0gICAgICAgIFN0cmluZ1tdIGN4ZkphckZpbGVzID0gZGlyZWN0b3J5Lmxpc3QobmV3IEZpbGVuYW1lRmlsdGVyKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoImN4ZiIpICYmIG5hbWUuZW5kc1dpdGgoIi5qYXIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGRpZ2l0UGF0dGVybi5tYXRjaGVyKG5hbWUpLmZpbmQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIGN4ZkphckZpbGVzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzVG9vbFZlcnNpb24oSVN0YXR1cyB0b29sVmVyc2lvblN0YXR1cykgewotICAgICAgICBpZiAodG9vbFZlcnNpb25TdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLklORk8pIHsKLSAgICAgICAgICAgIFN0cmluZyBjeGZUb29sVmVyc2lvbiA9IHRvb2xWZXJzaW9uU3RhdHVzLmdldE1lc3NhZ2UoKTsKLQotICAgICAgICAgICAgY3hmVG9vbFZlcnNpb24gPSBjeGZUb29sVmVyc2lvbi5zdWJzdHJpbmcoY3hmVG9vbFZlcnNpb24uaW5kZXhPZigiLSIpICsgMSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBjeGZUb29sVmVyc2lvbi5sZW5ndGgoKSkudHJpbSgpOwotCi0gICAgICAgICAgICBTdHJpbmcgY3hmUnVudGltZUVkaXRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgU3RyaW5nIGN4ZlJ1bnRpbWVWZXJzaW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gZGlnaXRQYXR0ZXJuLm1hdGNoZXIoY3hmVG9vbFZlcnNpb24pOwotICAgICAgICAgICAgaWYgKG1hdGNoZXIuZmluZCgpKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gbWF0Y2hlci5zdGFydCgpOwotICAgICAgICAgICAgICAgIGludCBlbmQgPSBtYXRjaGVyLmVuZCgpOwotICAgICAgICAgICAgICAgIHdoaWxlIChtYXRjaGVyLmZpbmQoKSkgewotICAgICAgICAgICAgICAgICAgICBlbmQgPSBtYXRjaGVyLmVuZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjeGZSdW50aW1lRWRpdGlvbiA9IGN4ZlRvb2xWZXJzaW9uLnN1YnN0cmluZygwLCBzdGFydCkudHJpbSgpOwotICAgICAgICAgICAgICAgIGN4ZlJ1bnRpbWVWZXJzaW9uID0gY3hmVG9vbFZlcnNpb24uc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBjeGZUb29sVmVyc2lvbkxhYmVsLnNldFRleHQoY3hmUnVudGltZUVkaXRpb24gKyAiICIgKyBjeGZSdW50aW1lVmVyc2lvbik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgY29udGV4dC5zZXRDeGZSdW50aW1lVmVyc2lvbihjeGZSdW50aW1lVmVyc2lvbik7Ci0gICAgICAgICAgICBjb250ZXh0LnNldEN4ZlJ1bnRpbWVFZGl0aW9uKGN4ZlJ1bnRpbWVFZGl0aW9uKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2V0Q3VycmVudFJ1bnRpbWVWZXJzaW9uKG5ldyBWZXJzaW9uKGN4ZlJ1bnRpbWVWZXJzaW9uKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3RhdHVzKCkgewotICAgICAgICBDWEZfTE9DQVRJT05fU1RBVFVTID0gY2hlY2tSdW50aW1lRXhpc3QoY3hmSG9tZURpclRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgYXBwbHlTdGF0dXNUb1BhZ2UoZmluZE1vc3RTZXZlcmUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGx5U3RhdHVzVG9QYWdlKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID4gSVN0YXR1cy5PSykgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0TWVzc2FnZShnZXRUaXRsZSgpKTsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBJU3RhdHVzIGZpbmRNb3N0U2V2ZXJlKCkgewotICAgICAgICByZXR1cm4gQ1hGX0xPQ0FUSU9OX1NUQVRVUzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0gICAgICAgIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lckJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQsIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUikpOwotICAgICAgICAKLSAgICAgICAgamF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLnNldERlZmF1bHRzKCk7Ci0gICAgICAgIGphdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuc2V0RGVmYXVsdHMoKTsKLSAgICAgICAgY3hmMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5zZXREZWZhdWx0cygpOwotICAgICAgICBjeGYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlLnNldERlZmF1bHRzKCk7Ci0gICAgICAgIGFubm90YXRpb25zQ29tcG9zaXRlLnNldERlZmF1bHRzKCk7Ci0gICAgICAgIHNwcmluZ0NvbmZpZ0NvbXBvc2l0ZS5zZXREZWZhdWx0cygpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcmVmcmVzaCgpIHsKLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0Q3hmUnVudGltZVZlcnNpb24oKS5jb21wYXJlVG8oQ1hGQ29yZVBsdWdpbi5DWEZfVkVSU0lPTl8yXzEpID49IDApIHsKLSAgICAgICAgICAgIGphdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUucmVmcmVzaCgpOwotICAgICAgICAgICAgY3hmMjFXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5yZWZyZXNoKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUucmVmcmVzaCgpOwotICAgICAgICAgICAgY3hmMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5yZWZyZXNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkgewotICAgICAgICBjb250ZXh0LnNldEV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcihleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAKLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0Q3hmUnVudGltZVZlcnNpb24oKS5jb21wYXJlVG8oQ1hGQ29yZVBsdWdpbi5DWEZfVkVSU0lPTl8yXzEpID49IDApIHsKLSAgICAgICAgICAgIGphdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuc3RvcmVWYWx1ZXMoKTsKLSAgICAgICAgICAgIGN4ZjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUuc3RvcmVWYWx1ZXMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGphdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5zdG9yZVZhbHVlcygpOwotICAgICAgICAgICAgY3hmMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5zdG9yZVZhbHVlcygpOwotICAgICAgICB9Ci0gICAgICAgIGFubm90YXRpb25zQ29tcG9zaXRlLnN0b3JlVmFsdWVzKCk7Ci0gICAgICAgIHNwcmluZ0NvbmZpZ0NvbXBvc2l0ZS5zdG9yZVZhbHVlcygpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQXBwbHkoKSB7Ci0gICAgICAgIHN1cGVyLnBlcmZvcm1BcHBseSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1DYW5jZWwoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5wZXJmb3JtQ2FuY2VsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotICAgICAgICBzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLSAgICAgICAgc2V0RGVmYXVsdHMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0gICAgICAgIHN0b3JlVmFsdWVzKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL0phdmFWaWV3ZXJGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL0phdmFWaWV3ZXJGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ0MDAwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9KYXZhVmlld2VyRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlQbHVnaW47Ci0KLS8qKgotICogPGNvZGU+Vmlld2VyRmlsdGVyPC9jb2RlPiB0aGF0IGZpbHRlcnMgb24gY2xhc3NlcyBvciBpbnRlcmZhY2VzIHdpdGhpbiBhIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVmlld2VyRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQotICAgIHByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotICAgIHByaXZhdGUgaW50IGVsZW1lbnRLaW5kczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIDxjb2RlPkphdmFWaWV3ZXJGaWx0ZXI8L2NvZGU+IGdpdmVuIGEgPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPiBhbmQgYW4KLSAgICAgKiA8Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50czwvY29kZT4gZWxlbWVudCBraW5kIHRvIHNlYXJjaCBmb3IuIEFsbCBvdGhlciBlbGVtZW50cyBhcmUgZmlsdGVyZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSBqYXZhIHByb2plY3QgdG8gZmlsdGVyCi0gICAgICogQHBhcmFtIGVsZW1lbnRLaW5kcyBhIGZsYWcgZGVmaW5pbmcgbmF0dXJlIG9mIHNlYXJjaGVkIGVsZW1lbnRzOyB0aGUgb25seSB2YWxpZCB2YWx1ZXMgYXJlOiAKLSAgICAgKiAgPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1M8L2NvZGU+Ci0gICAgICogIDxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLklOVEVSRkFDRTwvY29kZT4KLSAgICAgKiAgPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1NfQU5EX0lOVEVSRkFDRTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgSmF2YVZpZXdlckZpbHRlcihJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGludCBlbGVtZW50S2luZHMpIHsKLSAgICAgICAgdGhpcy5qYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotICAgICAgICB0aGlzLmVsZW1lbnRLaW5kcyA9IGVsZW1lbnRLaW5kczsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGphdmFQcm9qZWN0LmVxdWFscygoSUphdmFQcm9qZWN0KSBlbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLSAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBlbGVtZW50OwotICAgICAgICAgICAgICAgIHJldHVybiBwYWNrYWdlRnJhZ21lbnRSb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewotICAgICAgICAgICAgICAgIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gKElQYWNrYWdlRnJhZ21lbnQpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VGcmFnbWVudC5oYXNDaGlsZHJlbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdCkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gY29tcGlsYXRpb25Vbml0LmZpbmRQcmltYXJ5VHlwZSgpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAoZWxlbWVudEtpbmRzKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuaXNDbGFzcygpOwotICAgICAgICAgICAgICAgIGNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuSU5URVJGQUNFOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5pc0ludGVyZmFjZSgpICYmICF0eXBlLmlzQW5ub3RhdGlvbigpOwotICAgICAgICAgICAgICAgIGNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1NfQU5EX0lOVEVSRkFDRToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuaXNDbGFzcygpIHx8ICh0eXBlLmlzSW50ZXJmYWNlKCkgJiYgIXR5cGUuaXNBbm5vdGF0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBDWEZVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9QYWNrYWdlTmFtZUNvbHVtbkxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL1BhY2thZ2VOYW1lQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjA2NzQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL1BhY2thZ2VOYW1lQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLldTRExVdGlsczsKLQotcHVibGljIGNsYXNzIFBhY2thZ2VOYW1lQ29sdW1uTGFiZWxQcm92aWRlciBleHRlbmRzIENvbHVtbkxhYmVsUHJvdmlkZXIgewotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBpbmNsdWRlZE5hbWVzcGFjZXM7Ci0KLSAgICBwdWJsaWMgUGFja2FnZU5hbWVDb2x1bW5MYWJlbFByb3ZpZGVyKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBpbmNsdWRlZE5hbWVzcGFjZXMgPSBtb2RlbC5nZXRJbmNsdWRlZE5hbWVzcGFjZXMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGluY2x1ZGVkTmFtZXNwYWNlcy5jb250YWluc0tleShlbGVtZW50LnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gaW5jbHVkZWROYW1lc3BhY2VzLmdldChlbGVtZW50LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXU0RMVXRpbHMuZ2V0UGFja2FnZU5hbWVGcm9tTmFtZXNwYWNlKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9QYWNrYWdlTmFtZUVkaXRpbmdTdXBwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9QYWNrYWdlTmFtZUVkaXRpbmdTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NjU3ZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3ZpZXdlcnMvUGFja2FnZU5hbWVFZGl0aW5nU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkVkaXRpbmdTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5XU0RMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotCi1wdWJsaWMgY2xhc3MgUGFja2FnZU5hbWVFZGl0aW5nU3VwcG9ydCBleHRlbmRzIEVkaXRpbmdTdXBwb3J0IGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotICAgIHByaXZhdGUgQ2VsbEVkaXRvciBwYWNrYWdlTmFtZUNlbGxFZGl0b3I7Ci0gICAgcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gaW5jbHVkZWROYW1lc3BhY2VzOwotCi0gICAgcHVibGljIFBhY2thZ2VOYW1lRWRpdGluZ1N1cHBvcnQoVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXIsIENlbGxFZGl0b3IgcGFja2FnZU5hbWVDZWxsRWRpdG9yLAotICAgICAgICAgICAgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHN1cGVyKHRhYmxlVmlld2VyKTsKLSAgICAgICAgdGhpcy50YWJsZSA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0gICAgICAgIHRoaXMucGFja2FnZU5hbWVDZWxsRWRpdG9yID0gcGFja2FnZU5hbWVDZWxsRWRpdG9yOwotICAgICAgICBpbmNsdWRlZE5hbWVzcGFjZXMgPSBtb2RlbC5nZXRJbmNsdWRlZE5hbWVzcGFjZXMoKTsKLSAgICAgICAgdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuRWRpdChPYmplY3QgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gdGFibGUuZ2V0U2VsZWN0aW9uKClbMF0uZ2V0Q2hlY2tlZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDZWxsRWRpdG9yIGdldENlbGxFZGl0b3IoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lQ2VsbEVkaXRvcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChpbmNsdWRlZE5hbWVzcGFjZXMuY29udGFpbnNLZXkoZWxlbWVudC50b1N0cmluZygpKSkgewotICAgICAgICAgICAgcmV0dXJuIGluY2x1ZGVkTmFtZXNwYWNlcy5nZXQoZWxlbWVudC50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV1NETFV0aWxzLmdldFBhY2thZ2VOYW1lRnJvbU5hbWVzcGFjZShlbGVtZW50LnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFZhbHVlKE9iamVjdCBuYW1lc3BhY2UsIE9iamVjdCBwYWNrYWdlTmFtZSkgewotICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwgJiYgcGFja2FnZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaW5jbHVkZWROYW1lc3BhY2VzLnB1dChuYW1lc3BhY2UudG9TdHJpbmcoKSwgcGFja2FnZU5hbWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBnZXRWaWV3ZXIoKS51cGRhdGUobmFtZXNwYWNlLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChldmVudC5kZXRhaWwgPT0gU1dULkNIRUNLKSB7Ci0gICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGV2ZW50Lml0ZW07Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlS2V5ID0gaXRlbS5nZXRUZXh0KDApOwotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gaXRlbS5nZXRUZXh0KDEpOwotICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0Q2hlY2tlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbmNsdWRlZE5hbWVzcGFjZXMuY29udGFpbnNLZXkobmFtZXNwYWNlS2V5KSkgewotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZE5hbWVzcGFjZXMucHV0KG5hbWVzcGFjZUtleSwgcGFja2FnZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVkTmFtZXNwYWNlcy5jb250YWluc0tleShuYW1lc3BhY2VLZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkTmFtZXNwYWNlcy5yZW1vdmUobmFtZXNwYWNlS2V5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL1BhY2thZ2VOYW1lVGFibGVDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL1BhY2thZ2VOYW1lVGFibGVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjljYjZlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9QYWNrYWdlTmFtZVRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi1wdWJsaWMgY2xhc3MgUGFja2FnZU5hbWVUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0gICAgICAgIExpc3Q8T2JqZWN0PiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotICAgICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgRGVmaW5pdGlvbikgewotICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGlucHV0RWxlbWVudDsKLSAgICAgICAgICAgIE1hcCBuYW1lc3BhY2VzID0gZGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCk7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uIHZhbHVlcyA9IG5hbWVzcGFjZXMudmFsdWVzKCk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBuYW1lc3BhY2VWYWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBuYW1lc3BhY2VWYWx1ZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGlmICghbmFtZXNwYWNlLmVxdWFscyhkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKSAmJiAhZWxlbWVudHMuY29udGFpbnMobmFtZXNwYWNlKSkgewotICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5hZGQobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnRzLnRvQXJyYXkobmV3IE9iamVjdFtlbGVtZW50cy5zaXplKCldKTsKLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvQW5ub3RhdGlvbnNDb21wb3NpdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0Fubm90YXRpb25zQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MDQ3OTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvQW5ub3RhdGlvbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dC5KYXZhMldTUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25zQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLSAgICBwcml2YXRlIEphdmEyV1NQZXJzaXN0ZW50Q29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLSAgICAKLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZVdlYk1ldGhvZEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZVdlYlBhcmFtQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJCdXR0b247Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBlbmFibGVBUFRCdXR0b247Ci0gICAgCi0gICAgcHVibGljIEFubm90YXRpb25zQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICAgICAgYWRkQ29udHJvbHMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQ29udHJvbHMoKSB7Ci0gICAgICAgIEdyaWRMYXlvdXQgcHJlZmxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICB0aGlzLnNldExheW91dChwcmVmbGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBHcm91cCBqYXh3c0Fubm90YXRpb25zR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULlNIQURPV19JTik7Ci0gICAgICAgIGpheHdzQW5ub3RhdGlvbnNHcm91cC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFYV1NfQU5OT1RBVElPTlNfR1JPVVBfTEFCRUwpOwotICAgICAgICBqYXh3c0Fubm90YXRpb25zR3JvdXAuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5KQVhXU19BTk5PVEFUSU9OU19HUk9VUF9UT09MVElQKTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIGpheHdzQW5ub3RhdGlvbnNHcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBqYXh3c0Fubm90YXRpb25zR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgZ2VuZXJhdGVXZWJNZXRob2RCdXR0b24gPSBuZXcgQnV0dG9uKGpheHdzQW5ub3RhdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ2VuZXJhdGVXZWJNZXRob2RCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBWFdTX0dFTkVSQVRFX1dFQl9NRVRIT0QpOwotICAgICAgICBnZW5lcmF0ZVdlYk1ldGhvZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbihzZWxlY3RlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBnZW5lcmF0ZVdlYk1ldGhvZEJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpKTsKLSAgICAgICAgCi0gICAgICAgIGdlbmVyYXRlV2ViUGFyYW1CdXR0b24gPSBuZXcgQnV0dG9uKGpheHdzQW5ub3RhdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ2VuZXJhdGVXZWJQYXJhbUJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFYV1NfR0VORVJBVEVfV0VCX1BBUkFNKTsKLSAgICAgICAgZ2VuZXJhdGVXZWJQYXJhbUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKHNlbGVjdGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlbmVyYXRlV2ViUGFyYW1CdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpKTsKLSAgICAgICAgCi0gICAgICAgIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJCdXR0b24gPSBuZXcgQnV0dG9uKGpheHdzQW5ub3RhdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFYV1NfR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSKTsKLSAgICAgICAgZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKHNlbGVjdGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpKTsKLSAgICAgICAgCi0gICAgICAgIGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQnV0dG9uID0gbmV3IEJ1dHRvbihqYXh3c0Fubm90YXRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVhXU19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSKTsKLSAgICAgICAgZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzZWxlY3RlZCA9ICgoQnV0dG9uKSBlLndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oc2VsZWN0ZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKSk7Ci0KLSAgICAgICAgR3JvdXAgYW5ub3RhdGlvblByb2Nlc3NpbmdHcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgYW5ub3RhdGlvblByb2Nlc3NpbmdHcm91cC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFYV1NfQU5OT1RBVElPTlNfUFJPQ0VTU0lOR19HUk9VUF9MQUJFTCk7Ci0gICAgICAgIGFubm90YXRpb25Qcm9jZXNzaW5nR3JvdXAuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgIENYRlVJTWVzc2FnZXMuSkFYV1NfRU5BQkxFX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19UT09MVElQLCAKLSAgICAgICAgICAgICAgICBjb250ZXh0LmdldEN4ZlJ1bnRpbWVFZGl0aW9uKCkpKTsKLSAgICAgICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBhbm5vdGF0aW9uUHJvY2Vzc2luZ0dyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGFubm90YXRpb25Qcm9jZXNzaW5nR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgZW5hYmxlQVBUQnV0dG9uID0gbmV3IEJ1dHRvbihhbm5vdGF0aW9uUHJvY2Vzc2luZ0dyb3VwLCBTV1QuQ0hFQ0spOwotICAgICAgICBlbmFibGVBUFRCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBWFdTX0VOQUJMRV9BTk5PVEFUSU9OX1BST0NFU1NJTkcpOwotICAgICAgICBlbmFibGVBUFRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzZWxlY3RlZCA9ICgoQnV0dG9uKSBlLndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoc2VsZWN0ZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZW5hYmxlQVBUQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRzKCkgewotICAgICAgICBnZW5lcmF0ZVdlYk1ldGhvZEJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTikpOwotICAgICAgICAKLSAgICAgICAgZ2VuZXJhdGVXZWJQYXJhbUJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OKSk7Ci0gICAgICAgIAotICAgICAgICBnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULCAKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OKSk7Ci0gICAgICAgIAotICAgICAgICBnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTikpOwotICAgICAgICAKLSAgICAgICAgZW5hYmxlQVBUQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRUQpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKGdlbmVyYXRlV2ViTWV0aG9kQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbihnZW5lcmF0ZVdlYlBhcmFtQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbihnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldEFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZChlbmFibGVBUFRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0JsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9CbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGU0MWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0JsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi1wdWJsaWMgY2xhc3MgQmxhbmtSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotCi0gICAgcHVibGljIEJsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQotICAgICAgICBhZGRDb250cm9scygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRDb250cm9scygpIHsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIENMYWJlbCBzZXRJbnRhbGxEaXJMYWJlbCA9IG5ldyBDTGFiZWwodGhpcywgU1dULk5PTkUpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgc2V0SW50YWxsRGlyTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIHNldEludGFsbERpckxhYmVsLnNldEltYWdlKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoCi0gICAgICAgICAgICAgICAgSVNoYXJlZEltYWdlcy5JTUdfT0JKU19FUlJPUl9UU0spKTsKLSAgICAgICAgc2V0SW50YWxsRGlyTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX05PVF9TRVQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvQ1hGMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvQ1hGMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDFkOWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0NYRjIwV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLQotcHVibGljIGNsYXNzIENYRjIwV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotICAgIFdTREwySmF2YUNvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdTREwySmF2YUNvbnRleHQoKTsKLQotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlU2VydmVyQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbjsKLQotICAgIHByaXZhdGUgQnV0dG9uIHVzZURlZmF1bHRWYWx1ZXNCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBUYWJsZSB4amNBcmdzVGFibGU7Ci0KLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNEZWZhdWx0VmFsdWVzVGFibGVJdGVtOwotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY1RvU3RyaW5nVGFibGVJdGVtOwotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtOwotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtOwotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY0xvY2F0b3JUYWJsZUl0ZW07Ci0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjU3luY01ldGhvZHNUYWJsZUl0ZW07Ci0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjTWFya0dlbmVyYXRlZFRhYmxlSXRlbTsKLQotICAgIHB1YmxpYyBDWEYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb250cm9scygpIHsKLSAgICAgICAgR3JpZExheW91dCBwcmVmbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KHByZWZsYXlvdXQpOwotCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB0aGlzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEdyb3VwIHdzZGwyamF2YUdyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0dST1VQX0xBQkVMKTsKLSAgICAgICAgR3JpZExheW91dCB3c2RsMmphdmFsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0TGF5b3V0KHdzZGwyamF2YWxheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVTZXJ2ZXJCdXR0b24od3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBnZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVHZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uKAotICAgICAgICAgICAgICAgIHdzZGwyamF2YUdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgCi0gICAgICAgIHVzZURlZmF1bHRWYWx1ZXNCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZURlZmF1bHRWYWx1ZXNCdXR0b24od3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotCi0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uKHdzZGwyamF2YUdyb3VwLAotICAgICAgICAgICAgICAgIGNvbnRleHQpOwotCi0gICAgICAgIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVOYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbigKLSAgICAgICAgICAgICAgICB3c2RsMmphdmFHcm91cCwgY29udGV4dCk7Ci0KLSAgICAgICAgZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVFeGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24oCi0gICAgICAgICAgICAgICAgd3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotICAgICAgICAKLSAgICAgICAgaWYgKENYRk1vZGVsVXRpbHMuaXNBdXRvTmFtZVJlc29sdXRpb25QZXJtaXR0ZWQoKSkgewotICAgICAgICAgICAgYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVBdXRvTmFtZVJlc29sdXRpb25CdXR0b24od3NkbDJqYXZhR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgR3JvdXAgeGpjQXJnR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULlNIQURPV19JTik7Ci0gICAgICAgIHhqY0FyZ0dyb3VwLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX0FSR19HUk9VUF9USVRMRSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgeGpjQXJnTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHhqY0FyZ0dyb3VwLnNldExheW91dCh4amNBcmdMYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgeGpjQXJnR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgeGpjQXJnc1RhYmxlID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNBcmdUYWJsZSh4amNBcmdHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgZ3JpZERhdGEudmVydGljYWxTcGFuID0gNjsKLSAgICAgICAgeGpjQXJnc1RhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHhqY0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLAotICAgICAgICAgICAgICAgIGNvbnRleHQpOwotICAgICAgICB4amNUb1N0cmluZ1RhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDVG9TdHJpbmdUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBjb250ZXh0KTsKLSAgICAgICAgeGpjVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtKAotICAgICAgICAgICAgICAgIHhqY0FyZ3NUYWJsZSwgY29udGV4dCk7Ci0gICAgICAgIHhqY1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbSh4amNBcmdzVGFibGUsCi0gICAgICAgICAgICAgICAgY29udGV4dCk7Ci0gICAgICAgIHhqY0xvY2F0b3JUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ0xvY2F0b3JUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBjb250ZXh0KTsKLSAgICAgICAgeGpjU3luY01ldGhvZHNUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1N5bmNNZXRob2RzVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgY29udGV4dCk7Ci0gICAgICAgIHhqY01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLAotICAgICAgICAgICAgICAgIGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRzKCkgewotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19VU0VfREVGQVVMVF9WQUxVRVMpKTsKLQotICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fR0VORVJBVEVfU0VSVkVSKSk7Ci0gICAgICAgIGdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OKSk7Ci0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fUFJPQ0VTU19TT0FQX0hFQURFUlMpKTsKLSAgICAgICAgbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElORykpOwotICAgICAgICBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HKSk7Ci0KLSAgICAgICAgaWYgKGNhblVwZGF0ZUF1dG9OYW1lUmVzb2x1dGlvbigpKSB7Ci0gICAgICAgICAgICBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0FVVE9fTkFNRV9SRVNPTFVUSU9OKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB4amNEZWZhdWx0VmFsdWVzVGFibGVJdGVtLnNldENoZWNrZWQoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUykpOwotICAgICAgICB4amNUb1N0cmluZ1RhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklORykpOwotICAgICAgICB4amNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORSkpOwotICAgICAgICB4amNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfU0lNUExFKSk7Ci0gICAgICAgIHhqY0xvY2F0b3JUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19MT0NBVE9SKSk7Ci0gICAgICAgIHhqY1N5bmNNZXRob2RzVGFibGVJdGVtLnNldENoZWNrZWQoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1NZTkNfTUVUSE9EUykpOwotICAgICAgICB4amNNYXJrR2VuZXJhdGVkVGFibGVJdGVtLnNldENoZWNrZWQoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX01BUktfR0VORVJBVEVEKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0gICAgICAgIHVzZURlZmF1bHRWYWx1ZXNCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNVc2VEZWZhdWx0VmFsdWVzKCkpOwotICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlU2VydmVyKCkpOwotICAgICAgICBnZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpKTsKLSAgICAgICAgcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzUHJvY2Vzc1NPQVBIZWFkZXJzKCkpOwotICAgICAgICBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkpOwotICAgICAgICBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChjYW5VcGRhdGVBdXRvTmFtZVJlc29sdXRpb24oKSkgewotICAgICAgICAgICAgYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzQXV0b05hbWVSZXNvbHV0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB4amNEZWZhdWx0VmFsdWVzVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY1VzZURlZmF1bHRWYWx1ZXMoKSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY1RvU3RyaW5nKCkpOwotICAgICAgICB4amNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNUb1N0cmluZ011bHRpTGluZSgpKTsKLSAgICAgICAgeGpjVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjVG9TdHJpbmdTaW1wbGUoKSk7Ci0gICAgICAgIHhqY0xvY2F0b3JUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjTG9jYXRvcigpKTsKLSAgICAgICAgeGpjU3luY01ldGhvZHNUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjU3luY01ldGhvZHMoKSk7Ci0gICAgICAgIHhqY01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjTWFya0dlbmVyYXRlZCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0gICAgICAgIGNvbnRleHQuc2V0VXNlRGVmYXVsdFZhbHVlcyh1c2VEZWZhdWx0VmFsdWVzQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVNlcnZlcihnZW5lcmF0ZVNlcnZlckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVJbXBsZW1lbnRhdGlvbihnZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRQcm9jZXNzU09BUEhlYWRlcnMocHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyhuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChjYW5VcGRhdGVBdXRvTmFtZVJlc29sdXRpb24oKSkgewotICAgICAgICAgICAgY29udGV4dC5zZXRBdXRvTmFtZVJlc29sdXRpb24oYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY29udGV4dC5zZXRYamNVc2VEZWZhdWx0VmFsdWVzKHhqY0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgY29udGV4dC5zZXRYamNUb1N0cmluZyh4amNUb1N0cmluZ1RhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgICAgICBjb250ZXh0LnNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKHhqY1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0WGpjVG9TdHJpbmdTaW1wbGUoeGpjVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgY29udGV4dC5zZXRYamNMb2NhdG9yKHhqY0xvY2F0b3JUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgY29udGV4dC5zZXRYamNTeW5jTWV0aG9kcyh4amNTeW5jTWV0aG9kc1RhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgICAgICBjb250ZXh0LnNldFhqY01hcmtHZW5lcmF0ZWQoeGpjTWFya0dlbmVyYXRlZFRhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gY2FuVXBkYXRlQXV0b05hbWVSZXNvbHV0aW9uKCkgewotICAgICAgICByZXR1cm4gYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uICE9IG51bGwgJiYgQ1hGTW9kZWxVdGlscy5pc0F1dG9OYW1lUmVzb2x1dGlvblBlcm1pdHRlZCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvQ1hGMjFXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvQ1hGMjFXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDJjYjMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0NYRjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLQotcHVibGljIGNsYXNzIENYRjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotICAgIFdTREwySmF2YUNvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdTREwySmF2YUNvbnRleHQoKTsKLQotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlU2VydmVyQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbjsKLQotICAgIHByaXZhdGUgVGFibGUgeGpjQXJnc1RhYmxlOwotCi0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjRGVmYXVsdFZhbHVlc1RhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNUb1N0cmluZ1RhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNMb2NhdG9yVGFibGVJdGVtOwotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY1N5bmNNZXRob2RzVGFibGVJdGVtOwotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW07Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG5vQWRkcmVzc0JpbmRpbmdCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uOwotCi0gICAgcHVibGljIENYRjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgc3R5bGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbnRyb2xzKCkgewotICAgICAgICBHcmlkTGF5b3V0IHByZWZsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXQocHJlZmxheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgR3JvdXAgd3NkbDJqYXZhR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULlNIQURPV19JTik7Ci0gICAgICAgIHdzZGwyamF2YUdyb3VwLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfR1JPVVBfTEFCRUwpOwotICAgICAgICBHcmlkTGF5b3V0IHdzZGwyamF2YWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0TGF5b3V0KHdzZGwyamF2YWxheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBGcm9udGVuZAotICAgICAgICAvLyBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUZyb250ZW5kTGFiZWwod3NkbDJqYXZhR3JvdXApOwotICAgICAgICAvLyBDb21ibyBmcm9udGVuZENvbWJvID0KLSAgICAgICAgLy8gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVGcm9udGVuZENvbWJvKHdzZGwyamF2YUdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgLy8gZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIC8vIGZyb250ZW5kQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy8gRGF0YWJpbmRpbmcKLSAgICAgICAgLy8gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVEYXRhYmluZGluZ0xhYmVsKHdzZGwyamF2YUdyb3VwKTsKLSAgICAgICAgLy8gQ29tYm8gZGF0YWJpbmRpbmdDb21ibyA9Ci0gICAgICAgIC8vIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRGF0YWJpbmRpbmdDb21ibyh3c2RsMmphdmFHcm91cCwKLSAgICAgICAgLy8gY29udGV4dCk7Ci0gICAgICAgIC8vIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICAvLyBkYXRhYmluZGluZ0NvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vIFdTREwgVmVyc2lvbgotICAgICAgICAvLyBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LiBjcmVhdGVXU0RMVmVyc2lvbkxhYmVsKHdzZGwyamF2YUdyb3VwKTsKLSAgICAgICAgLy8gQ29tYm8gd3NkbFZlcnNpb25Db21ibyA9Ci0gICAgICAgIC8vIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlV1NETFZlcnNpb25Db21ibyh3c2RsMmphdmFHcm91cCwKLSAgICAgICAgLy8gY29udGV4dCk7Ci0gICAgICAgIC8vIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICAvLyB3c2RsVmVyc2lvbkNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGdlbmVyYXRlU2VydmVyQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVHZW5lcmF0ZVNlcnZlckJ1dHRvbih3c2RsMmphdmFHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGdlbmVyYXRlU2VydmVyQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b24oCi0gICAgICAgICAgICAgICAgd3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBnZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHVzZURlZmF1bHRWYWx1ZXNCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZURlZmF1bHRWYWx1ZXNCdXR0b24od3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAKLSAgICAgICAgcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVQcm9jZXNzU09BUEhlYWRlcnNCdXR0b24od3NkbDJqYXZhR3JvdXAsCi0gICAgICAgICAgICAgICAgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlTmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24oCi0gICAgICAgICAgICAgICAgd3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbigKLSAgICAgICAgICAgICAgICB3c2RsMmphdmFHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBpZiAoQ1hGTW9kZWxVdGlscy5pc0F1dG9OYW1lUmVzb2x1dGlvblBlcm1pdHRlZCgpKSB7Ci0gICAgICAgICAgICBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbih3c2RsMmphdmFHcm91cCwgY29udGV4dCk7Ci0gICAgICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgICAgIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbm9BZGRyZXNzQmluZGluZ0J1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlTm9BZGRyZXNzQmluZGluZ0J1dHRvbih3c2RsMmphdmFHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIG5vQWRkcmVzc0JpbmRpbmdCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIAotICAgICAgICBHcm91cCB4amNBcmdHcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgeGpjQXJnR3JvdXAuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfQVJHX0dST1VQX1RJVExFKTsKLSAgICAgICAgR3JpZExheW91dCB4amNBcmdMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgeGpjQXJnR3JvdXAuc2V0TGF5b3V0KHhqY0FyZ0xheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB4amNBcmdHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICB4amNBcmdzVGFibGUgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ0FyZ1RhYmxlKHhqY0FyZ0dyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSA2OwotICAgICAgICB4amNBcmdzVGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgeGpjRGVmYXVsdFZhbHVlc1RhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDRGVmYXVsdFZhbHVlc1RhYmxlSXRlbSh4amNBcmdzVGFibGUsCi0gICAgICAgICAgICAgICAgY29udGV4dCk7Ci0gICAgICAgIHhqY1RvU3RyaW5nVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ1RhYmxlSXRlbSh4amNBcmdzVGFibGUsIGNvbnRleHQpOwotICAgICAgICB4amNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0oCi0gICAgICAgICAgICAgICAgeGpjQXJnc1RhYmxlLCBjb250ZXh0KTsKLSAgICAgICAgeGpjVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwKLSAgICAgICAgICAgICAgICBjb250ZXh0KTsKLSAgICAgICAgeGpjTG9jYXRvclRhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDTG9jYXRvclRhYmxlSXRlbSh4amNBcmdzVGFibGUsIGNvbnRleHQpOwotICAgICAgICB4amNTeW5jTWV0aG9kc1RhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDU3luY01ldGhvZHNUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBjb250ZXh0KTsKLSAgICAgICAgeGpjTWFya0dlbmVyYXRlZFRhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDTWFya0dlbmVyYXRlZFRhYmxlSXRlbSh4amNBcmdzVGFibGUsCi0gICAgICAgICAgICAgICAgY29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0gICAgICAgIHVzZURlZmF1bHRWYWx1ZXNCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1VTRV9ERUZBVUxUX1ZBTFVFUykpOwotICAgICAgICAKLSAgICAgICAgbm9BZGRyZXNzQmluZGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTk9fQUREUkVTU19CSU5ESU5HKSk7Ci0KLSAgICAgICAgZ2VuZXJhdGVTZXJ2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkNYRl9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX1NFUlZFUikpOwotICAgICAgICAKLSAgICAgICAgZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT04pKTsKLSAgICAgICAgCi0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fUFJPQ0VTU19TT0FQX0hFQURFUlMpKTsKLSAgICAgICAgCi0gICAgICAgIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkcpKTsKLSAgICAgICAgCi0gICAgICAgIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkcpKTsKLQotICAgICAgICBpZiAoY2FuVXBkYXRlQXV0b05hbWVSZXNvbHV0aW9uKCkpIHsKLSAgICAgICAgICAgIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fQVVUT19OQU1FX1JFU09MVVRJT04pKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgeGpjRGVmYXVsdFZhbHVlc1RhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVMpKTsKLSAgICAgICAgCi0gICAgICAgIHhqY1RvU3RyaW5nVGFibGVJdGVtLnNldENoZWNrZWQoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HKSk7Ci0gICAgICAgIAotICAgICAgICB4amNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORSkpOwotICAgICAgICAKLSAgICAgICAgeGpjVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX1NJTVBMRSkpOwotICAgICAgICAKLSAgICAgICAgeGpjTG9jYXRvclRhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0xPQ0FUT1IpKTsKLSAgICAgICAgCi0gICAgICAgIHhqY1N5bmNNZXRob2RzVGFibGVJdGVtLnNldENoZWNrZWQoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1NZTkNfTUVUSE9EUykpOwotICAgICAgICAKLSAgICAgICAgeGpjTWFya0dlbmVyYXRlZFRhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19NQVJLX0dFTkVSQVRFRCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzVXNlRGVmYXVsdFZhbHVlcygpKTsKLSAgICAgICAgbm9BZGRyZXNzQmluZGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc05vQWRkcmVzc0JpbmRpbmcoKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2FuVXBkYXRlQXV0b05hbWVSZXNvbHV0aW9uKCkpIHsKLSAgICAgICAgICAgIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0F1dG9OYW1lUmVzb2x1dGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZ2VuZXJhdGVTZXJ2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVNlcnZlcigpKTsKLSAgICAgICAgZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKSk7Ci0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc1Byb2Nlc3NTT0FQSGVhZGVycygpKTsKLSAgICAgICAgbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpKTsKLSAgICAgICAgZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKSk7Ci0KLSAgICAgICAgeGpjRGVmYXVsdFZhbHVlc1RhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkpOwotICAgICAgICB4amNUb1N0cmluZ1RhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNUb1N0cmluZygpKTsKLSAgICAgICAgeGpjVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY1RvU3RyaW5nU2ltcGxlKCkpOwotICAgICAgICB4amNMb2NhdG9yVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY0xvY2F0b3IoKSk7Ci0gICAgICAgIHhqY1N5bmNNZXRob2RzVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY1N5bmNNZXRob2RzKCkpOwotICAgICAgICB4amNNYXJrR2VuZXJhdGVkVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY01hcmtHZW5lcmF0ZWQoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0b3JlVmFsdWVzKCkgewotICAgICAgICBjb250ZXh0LnNldFVzZURlZmF1bHRWYWx1ZXModXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0Tm9BZGRyZXNzQmluZGluZyhub0FkZHJlc3NCaW5kaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChjYW5VcGRhdGVBdXRvTmFtZVJlc29sdXRpb24oKSkgewotICAgICAgICAgICAgY29udGV4dC5zZXRBdXRvTmFtZVJlc29sdXRpb24oYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVNlcnZlcihnZW5lcmF0ZVNlcnZlckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVJbXBsZW1lbnRhdGlvbihnZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRQcm9jZXNzU09BUEhlYWRlcnMocHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyhuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQotICAgICAgICBjb250ZXh0LnNldFhqY1VzZURlZmF1bHRWYWx1ZXMoeGpjRGVmYXVsdFZhbHVlc1RhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgICAgICBjb250ZXh0LnNldFhqY1RvU3RyaW5nKHhqY1RvU3RyaW5nVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0WGpjVG9TdHJpbmdNdWx0aUxpbmUoeGpjVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgY29udGV4dC5zZXRYamNUb1N0cmluZ1NpbXBsZSh4amNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgICAgICBjb250ZXh0LnNldFhqY0xvY2F0b3IoeGpjTG9jYXRvclRhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgICAgICBjb250ZXh0LnNldFhqY1N5bmNNZXRob2RzKHhqY1N5bmNNZXRob2RzVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0WGpjTWFya0dlbmVyYXRlZCh4amNNYXJrR2VuZXJhdGVkVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5VcGRhdGVBdXRvTmFtZVJlc29sdXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24gIT0gbnVsbCAmJiBDWEZNb2RlbFV0aWxzLmlzQXV0b05hbWVSZXNvbHV0aW9uUGVybWl0dGVkKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9KYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0phdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmI1ZWFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0phdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5jb250ZXh0LkphdmEyV1NQZXJzaXN0ZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLSAgICBwcml2YXRlIEphdmEyV1NQZXJzaXN0ZW50Q29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLQotICAgIHByaXZhdGUgQ29tYm8gc29hcEJpbmRpbmdDb21ibzsKLSAgICBwcml2YXRlIEJ1dHRvbiBjcmVhdGVYU0RJbXBvcnRzQnV0dG9uOyAgICAKLSAgICBwcml2YXRlIFRhYkZvbGRlciB0YWJGb2xkZXI7Ci0gICAgCi0gICAgcHVibGljIEphdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFRhYkZvbGRlciB0YWJGb2xkZXIpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgICAgIHRoaXMudGFiRm9sZGVyID0gdGFiRm9sZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbnRyb2xzKCkgewotICAgICAgICBHcmlkTGF5b3V0IHByZWZsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXQocHJlZmxheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgR3JvdXAgamF2YTJ3c2RsR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULlNIQURPV19JTik7Ci0gICAgICAgIGphdmEyd3NkbEdyb3VwLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTRExfR1JPVVBfTEFCRUwpOwotICAgICAgICBHcmlkTGF5b3V0IGphdmEyd3NsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBqYXZhMndzbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgICAgICBqYXZhMndzZGxHcm91cC5zZXRMYXlvdXQoamF2YTJ3c2xheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBqYXZhMndzZGxHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVTT0FQQmluZGluZ0xhYmVsKGphdmEyd3NkbEdyb3VwKTsKLQotICAgICAgICBzb2FwQmluZGluZ0NvbWJvID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlU09BUEJpbmdDb21ibyhqYXZhMndzZGxHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgY3JlYXRlWFNESW1wb3J0c0J1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVhTREltcG9ydHNCdXR0b24oamF2YTJ3c2RsR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGNyZWF0ZVhTREltcG9ydHNCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIAotICAgICAgICBMaW5rIGxpbmsgPSBuZXcgTGluayh0aGlzLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxpbmsuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX0xJTkspOwotICAgICAgICBsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHRhYkZvbGRlci5zZXRTZWxlY3Rpb24oMyk7IAotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0gICAgICAgIGlmIChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fU09BUDEyX0JJTkRJTkcpKSB7Ci0gICAgICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldFRleHQoIlNPQVAgMS4yIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VGV4dCgiU09BUCAxLjEiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgY3JlYXRlWFNESW1wb3J0c0J1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1hTRF9JTVBPUlRTKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0gICAgICAgIGlmIChjb250ZXh0LmlzU29hcDEyQmluZGluZygpKSB7Ci0gICAgICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldFRleHQoIlNPQVAgMS4yIik7IC8vJE5PTi1OTFMtMSQgICAgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldFRleHQoIlNPQVAgMS4xIik7IC8vJE5PTi1OTFMtMSQgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVYU0RJbXBvcnRzKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzdG9yZVZhbHVlcygpIHsKLSAgICAgICAgaWYgKHNvYXBCaW5kaW5nQ29tYm8uZ2V0VGV4dCgpLmVxdWFscygiU09BUCAxLjIiKSkgewotICAgICAgICAgICAgY29udGV4dC5zZXRTb2FwMTJCaW5kaW5nKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29udGV4dC5zZXRTb2FwMTJCaW5kaW5nKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVYU0RJbXBvcnRzKGNyZWF0ZVhTREltcG9ydHNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0phdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0phdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ2MmZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9KYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQuSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLSAgICBwcml2YXRlIEphdmEyV1NQZXJzaXN0ZW50Q29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLSAgICAKLSAgICBwcml2YXRlIENvbWJvIHNvYXBCaW5kaW5nQ29tYm87Ci0gICAgcHJpdmF0ZSBCdXR0b24gY3JlYXRlWFNESW1wb3J0c0J1dHRvbjsKLQotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlQ2xpZW50QnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlU2VydmVyQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbkJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZVdTRExCdXR0b247Ci0gICAgCi0gICAgcHJpdmF0ZSBUYWJGb2xkZXIgdGFiRm9sZGVyOwotICAgIAotICAgIHB1YmxpYyBKYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgVGFiRm9sZGVyIHRhYkZvbGRlcikgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICAgICAgdGhpcy50YWJGb2xkZXIgPSB0YWJGb2xkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQ29udHJvbHMoKSB7Ci0gICAgICAgIEdyaWRMYXlvdXQgcHJlZmxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0KLSAgICAgICAgcHJlZmxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgcHJlZmxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXQocHJlZmxheW91dCk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB0aGlzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vIEphdmEyV1MgR3JvdXAKLSAgICAgICAgR3JvdXAgamF2YTJ3c0dyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICBqYXZhMndzR3JvdXAuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfR1JPVVBfTEFCRUwpOwotICAgICAgICBHcmlkTGF5b3V0IGphdmEyd3NsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCi0gICAgICAgIGphdmEyd3NsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0KLSAgICAgICAgamF2YTJ3c2xheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLSAgICAgICAgamF2YTJ3c0dyb3VwLnNldExheW91dChqYXZhMndzbGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBqYXZhMndzR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy8gRnJvbnRlbmQKLSAgICAgICAgSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlRnJvbnRlbmRMYWJlbChqYXZhMndzR3JvdXApOwotICAgICAgICBDb21ibyBmcm9udGVuZENvbWJvID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlRnJvbnRlbmRDb21ibyhqYXZhMndzR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBmcm9udGVuZENvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vIERhdGFiaW5kaW5nCi0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZURhdGFiaW5kaW5nTGFiZWwoamF2YTJ3c0dyb3VwKTsKLSAgICAgICAgQ29tYm8gZGF0YWJpbmRpbmdDb21ibyA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZURhdGFiaW5kaW5nQ29tYm8oamF2YTJ3c0dyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgZGF0YWJpbmRpbmdDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBHZW4gQ2xpZW50Ci0gICAgICAgIGdlbmVyYXRlQ2xpZW50QnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVDbGllbnRCdXR0b24oamF2YTJ3c0dyb3VwLCBjb250ZXh0KTsKLQotICAgICAgICAvLyBHZW4gU2VydmVyCi0gICAgICAgIGdlbmVyYXRlU2VydmVyQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVTZXJ2ZXJCdXR0b24oamF2YTJ3c0dyb3VwLCBjb250ZXh0KTsKLQotICAgICAgICAvLyBHZW4gV3JhcHBlciBhbmQgRmF1bHQgQmVhbgotICAgICAgICBnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5CdXR0b24gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5CdXR0b24oCi0gICAgICAgICAgICAgICAgamF2YTJ3c0dyb3VwLCBjb250ZXh0KTsKLQotICAgICAgICAvLyBHZW4gV1NETAotICAgICAgICBnZW5lcmF0ZVdTRExCdXR0b24gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVHZW5lcmF0ZVdTRExCdXR0b24oamF2YTJ3c0dyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ2VuZXJhdGVXU0RMQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGVuYWJsZVdTRExHcm91cChnZW5lcmF0ZVdTRExCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIGdlbmVyYXRlV1NETEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBHcm91cCB3c2RsR3JvdXAgPSBuZXcgR3JvdXAoamF2YTJ3c0dyb3VwLCBTV1QuU0hBRE9XX0VUQ0hFRF9JTik7Ci0gICAgICAgIEdyaWRMYXlvdXQgd3NkbEdyb3VwTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgICAgICB3c2RsR3JvdXAuc2V0TGF5b3V0KHdzZGxHcm91cExheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgd3NkbEdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVNPQVBCaW5kaW5nTGFiZWwod3NkbEdyb3VwKTsKLQotICAgICAgICBzb2FwQmluZGluZ0NvbWJvID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlU09BUEJpbmdDb21ibyh3c2RsR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGNyZWF0ZVhTREltcG9ydHNCdXR0b24gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVYU0RJbXBvcnRzQnV0dG9uKHdzZGxHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgY3JlYXRlWFNESW1wb3J0c0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgCi0gICAgICAgIExpbmsgbGluayA9IG5ldyBMaW5rKHRoaXMsIFNXVC5OT05FKTsKLSAgICAgICAgbGluay5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQU5OT1RBVElPTlNfUFJFRkVSRU5DRVNfTElOSyk7Ci0gICAgICAgIGxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdGFiRm9sZGVyLnNldFNlbGVjdGlvbigzKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBlbmFibGVXU0RMR3JvdXAoY29udGV4dC5pc0dlbmVyYXRlV1NETCgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBlbmFibGVXU0RMR3JvdXAoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgICAgIGNyZWF0ZVhTREltcG9ydHNCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0cygpIHsKLSAgICAgICAgaWYgKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19TT0FQMTJfQklORElORykpIHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VGV4dCgiU09BUCAxLjIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUZXh0KCJTT0FQIDEuMSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGNyZWF0ZVhTREltcG9ydHNCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9YU0RfSU1QT1JUUykpOwotCi0gICAgICAgIGdlbmVyYXRlQ2xpZW50QnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19HRU5FUkFURV9DTElFTlQpKTsKLSAgICAgICAgCi0gICAgICAgIGdlbmVyYXRlU2VydmVyQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19HRU5FUkFURV9TRVJWRVIpKTsKLSAgICAgICAgCi0gICAgICAgIGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbkJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TKSk7Ci0gICAgICAgIAotICAgICAgICBnZW5lcmF0ZVdTRExCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XU0RMKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0gICAgICAgIGlmIChjb250ZXh0LmlzU29hcDEyQmluZGluZygpKSB7Ci0gICAgICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldFRleHQoIlNPQVAgMS4yIik7IC8vJE5PTi1OTFMtMSQgICAgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldFRleHQoIlNPQVAgMS4xIik7IC8vJE5PTi1OTFMtMSQgICAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIGNyZWF0ZVhTREltcG9ydHNCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVhTREltcG9ydHMoKSk7Ci0gICAgICAgIGdlbmVyYXRlQ2xpZW50QnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVDbGllbnQoKSk7Ci0gICAgICAgIGdlbmVyYXRlU2VydmVyQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVTZXJ2ZXIoKSk7Ci0gICAgICAgIGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbkJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKSk7Ci0gICAgICAgIGdlbmVyYXRlV1NETEJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlV1NETCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0gICAgICAgIGlmIChzb2FwQmluZGluZ0NvbWJvLmdldFRleHQoKS5lcXVhbHMoIlNPQVAgMS4yIikpIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0U29hcDEyQmluZGluZyh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0U29hcDEyQmluZGluZyhmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlWFNESW1wb3J0cyhjcmVhdGVYU0RJbXBvcnRzQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZUNsaWVudChnZW5lcmF0ZUNsaWVudEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVTZXJ2ZXIoZ2VuZXJhdGVTZXJ2ZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFuQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVdTREwoZ2VuZXJhdGVXU0RMQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9KYXZhMldTV2lkZ2V0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvSmF2YTJXU1dpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI4NTI0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9KYXZhMldTV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5TdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5EYXRhQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRnJvbnRlbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkudmlld2Vycy5KYXZhVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLQotLyoqCi0gKiBQcm92aWRlcyB3aWRnZXRzIGZvciBKYXZhMldTIHByZWZlcmVuY2VzLCB3aXphcmRzLCBkaWFsb2dzLiBFbmFibGVzIHRoZSByZXVzZQotICogb2Ygd2lkZ2V0cyBpbiBtdWx0aXBsZSBsb2NhdGlvbnMuIFdpZGdldHMgaGF2ZSB0aGVyZSBsYWJlbGluZyBhbmQgdG9vbHRpcHMKLSAqIHNldCBoZXJlIGFuZCB3aGVyZSBwb3NzaWJsZSBsaXN0ZW5lcnMgYXJlIHNldCB3aGljaCB1cGRhdGUgaW5zdGFuY2VzIG9mCi0gKiA8Y29kZT5KYXZhMldTQ29udGV4dDwvY29kZT4gYW5kIDxjb2RlPkphdmEyV1NEYXRhTW9kZWw8L2NvZGU+LgotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXZhMldTV2lkZ2V0RmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIEphdmEyV1NXaWRnZXRGYWN0b3J5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlU09BUEJpbmRpbmdMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIGRlZmF1bHRTb2FwQmluZGluZyA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgZGVmYXVsdFNvYXBCaW5kaW5nLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0RFRkFVTFRfU09BUEJJTkRJTkdfTEFCRUwpOwotICAgICAgICByZXR1cm4gZGVmYXVsdFNvYXBCaW5kaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlU09BUEJpbmdDb21ibyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBKYXZhMldTQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIENvbWJvIHNvYXBCaW5kaW5nQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfU09BUDEyX0JJTkRJTkdfVE9PTFRJUCk7Ci0gICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uYWRkKCJTT0FQIDEuMSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uYWRkKCJTT0FQIDEuMiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNvYXBCaW5kaW5nID0gKChDb21ibykgZS53aWRnZXQpLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcEJpbmRpbmcuZXF1YWxzKCJTT0FQIDEuMiIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRTb2FwMTJCaW5kaW5nKHRydWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0U29hcDEyQmluZGluZyhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgaWYgKGNvbnRleHQuaXNTb2FwMTJCaW5kaW5nKCkpIHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VGV4dCgiU09BUCAxLjIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUZXh0KCJTT0FQIDEuMSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc29hcEJpbmRpbmdDb21ibzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVYU0RJbXBvcnRzQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIEphdmEyV1NDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgQnV0dG9uIGNyZWF0ZVhTREltcG9ydHMgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgY3JlYXRlWFNESW1wb3J0cy5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5fWFNEX0lNUE9SVFMpOwotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19DUkVBVEVfWFNEX0lNUE9SVFNfVE9PTFRJUCk7Ci0gICAgICAgIGNyZWF0ZVhTREltcG9ydHMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVhTREltcG9ydHMoKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVYU0RJbXBvcnRzKCkpOwotICAgICAgICByZXR1cm4gY3JlYXRlWFNESW1wb3J0czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUZyb250ZW5kTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBmcm9udGVuZExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBmcm9udGVuZExhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfREVGQVVMVF9GUk9OVEVORF9MQUJFTCk7Ci0gICAgICAgIHJldHVybiBmcm9udGVuZExhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlRnJvbnRlbmRDb21ibyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBKYXZhMldTQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGZpbmFsIENvbWJvIGZyb250ZW5kQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgZnJvbnRlbmRDb21iby5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfRlJPTlRFTkRfVE9PTFRJUCk7Ci0gICAgICAgIGZyb250ZW5kQ29tYm8uYWRkKEZyb250ZW5kLkpBWFdTLmdldExpdGVyYWwoKSk7Ci0gICAgICAgIGZyb250ZW5kQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZyb250ZW5kID0gZnJvbnRlbmRDb21iby5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRGcm9udGVuZChGcm9udGVuZC5nZXQoZnJvbnRlbmQpKTsKLSAgICAgICAgICAgICAgICBpZiAoZnJvbnRlbmQuZXF1YWxzKEZyb250ZW5kLkpBWFdTLmdldExpdGVyYWwoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXREYXRhYmluZGluZyhEYXRhQmluZGluZy5nZXQoRGF0YUJpbmRpbmcuSkFYQi5nZXRMaXRlcmFsKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICBpZiAoZnJvbnRlbmQuZXF1YWxzKCJzaW1wbGUiKSkgewotLy8gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RGF0YWJpbmRpbmcoImFlZ2lzIik7Ci0vLyAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBmcm9udGVuZENvbWJvLnNldFRleHQoY29udGV4dC5nZXRGcm9udGVuZCgpLmdldExpdGVyYWwoKSk7Ci0KLSAgICAgICAgcmV0dXJuIGZyb250ZW5kQ29tYm87Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVEYXRhYmluZGluZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgZGF0YWJpbmRpbmdMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgZGF0YWJpbmRpbmdMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX0RFRkFVTFRfREFUQUJJTkRJTkdfTEFCRUwpOwotICAgICAgICByZXR1cm4gZGF0YWJpbmRpbmdMYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZURhdGFiaW5kaW5nQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgSmF2YTJXU0NvbnRleHQgY29udGV4dCkgewotICAgICAgICBmaW5hbCBDb21ibyBkYXRhYmluZGluZ0NvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIGRhdGFiaW5kaW5nQ29tYm8uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0RBVEFCSU5ESU5HX1RPT0xUSVApOwotICAgICAgICBkYXRhYmluZGluZ0NvbWJvLmFkZChEYXRhQmluZGluZy5KQVhCLmdldExpdGVyYWwoKSk7Ci0gICAgICAgIGRhdGFiaW5kaW5nQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXREYXRhYmluZGluZyhEYXRhQmluZGluZy5nZXQoZGF0YWJpbmRpbmdDb21iby5nZXRUZXh0KCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGRhdGFiaW5kaW5nQ29tYm8uc2V0VGV4dChjb250ZXh0LmdldERhdGFiaW5kaW5nKCkuZ2V0TGl0ZXJhbCgpKTsKLSAgICAgICAgcmV0dXJuIGRhdGFiaW5kaW5nQ29tYm87Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlR2VuZXJhdGVDbGllbnRCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgSmF2YTJXU0NvbnRleHQgY29udGV4dCkgewotICAgICAgICBmaW5hbCBCdXR0b24gZ2VuQ2xpZW50QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGdlbkNsaWVudEJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5fQ0xJRU5UX0xBQkVMKTsKLSAgICAgICAgZ2VuQ2xpZW50QnV0dG9uLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5FUkFURV9DTElFTlRfVE9PTFRJUCk7Ci0gICAgICAgIGdlbkNsaWVudEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlQ2xpZW50KGdlbkNsaWVudEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBnZW5DbGllbnRCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZUNsaWVudCgpKTsKLSAgICAgICAgcmV0dXJuIGdlbkNsaWVudEJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVHZW5lcmF0ZVNlcnZlckJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBKYXZhMldTQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBnZW5TZXJ2ZXJCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ2VuU2VydmVyQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0dFTl9TRVJWRVJfTEFCRUwpOwotICAgICAgICBnZW5TZXJ2ZXJCdXR0b24uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0dFTkVSQVRFX1NFUlZFUl9UT09MVElQKTsKLSAgICAgICAgZ2VuU2VydmVyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVTZXJ2ZXIoZ2VuU2VydmVyQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlblNlcnZlckJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlU2VydmVyKCkpOwotICAgICAgICByZXR1cm4gZ2VuU2VydmVyQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbkJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBKYXZhMldTQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBnZW5XcmFwcGVyRmF1bHRCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ2VuV3JhcHBlckZhdWx0QnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0dFTl9XUkFQUEVSX0ZBVUxUX0xBQkVMKTsKLSAgICAgICAgZ2VuV3JhcHBlckZhdWx0QnV0dG9uLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5FUkFURV9XUkFQUEVSQkVBTl9UT09MVElQKTsKLSAgICAgICAgZ2VuV3JhcHBlckZhdWx0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyhnZW5XcmFwcGVyRmF1bHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2VuV3JhcHBlckZhdWx0QnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpKTsKLSAgICAgICAgcmV0dXJuIGdlbldyYXBwZXJGYXVsdEJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVHZW5lcmF0ZVdTRExCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgSmF2YTJXU0NvbnRleHQgY29udGV4dCkgewotICAgICAgICBmaW5hbCBCdXR0b24gZ2VuV1NETEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBnZW5XU0RMQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0dFTl9XU0RMX0xBQkVMKTsKLSAgICAgICAgZ2VuV1NETEJ1dHRvbi5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfR0VORVJBVEVfV1NETF9UT09MVElQKTsKLSAgICAgICAgZ2VuV1NETEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlV1NETChnZW5XU0RMQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlbldTRExCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVdTREwoKSk7Ci0gICAgICAgIHJldHVybiBnZW5XU0RMQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlV1NETEZpbGVOYW1lTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCB3c2RsRmlsZU5hbWVMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgd3NkbEZpbGVOYW1lTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfV1NETF9GSUxFX05BTUUpOwotICAgICAgICByZXR1cm4gd3NkbEZpbGVOYW1lTGFiZWw7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlV1NETEZpbGVOYW1lVGV4dChDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIFRleHQgd3NkbEZpbGVUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLSAgICAgICAgd3NkbEZpbGVUZXh0LnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19PVVRQVVRfRklMRV9UT09MVElQKTsKLSAgICAgICAgd3NkbEZpbGVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldFdzZGxGaWxlTmFtZSh3c2RsRmlsZVRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHdzZGxGaWxlVGV4dC5zZXRUZXh0KG1vZGVsLmdldFdzZGxGaWxlTmFtZSgpKTsKLSAgICAgICAgcmV0dXJuIHdzZGxGaWxlVGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVVc2VTRUlCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBCdXR0b24gdXNlU0VJQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIHVzZVNFSUJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19VU0VfU0VJX0JVVFRPTik7Ci0gICAgICAgIHJldHVybiB1c2VTRUlCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVJbmZvcm1hdGlvbkxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIElUeXBlIHN0YXJ0aW5nUG9pbnRUeXBlKSB7Ci0gICAgICAgIExhYmVsIGluZm9MYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5XUkFQKTsKLSAgICAgICAgaW5mb0xhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5iaW5kKENYRlVJTWVzc2FnZXMuSkFWQTJXU19VU0VfU0VJX0lORk9fTEFCRUwsIHN0YXJ0aW5nUG9pbnRUeXBlCi0gICAgICAgICAgICAgICAgLmdldEVsZW1lbnROYW1lKCkpKTsKLSAgICAgICAgcmV0dXJuIGluZm9MYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVBhZGRpbmdMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHJldHVybiBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlU2VsZWN0U0VJQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQnV0dG9uIHNlbGVjdFNFSUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotICAgICAgICBzZWxlY3RTRUlCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX1NFSV9MQUJFTCk7Ci0gICAgICAgIHJldHVybiBzZWxlY3RTRUlCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVTZWxlY3RTRUlMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIHNlbGVjdFNFSUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBzZWxlY3RTRUlMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfU0VJX0xBQkVMKTsKLSAgICAgICAgcmV0dXJuIHNlbGVjdFNFSUxhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlU2VsZWN0U0VJQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCwKLSAgICAgICAgICAgIElUeXBlIGphdmFTdGFydGluZ1BvaW50VHlwZSkgewotICAgICAgICBmaW5hbCBDb21ibyBzZWlDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIpOwotICAgICAgICBzZWlDb21iby5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX1NFSV9UT09MVElQKTsKLQotICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKRFRVdGlscy5nZXRKYXZhUHJvamVjdChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHkgPSBqYXZhU3RhcnRpbmdQb2ludFR5cGUubmV3VHlwZUhpZXJhcmNoeShqYXZhUHJvamVjdCwgbnVsbCk7Ci0gICAgICAgICAgICBJVHlwZVtdIGFsbEludGVyZmFjZXMgPSB0eXBlSGllcmFyY2h5LmdldEFsbEludGVyZmFjZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsSW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElUeXBlIGl0eXBlID0gYWxsSW50ZXJmYWNlc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoIWl0eXBlLmlzQmluYXJ5KCkgJiYgaXR5cGUuZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCkuZXF1YWxzKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VpQ29tYm8uYWRkKGl0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIENYRlVJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2VpQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNlaUludGVyZmFjZU5hbWUgPSBzZWlDb21iby5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZShzZWlJbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgc2VpQ29tYm8uZGVzZWxlY3RBbGwoKTsKLSAgICAgICAgcmV0dXJuIHNlaUNvbWJvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUJyb3dzZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotICAgICAgICBicm93c2VCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfQlJPV1NFX0xBQkVMKTsKLSAgICAgICAgcmV0dXJuIGJyb3dzZUJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVFeHRyYWN0U0VJQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQnV0dG9uIGV4dHJhY3RTRUlCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLSAgICAgICAgZXh0cmFjdFNFSUJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19FWFRSQUNUX1NFSV9MQUJFTCk7Ci0gICAgICAgIHJldHVybiBleHRyYWN0U0VJQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlRXh0cmFjdFNFSUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgZXh0cmFjdFNFSUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBleHRyYWN0U0VJTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfRVhUUkFDVF9TRUlfTEFCRUwpOwotICAgICAgICByZXR1cm4gZXh0cmFjdFNFSUxhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVTRUlJbnRlcmZhY2VOYW1lVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIFRleHQgc2VpSW50ZXJmYWNlTmFtZVRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotICAgICAgICBzZWlJbnRlcmZhY2VOYW1lVGV4dC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfRVhUUkFDVF9TRUlfVE9PTFRJUCk7Ci0gICAgICAgIHJldHVybiBzZWlJbnRlcmZhY2VOYW1lVGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZU1lbWViZXJzVG9FeHRyYWN0TGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBzZWlNZW1iZXJzVG9FeHRyYWN0TGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19FWFRSQUNUX01FTUJFUlNfTEFCRUwpOwotICAgICAgICByZXR1cm4gc2VpTWVtYmVyc1RvRXh0cmFjdExhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ2hlY2tib3hUYWJsZVZpZXdlciBjcmVhdGVTRUlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDaGVja2JveFRhYmxlVmlld2VyIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlciA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KHBhcmVudCwKLSAgICAgICAgICAgICAgICBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLSAgICAgICAgc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpKTsKLSAgICAgICAgc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIHJldHVybiBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlU2VsZWN0QWxsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQnV0dG9uIHNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIHNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfQUxMX0JVVFRPTik7Ci0gICAgICAgIHJldHVybiBzZWxlY3RBbGxCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlRGVzZWxlY3RBbGxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotICAgICAgICBkZXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19ERVNFTEVDVF9BTExfQlVUVE9OKTsKLSAgICAgICAgcmV0dXJuIGRlc2VsZWN0QWxsQnV0dG9uOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVNlbGVjdEltcGxlbWVudGF0aW9uTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBzZWxlY3RJbXBsZW1lbnRhdGlvbkxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBzZWxlY3RJbXBsZW1lbnRhdGlvbkxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX1NFTEVDVF9JTVBMRU1FTlRBVElPTik7Ci0gICAgICAgIHJldHVybiBzZWxlY3RJbXBsZW1lbnRhdGlvbkxhYmVsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZVNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgCi0gICAgICAgICAgICBmaW5hbCBKYXZhMldTRGF0YU1vZGVsIG1vZGVsLCBJVHlwZSBqYXZhU3RhcnRpbmdQb2ludFR5cGUpIHsKLSAgICAgICAgZmluYWwgQ29tYm8gc2VsZWN0SW1wbGVtZW50YXRpb25Db21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIpOwotICAgICAgICBzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfSU1QTEVNRU5UQVRJT05fVE9PTFRJUCk7Ci0KLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5ID0gamF2YVN0YXJ0aW5nUG9pbnRUeXBlLm5ld1R5cGVIaWVyYXJjaHkoamF2YVByb2plY3QsIG51bGwpOwotICAgICAgICAgICAgSVR5cGVbXSBhbGxJbXBsZW1lbnRhdGlvbnMgPSB0eXBlSGllcmFyY2h5LmdldEFsbFN1YnR5cGVzKGphdmFTdGFydGluZ1BvaW50VHlwZSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbEltcGxlbWVudGF0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElUeXBlIGl0eXBlID0gYWxsSW1wbGVtZW50YXRpb25zW2ldOwotICAgICAgICAgICAgICAgIGlmICghaXR5cGUuaXNCaW5hcnkoKSAmJiBpdHlwZS5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKS5lcXVhbHMoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBpdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgKz0gIi4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHF1YWxpZmllZE5hbWUgPSBwYWNrYWdlTmFtZSArIGl0eXBlLmdldFByaW1hcnlFbGVtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5hZGQocXVhbGlmaWVkTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBDWEZVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGltcGxlbWVudGF0aW9uTmFtZSA9IHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIG1vZGVsLnNldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZShpbXBsZW1lbnRhdGlvbk5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvLmRlc2VsZWN0QWxsKCk7Ci0gICAgICAgIHJldHVybiBzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFtIDxjb2RlPkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nPC9jb2RlPiB0aGF0IGRpc3BsYXlzIGFsbCB0aGUgY2xhc3NlcyBvciBhbGwgdGhlIGludGVyZmFjZXMKLSAgICAgKiB3aXRoaW4gYSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+IGFsbG93aW5nIG9uZSBjbGFzcyBvciBpbnRlcmZhY2UgdG8gYmUgc2VsZWN0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IHNoZWxsCi0gICAgICogQHBhcmFtIHRpdGxlIHRoZSBkaWFsb2cgdGl0bGUKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZGlhbG9nIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gamF2YVByb2plY3QgdGhlIGphdmEgcHJvamVjdCB0aGF0IGlzIGZpbHRlcmVkCi0gICAgICogQHBhcmFtIGVsZW1lbnRLaW5kcyBhIGZsYWcgZGVmaW5pbmcgbmF0dXJlIG9mIHNlYXJjaGVkIGVsZW1lbnRzOyB0aGUgb25seSB2YWxpZCB2YWx1ZXMgYXJlOiAKLSAgICAgKiAgPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1M8L2NvZGU+Ci0gICAgICogIDxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLklOVEVSRkFDRTwvY29kZT4KLSAgICAgKiAgPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1NfQU5EX0lOVEVSRkFDRTwvY29kZT4KLSAgICAgKiAgCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudCB0cmVlIHNlbGVjdGlvbiBkaWFsb2cKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIGNyZWF0ZUVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCAKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGludCBlbGVtZW50S2luZHMpIHsKLSAgICAgICAgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgc2VsZWN0aW9uRGlhbG9nID0gbmV3IEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKHBhcmVudCwKLSAgICAgICAgICAgICAgICBuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCksIG5ldyBTdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICBzZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUodGl0bGUpOwotICAgICAgICBzZWxlY3Rpb25EaWFsb2cuc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgc2VsZWN0aW9uRGlhbG9nLnNldEFsbG93TXVsdGlwbGUoZmFsc2UpOwotICAgICAgICBzZWxlY3Rpb25EaWFsb2cuc2V0SW5wdXQoSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpKTsKLQotICAgICAgICBzZWxlY3Rpb25EaWFsb2cuYWRkRmlsdGVyKG5ldyBKYXZhVmlld2VyRmlsdGVyKGphdmFQcm9qZWN0LCBlbGVtZW50S2luZHMpKTsKLQotICAgICAgICBzZWxlY3Rpb25EaWFsb2cuc2V0VmFsaWRhdG9yKG5ldyBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShPYmplY3RbXSBzZWxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uWzBdIGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9KTsKLQotICAgICAgICByZXR1cm4gc2VsZWN0aW9uRGlhbG9nOwotCi0gICAgfQotIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvU3ByaW5nQ29uZmlnQ29tcG9zaXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9TcHJpbmdDb25maWdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0MzU4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9TcHJpbmdDb25maWdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci0KLXB1YmxpYyBjbGFzcyBTcHJpbmdDb25maWdDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotICAgIHByaXZhdGUgQ1hGQ29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLQotICAgIHByaXZhdGUgQnV0dG9uIHVzZUNYRlNlcnZsZXRCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gdXNlU3ByaW5nQXBwQ29udGV4dEJ1dHRvbjsKLSAgICAKLSAgICBwdWJsaWMgU3ByaW5nQ29uZmlnQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICAgICAgYWRkQ29udHJvbHMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQ29udHJvbHMoKSB7Ci0gICAgICAgIEdyaWRMYXlvdXQgcHJlZmxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICB0aGlzLnNldExheW91dChwcmVmbGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBHcm91cCBzcHJpbmdDb25maWdHcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgc3ByaW5nQ29uZmlnR3JvdXAuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLlNQUklOR19DT05GSUdfR1JPVVBfTEFCRUwpOwotICAgICAgICBHcmlkTGF5b3V0IHNwcmluZ0NvbmZpZ0xheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpOwotICAgICAgICBzcHJpbmdDb25maWdHcm91cC5zZXRMYXlvdXQoc3ByaW5nQ29uZmlnTGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgc3ByaW5nQ29uZmlnR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgdXNlQ1hGU2VydmxldEJ1dHRvbiA9IG5ldyBCdXR0b24oc3ByaW5nQ29uZmlnR3JvdXAsIFNXVC5SQURJTyk7Ci0gICAgICAgIHVzZUNYRlNlcnZsZXRCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLlNQUklOR19DT05GSUdfVVNFX0NYRl9TRVJWTEVUKTsKLSAgICAgICAgdXNlQ1hGU2VydmxldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldFVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCghc2VsZWN0ZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB1c2VTcHJpbmdBcHBDb250ZXh0QnV0dG9uID0gbmV3IEJ1dHRvbihzcHJpbmdDb25maWdHcm91cCwgU1dULlJBRElPKTsKLSAgICAgICAgdXNlU3ByaW5nQXBwQ29udGV4dEJ1dHRvbgotICAgICAgICAgICAgICAgIC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuU1BSSU5HX0NPTkZJR19VU0VfQ1hGX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUKTsKLSAgICAgICAgdXNlU3ByaW5nQXBwQ29udGV4dEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldFVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dChzZWxlY3RlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGlmIChjb250ZXh0LmlzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCkpIHsKLSAgICAgICAgICAgIHVzZVNwcmluZ0FwcENvbnRleHRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdXNlQ1hGU2VydmxldEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0gICAgICAgIGJvb2xlYW4gdXNlU3ByaW5nQXBwY29udGV4dCA9IENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkNYRl9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVCk7Ci0gICAgICAgIHVzZVNwcmluZ0FwcENvbnRleHRCdXR0b24uc2V0U2VsZWN0aW9uKHVzZVNwcmluZ0FwcGNvbnRleHQpOwotICAgICAgICB1c2VDWEZTZXJ2bGV0QnV0dG9uLnNldFNlbGVjdGlvbighdXNlU3ByaW5nQXBwY29udGV4dCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0b3JlVmFsdWVzKCkgewotICAgICAgICBjb250ZXh0LnNldFVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCh1c2VTcHJpbmdBcHBDb250ZXh0QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9XU0RMMkphdmFXaWRnZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9XU0RMMkphdmFXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYjE4MDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuZGlhbG9ncy5SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnZpZXdlcnMuUGFja2FnZU5hbWVDb2x1bW5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotCi0vKioKLSAqIFByb3ZpZGVzIHdpZGdldHMgZm9yIFdTREwySmF2YSBwcmVmZXJlbmNlcywgd2l6YXJkcywgZGlhbG9ncy4gRW5hYmxlcyB0aGUKLSAqIHJldXNlIG9mIHdpZGdldHMgaW4gbXVsdGlwbGUgbG9jYXRpb25zLiBXaWRnZXRzIGhhdmUgdGhlcmUgbGFiZWxpbmcgYW5kCi0gKiB0b29sdGlwcyBzZXQgaGVyZSBhbmQgd2hlcmUgcG9zc2libGUgbGlzdGVuZXJzIGFyZSBzZXQgd2hpY2ggdXBkYXRlIGluc3RhbmNlcwotICogb2YgPGNvZGU+V1NETDJKYXZhQ29udGV4dDwvY29kZT4gYW5kIDxjb2RlPldTREwySmF2YURhdGFNb2RlbDwvY29kZT4uCi0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFdTREwySmF2YVdpZGdldEZhY3RvcnkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfRFZfQVJHID0gIi1YZHYiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19UU19BUkcgPSAiLVh0cyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX1RTX01VTFRJX0FSRyA9ICItWHRzOnN0eWxlOm11bHRpbGluZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX1RTX1NJTVBMRSA9ICItWHRzOnN0eWxlOnNpbXBsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX0xPQ0FUT1JfQVJHID0gIi1YbG9jYXRvciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX1NZTkNfTUVUSE9EU19BUkcgPSAiLVhzeW5jLW1ldGhvZHMiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19NQVJLX0dFTkVSQVRFRF9BUkcgPSAiLW1hcmstZ2VuZXJhdGVkIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfRVBJU09ERV9GSUxFX0FSRyA9ICItZXBpc29kZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVHZW5lcmF0ZUNsaWVudEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBnZW5DbGllbnRCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ2VuQ2xpZW50QnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0dFTl9DTElFTlRfTEFCRUwpOwotICAgICAgICBnZW5DbGllbnRCdXR0b24uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfR0VORVJBVEVfQ0xJRU5UX1RPT0xUSVApOwotICAgICAgICBnZW5DbGllbnRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVDbGllbnQoZ2VuQ2xpZW50QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlbkNsaWVudEJ1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNHZW5lcmF0ZUNsaWVudCgpKTsKLSAgICAgICAgcmV0dXJuIGdlbkNsaWVudEJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVHZW5lcmF0ZVNlcnZlckJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBnZW5TZXJ2ZXJCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ2VuU2VydmVyQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0dFTl9TRVJWRVJfTEFCRUwpOwotICAgICAgICBnZW5TZXJ2ZXJCdXR0b24uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfR0VORVJBVEVfU0VSVkVSX1RPT0xUSVApOwotICAgICAgICBnZW5TZXJ2ZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVTZXJ2ZXIoZ2VuU2VydmVyQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlblNlcnZlckJ1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNHZW5lcmF0ZVNlcnZlcigpKTsKLSAgICAgICAgcmV0dXJuIGdlblNlcnZlckJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVHZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIGdlbkltcGxlbWVudGF0aW5CdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ2VuSW1wbGVtZW50YXRpbkJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5fSU1QTEVNRU5UQVRJT05fTEFCRUwpOwotICAgICAgICBnZW5JbXBsZW1lbnRhdGluQnV0dG9uLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OX1RPT0xUSVApOwotICAgICAgICBnZW5JbXBsZW1lbnRhdGluQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlSW1wbGVtZW50YXRpb24oZ2VuSW1wbGVtZW50YXRpbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBnZW5JbXBsZW1lbnRhdGluQnV0dG9uLnNldFNlbGVjdGlvbihtb2RlbC5pc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKSk7Ci0gICAgICAgIHJldHVybiBnZW5JbXBsZW1lbnRhdGluQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZVByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfUFJPQ0VTU19TT0FQX0hFQURFUlMpOwotICAgICAgICBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfUFJPQ0VTU19TT0FQX0hFQURFUlNfVE9PTFRJUCk7Ci0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRQcm9jZXNzU09BUEhlYWRlcnMocHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNQcm9jZXNzU09BUEhlYWRlcnMoKSk7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlTmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBmaW5hbCBCdXR0b24gbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24KLSAgICAgICAgICAgICAgICAuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTUFQUElORyk7Ci0gICAgICAgIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uCi0gICAgICAgICAgICAgICAgLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0RFRkFVTFRfTkFNRVNQQUNFX0xPQURJTkdfVE9PTFRJUCk7Ci0gICAgICAgIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldExvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uLnNldFNlbGVjdGlvbihtb2RlbC5pc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkpOwotICAgICAgICByZXR1cm4gbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlRXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24KLSAgICAgICAgICAgICAgICAuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9VU0VfREVGQVVMVF9FWENMVURFU19OQU1FU1BBQ0VfTUFQUElORyk7Ci0gICAgICAgIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbgotICAgICAgICAgICAgICAgIC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9FWENMVURFX05BTUVTUEFDRV9MT0FESU5HX1RPT0xUSVApOwotICAgICAgICBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpKTsKLSAgICAgICAgcmV0dXJuIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlTm9BZGRyZXNzQmluZGluZ0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBub0FkZHJlc3NCaW5kaW5nQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIG5vQWRkcmVzc0JpbmRpbmdCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLmJpbmQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfTk9fQUREUkVTU19CSU5ESU5HLAotICAgICAgICAgICAgICAgIG1vZGVsLmdldEN4ZlJ1bnRpbWVFZGl0aW9uKCkpKTsKLSAgICAgICAgbm9BZGRyZXNzQmluZGluZ0J1dHRvbi5zZXRUb29sVGlwVGV4dCgKLSAgICAgICAgICAgICAgICBDWEZVSU1lc3NhZ2VzLmJpbmQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfTk9fQUREUkVTU19CSU5ESU5HX1RPT0xUSVAsIAotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZ2V0Q3hmUnVudGltZUVkaXRpb24oKSkpOwotICAgICAgICBub0FkZHJlc3NCaW5kaW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldE5vQWRkcmVzc0JpbmRpbmcobm9BZGRyZXNzQmluZGluZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBub0FkZHJlc3NCaW5kaW5nQnV0dG9uLnNldFNlbGVjdGlvbihtb2RlbC5pc05vQWRkcmVzc0JpbmRpbmcoKSk7Ci0gICAgICAgIHJldHVybiBub0FkZHJlc3NCaW5kaW5nQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfQVVUT19OQU1FX1JFU09MVVRJT04pOwotICAgICAgICBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfQVVUT19OQU1FX1JFU09MVVRJT05fVE9PTFRJUCk7Ci0gICAgICAgIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRBdXRvTmFtZVJlc29sdXRpb24oYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNBdXRvTmFtZVJlc29sdXRpb24oKSk7Ci0gICAgICAgIHJldHVybiBhdXRvTmFtZVJlc29sdXRpb25CdXR0b247Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGFibGVJdGVtIGNyZWF0ZVhKQ0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0oVGFibGUgeGpjQXJnc1RhYmxlLCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIFRhYmxlSXRlbSB4amNEZWZhdWx0VmFsdWVzSXRlbSA9IG5ldyBUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHhqY0RlZmF1bHRWYWx1ZXNJdGVtLnNldFRleHQoMCwgWEpDX0RWX0FSRyk7Ci0gICAgICAgIHhqY0RlZmF1bHRWYWx1ZXNJdGVtLnNldFRleHQoMSwgQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX0RFRkFVTFRfVkFMVUVTKTsKLSAgICAgICAgeGpjRGVmYXVsdFZhbHVlc0l0ZW0uc2V0Q2hlY2tlZChtb2RlbC5pc1hqY1VzZURlZmF1bHRWYWx1ZXMoKSk7Ci0gICAgICAgIHJldHVybiB4amNEZWZhdWx0VmFsdWVzSXRlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlSXRlbSBjcmVhdGVYSkNUb1N0cmluZ1RhYmxlSXRlbShUYWJsZSB4amNBcmdzVGFibGUsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgVGFibGVJdGVtIHhqY1RvU3RyaW5nSXRlbSA9IG5ldyBUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nSXRlbS5zZXRUZXh0KDAsIFhKQ19UU19BUkcpOwotICAgICAgICB4amNUb1N0cmluZ0l0ZW0uc2V0VGV4dCgxLCBDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfVE9TVFJJTkcpOwotICAgICAgICB4amNUb1N0cmluZ0l0ZW0uc2V0Q2hlY2tlZChtb2RlbC5pc1hqY1RvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4geGpjVG9TdHJpbmdJdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGFibGVJdGVtIGNyZWF0ZVhKQ1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtKFRhYmxlIHhqY0FyZ3NUYWJsZSwKLSAgICAgICAgICAgIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgVGFibGVJdGVtIHhqY1RvU3RyaW5nTXVsdGlMaW5lSXRlbSA9IG5ldyBUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nTXVsdGlMaW5lSXRlbS5zZXRUZXh0KDAsIFhKQ19UU19NVUxUSV9BUkcpOwotICAgICAgICB4amNUb1N0cmluZ011bHRpTGluZUl0ZW0uc2V0VGV4dCgxLCBDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfVE9TVFJJTkdfTVVMVElMSU5FKTsKLSAgICAgICAgeGpjVG9TdHJpbmdNdWx0aUxpbmVJdGVtLnNldENoZWNrZWQobW9kZWwuaXNYamNUb1N0cmluZ011bHRpTGluZSgpKTsKLSAgICAgICAgcmV0dXJuIHhqY1RvU3RyaW5nTXVsdGlMaW5lSXRlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlSXRlbSBjcmVhdGVYSkNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbShUYWJsZSB4amNBcmdzVGFibGUsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgVGFibGVJdGVtIHhqY1RvU3RyaW5nU2ltcGxlSXRlbSA9IG5ldyBUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nU2ltcGxlSXRlbS5zZXRUZXh0KDAsIFhKQ19UU19TSU1QTEUpOwotICAgICAgICB4amNUb1N0cmluZ1NpbXBsZUl0ZW0uc2V0VGV4dCgxLCBDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfVE9TVFJJTkdfU0lNUExFKTsKLSAgICAgICAgeGpjVG9TdHJpbmdTaW1wbGVJdGVtLnNldENoZWNrZWQobW9kZWwuaXNYamNUb1N0cmluZ1NpbXBsZSgpKTsKLSAgICAgICAgcmV0dXJuIHhqY1RvU3RyaW5nU2ltcGxlSXRlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlSXRlbSBjcmVhdGVYSkNMb2NhdG9yVGFibGVJdGVtKFRhYmxlIHhqY0FyZ3NUYWJsZSwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBUYWJsZUl0ZW0geGpjTG9jYXRvckl0ZW0gPSBuZXcgVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgU1dULk5PTkUpOwotICAgICAgICB4amNMb2NhdG9ySXRlbS5zZXRUZXh0KDAsIFhKQ19MT0NBVE9SX0FSRyk7Ci0gICAgICAgIHhqY0xvY2F0b3JJdGVtLnNldFRleHQoMSwgQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX0xPQ0FUT1IpOwotICAgICAgICB4amNMb2NhdG9ySXRlbS5zZXRDaGVja2VkKG1vZGVsLmlzWGpjTG9jYXRvcigpKTsKLSAgICAgICAgcmV0dXJuIHhqY0xvY2F0b3JJdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGFibGVJdGVtIGNyZWF0ZVhKQ1N5bmNNZXRob2RzVGFibGVJdGVtKFRhYmxlIHhqY0FyZ3NUYWJsZSwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBUYWJsZUl0ZW0geGpjU3luY01ldGhvZHNJdGVtID0gbmV3IFRhYmxlSXRlbSh4amNBcmdzVGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgeGpjU3luY01ldGhvZHNJdGVtLnNldFRleHQoMCwgWEpDX1NZTkNfTUVUSE9EU19BUkcpOwotICAgICAgICB4amNTeW5jTWV0aG9kc0l0ZW0uc2V0VGV4dCgxLCBDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfU1lOQ19NRVRIT0RTKTsKLSAgICAgICAgeGpjU3luY01ldGhvZHNJdGVtLnNldENoZWNrZWQobW9kZWwuaXNYamNTeW5jTWV0aG9kcygpKTsKLSAgICAgICAgcmV0dXJuIHhqY1N5bmNNZXRob2RzSXRlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlSXRlbSBjcmVhdGVYSkNNYXJrR2VuZXJhdGVkVGFibGVJdGVtKFRhYmxlIHhqY0FyZ3NUYWJsZSwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBUYWJsZUl0ZW0geGpjTWFya0dlbmVyYXRlZEl0ZW0gPSBuZXcgVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgU1dULk5PTkUpOwotICAgICAgICB4amNNYXJrR2VuZXJhdGVkSXRlbS5zZXRUZXh0KDAsIFhKQ19NQVJLX0dFTkVSQVRFRF9BUkcpOwotICAgICAgICB4amNNYXJrR2VuZXJhdGVkSXRlbS5zZXRUZXh0KDEsIENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19NQVJLX0dFTkVSQVRFRCk7Ci0gICAgICAgIHhqY01hcmtHZW5lcmF0ZWRJdGVtLnNldENoZWNrZWQobW9kZWwuaXNYamNNYXJrR2VuZXJhdGVkKCkpOwotICAgICAgICByZXR1cm4geGpjTWFya0dlbmVyYXRlZEl0ZW07Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUYWJsZUl0ZW0gY3JlYXRlWEpDRXBpc29kZUZpbGVUYWJsZUl0ZW0oVGFibGUgeGpjQXJnc1RhYmxlLCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIFRhYmxlSXRlbSB4amNFcGlzb2RlRmlsZUl0ZW0gPSBuZXcgVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgU1dULk5PTkUpOwotICAgICAgICB4amNFcGlzb2RlRmlsZUl0ZW0uc2V0VGV4dCgwLCBYSkNfRVBJU09ERV9GSUxFX0FSRyk7Ci0gICAgICAgIHhqY0VwaXNvZGVGaWxlSXRlbS5zZXRUZXh0KDEsIENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19FUElTT0RFX0ZJTEUpOwotICAgICAgICByZXR1cm4geGpjRXBpc29kZUZpbGVJdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGFibGUgY3JlYXRlWEpDQXJnVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBUYWJsZSB4amNBcmdzVGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuQ0hFQ0sgfCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLSAgICAgICAgeGpjQXJnc1RhYmxlLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19BUkdTX1RPT0xUSVApOwotICAgICAgICB4amNBcmdzVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotICAgICAgICB4amNBcmdzVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQotICAgICAgICBUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgICAgICB4amNBcmdzVGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotICAgICAgICBUYWJsZUNvbHVtbiB4amNBcmdDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oeGpjQXJnc1RhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHhqY0FyZ0NvbHVtbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19BUkdfQ09MVU1OX05BTUUpOwotCi0gICAgICAgIENvbHVtbldlaWdodERhdGEgY29sdW1uV2VpZ2h0RGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCwgMTAwLCB0cnVlKTsKLSAgICAgICAgdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2x1bW5XZWlnaHREYXRhKTsKLQotICAgICAgICBUYWJsZUNvbHVtbiBkZXNjcmlwdGlvbkNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih4amNBcmdzVGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgZGVzY3JpcHRpb25Db2x1bW4uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfREVTQ1JJUFRJT05fQ09MVU1OX05BTUUpOwotICAgICAgICBjb2x1bW5XZWlnaHREYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoMjAwLCAyMDAsIHRydWUpOwotICAgICAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbldlaWdodERhdGEpOwotCi0gICAgICAgIHhqY0FyZ3NUYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChldmVudC5kZXRhaWwgPT0gU1dULkNIRUNLKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSAoVGFibGVJdGVtKSBldmVudC5pdGVtOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgeGpjQXJnID0gdGFibGVJdGVtLmdldFRleHQoMCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY2hlY2tlZCA9IHRhYmxlSXRlbS5nZXRDaGVja2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4amNBcmcuZXF1YWxzKFhKQ19EVl9BUkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRYamNVc2VEZWZhdWx0VmFsdWVzKGNoZWNrZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHhqY0FyZy5lcXVhbHMoWEpDX1RTX0FSRykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nKGNoZWNrZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHhqY0FyZy5lcXVhbHMoWEpDX1RTX01VTFRJX0FSRykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKGNoZWNrZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHhqY0FyZy5lcXVhbHMoWEpDX1RTX1NJTVBMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nU2ltcGxlKGNoZWNrZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHhqY0FyZy5lcXVhbHMoWEpDX0xPQ0FUT1JfQVJHKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0WGpjTG9jYXRvcihjaGVja2VkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICh4amNBcmcuZXF1YWxzKFhKQ19TWU5DX01FVEhPRFNfQVJHKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0WGpjU3luY01ldGhvZHMoY2hlY2tlZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoeGpjQXJnLmVxdWFscyhYSkNfTUFSS19HRU5FUkFURURfQVJHKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0WGpjTWFya0dlbmVyYXRlZChjaGVja2VkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLQotICAgICAgICB4amNBcmdDb2x1bW4ucGFjaygpOwotICAgICAgICBkZXNjcmlwdGlvbkNvbHVtbi5wYWNrKCk7Ci0KLSAgICAgICAgcmV0dXJuIHhqY0FyZ3NUYWJsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUZyb250ZW5kTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBmcm9udGVuZExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBmcm9udGVuZExhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfREVGQVVMVF9GUk9OVEVORF9MQUJFTCk7Ci0gICAgICAgIHJldHVybiBmcm9udGVuZExhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlRnJvbnRlbmRDb21ibyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIENvbWJvIGZyb250ZW5kQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgZnJvbnRlbmRDb21iby5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9GUk9OVEVORF9UT09MVElQKTsKLSAgICAgICAgZnJvbnRlbmRDb21iby5hZGQobW9kZWwuZ2V0RnJvbnRlbmQoKS5nZXRMaXRlcmFsKCkpOwotICAgICAgICBmcm9udGVuZENvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBmcm9udGVuZENvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgcmV0dXJuIGZyb250ZW5kQ29tYm87Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVEYXRhYmluZGluZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgZGF0YWJpbmRpbmdMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgZGF0YWJpbmRpbmdMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX0RFRkFVTFRfREFUQUJJTkRJTkdfTEFCRUwpOwotICAgICAgICByZXR1cm4gZGF0YWJpbmRpbmdMYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZURhdGFiaW5kaW5nQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBmaW5hbCBDb21ibyBkYXRhYmluZGluZ0NvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIGRhdGFiaW5kaW5nQ29tYm8uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfREFUQUJJTkRJTkdfVE9PTFRJUCk7Ci0gICAgICAgIGRhdGFiaW5kaW5nQ29tYm8uYWRkKG1vZGVsLmdldERhdGFiaW5kaW5nKCkuZ2V0TGl0ZXJhbCgpKTsKLSAgICAgICAgZGF0YWJpbmRpbmdDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgZGF0YWJpbmRpbmdDb21iby5zZWxlY3QoMCk7Ci0gICAgICAgIHJldHVybiBkYXRhYmluZGluZ0NvbWJvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlV1NETFZlcnNpb25MYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIHdzZGxWZXJzaW9uTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHdzZGxWZXJzaW9uTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9XU0RMX1ZFUlNJT05fTEFCRUwpOwotICAgICAgICByZXR1cm4gd3NkbFZlcnNpb25MYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZVdTRExWZXJzaW9uQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBmaW5hbCBDb21ibyB3c2RsVmVyc2lvbkNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIHdzZGxWZXJzaW9uQ29tYm8uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfV1NETF9WRVJTSU9OX1RPT0xUSVApOwotICAgICAgICB3c2RsVmVyc2lvbkNvbWJvLmFkZChtb2RlbC5nZXRXc2RsVmVyc2lvbigpKTsKLSAgICAgICAgd3NkbFZlcnNpb25Db21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgd3NkbFZlcnNpb25Db21iby5zZWxlY3QoMCk7Ci0gICAgICAgIHJldHVybiB3c2RsVmVyc2lvbkNvbWJvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZURlZmF1bHRWYWx1ZXNCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBmaW5hbCBCdXR0b24gdXNlRGVmYXVsdFZhbHVlc0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfVVNFX0RFRkFVTFRfVkFMVUVTKTsKLSAgICAgICAgdXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9ERUZBVUxUX1ZBTFVFU19UT09MVElQKTsKLSAgICAgICAgdXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRVc2VEZWZhdWx0VmFsdWVzKHVzZURlZmF1bHRWYWx1ZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNVc2VEZWZhdWx0VmFsdWVzKCkpOwotICAgICAgICByZXR1cm4gdXNlRGVmYXVsdFZhbHVlc0J1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZU91dHB1dERpcmVjdG9yeUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgc3JjRGlyTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHNyY0RpckxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfT1VUUFVUX0RJUkVDVE9SWSk7Ci0gICAgICAgIHNyY0RpckxhYmVsLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX09VVFBVVF9ESVJFQ1RPUllfVE9PTFRJUCk7Ci0gICAgICAgIHJldHVybiBzcmNEaXJMYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZU91dHB1dERpcmVjdG9yeUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBmaW5hbCBDb21ibyBvdXRwdXREaXJDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotICAgICAgICBvdXRwdXREaXJDb21iby5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9PVVRQVVRfRElSRUNUT1JZX1RPT0xUSVApOwotICAgICAgICBvdXRwdXREaXJDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBqYXZhU291cmNlRm9sZGVyID0gb3V0cHV0RGlyQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIG1vZGVsLnNldEphdmFTb3VyY2VGb2xkZXIoamF2YVNvdXJjZUZvbGRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHBvcHVsYXRlT3V0cHV0RGlyZWN0b3J5Q29tYm8ob3V0cHV0RGlyQ29tYm8sIG1vZGVsLmdldFByb2plY3ROYW1lKCkpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG91dHB1dERpckNvbWJvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwb3B1bGF0ZU91dHB1dERpcmVjdG9yeUNvbWJvKENvbWJvIG91dHB1dERpckNvbWJvLCBTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgb3V0cHV0RGlyQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdFtdIHBhY2thZ2VGcmFnbWVudFJvb3RzID0gSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlRnJhZ21lbnRSb290cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgPSBwYWNrYWdlRnJhZ21lbnRSb290c1tpXTsKLSAgICAgICAgICAgICAgICBpZiAocGFja2FnZUZyYWdtZW50Um9vdC5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGlyQ29tYm8uYWRkKHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0cHV0RGlyQ29tYm8uc2VsZWN0KDApOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBDWEZVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVBhY2thZ2VOYW1lTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBwYWNrYWdlTmFtZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBwYWNrYWdlTmFtZUxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfUEFDS0FHRV9OQU1FKTsKLSAgICAgICAgcGFja2FnZU5hbWVMYWJlbC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9QQUNLQUdFX05BTUVfVE9PTFRJUCk7Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZUxhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVQYWNrYWdlTmFtZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIFRleHQgcGFja2FnZU5hbWVUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLSAgICAgICAgcGFja2FnZU5hbWVUZXh0LnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9UT09MVElQKTsKLQotICAgICAgICBwYWNrYWdlTmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWVUZXh0LmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5nZXRJbmNsdWRlZE5hbWVzcGFjZXMoKS5wdXQobW9kZWwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcGFja2FnZU5hbWVUZXh0LnNldFRleHQobW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkuZ2V0KG1vZGVsLmdldFRhcmdldE5hbWVzcGFjZSgpKSk7Ci0KLSAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lVGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVOYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIG5hbWVzcGFjZU1hcHBpbmdCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9QQUNLQUdFX05BTUVfT1BUSU9OQUwpOwotICAgICAgICBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9PUFRJT05BTF9UT09MVElQKTsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZU1hcHBpbmdCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUYWJsZVZpZXdlckNvbHVtbiBjcmVhdGVXU0RMTmFtZXNwYWNlVmlld2VyQ29sdW1uKFRhYmxlVmlld2VyIHRhYmxlVmlld2VyKSB7Ci0gICAgICAgIFRhYmxlVmlld2VyQ29sdW1uIHdzZGxOYW1lc3BhY2VWaWV3ZXJDb2x1bW4gPSBuZXcgVGFibGVWaWV3ZXJDb2x1bW4odGFibGVWaWV3ZXIsIFNXVC5MRUZUKTsKLSAgICAgICAgd3NkbE5hbWVzcGFjZVZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb2x1bW5MYWJlbFByb3ZpZGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBUYWJsZUNvbHVtbiB3c2RsTmFtZXNwYWNlQ29sdW1uID0gd3NkbE5hbWVzcGFjZVZpZXdlckNvbHVtbi5nZXRDb2x1bW4oKTsKLSAgICAgICAgd3NkbE5hbWVzcGFjZUNvbHVtbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1dTRExfTkFNRVNQQUNFX0NPTFVNTl9IRUFERVIpOwotICAgICAgICB3c2RsTmFtZXNwYWNlQ29sdW1uLnBhY2soKTsKLSAgICAgICAgcmV0dXJuIHdzZGxOYW1lc3BhY2VWaWV3ZXJDb2x1bW47Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUYWJsZVZpZXdlckNvbHVtbiBjcmVhdGVQYWNrYWdlTmFtZUNvbHVtbihUYWJsZVZpZXdlciB0YWJsZVZpZXdlciwgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIFRhYmxlVmlld2VyQ29sdW1uIHBhY2thZ2VOYW1lVmlld2VyQ29sdW1uID0gbmV3IFRhYmxlVmlld2VyQ29sdW1uKHRhYmxlVmlld2VyLCBTV1QuTEVGVCk7Ci0gICAgICAgIHBhY2thZ2VOYW1lVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IFBhY2thZ2VOYW1lQ29sdW1uTGFiZWxQcm92aWRlcihtb2RlbCkpOwotCi0gICAgICAgIFRhYmxlQ29sdW1uIHBhY2thZ2VOYW1lQ29sdW1uID0gcGFja2FnZU5hbWVWaWV3ZXJDb2x1bW4uZ2V0Q29sdW1uKCk7Ci0gICAgICAgIHBhY2thZ2VOYW1lQ29sdW1uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfUEFDS0FHRV9OQU1FX0NPTFVNTl9IRUFERVIpOwotICAgICAgICBwYWNrYWdlTmFtZUNvbHVtbi5wYWNrKCk7Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZVZpZXdlckNvbHVtbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVNlcnZpY2VOYW1lTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBzZXJ2aWNlTmFtZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBzZXJ2aWNlTmFtZUxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfU0VSVklDRV9OQU1FKTsKLSAgICAgICAgc2VydmljZU5hbWVMYWJlbC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9TRVJWSUNFX05BTUVfVE9PTFRJUCk7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZUxhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlU2VydmljZU5hbWVDb21ibyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQ29tYm8gc2VydmljZU5hbWVDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgc2VydmljZU5hbWVDb21iby5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9TRVJWSUNFX05BTUVfVE9PTFRJUCk7Ci0KLSAgICAgICAgc2VydmljZU5hbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRTZXJ2aWNlTmFtZShzZXJ2aWNlTmFtZUNvbWJvLmdldFRleHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHBvcHVsYXRlU2VydmljZU5hbWVDb21ibyhzZXJ2aWNlTmFtZUNvbWJvLCBtb2RlbCk7Ci0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VOYW1lQ29tYm87Ci0gICAgfQotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwb3B1bGF0ZVNlcnZpY2VOYW1lQ29tYm8oQ29tYm8gc2VydmljZU5hbWVDb21ibywgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHNlcnZpY2VOYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG1vZGVsLmdldFdzZGxEZWZpbml0aW9uKCk7Ci0gICAgICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1hcCBzZXJ2aWNlc01hcCA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlc01hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU2V0IHNlcnZpY2VzRW50cnlTZXQgPSBzZXJ2aWNlc01hcC5lbnRyeVNldCgpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHNlcnZpY2VzSXRlcmF0b3IgPSBzZXJ2aWNlc0VudHJ5U2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHNlcnZpY2VzSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBzZXJ2aWNlRW50cnkgPSAoTWFwLkVudHJ5KSBzZXJ2aWNlc0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIHNlcnZpY2VFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZSA9IHNlcnZpY2UuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWVDb21iby5hZGQocU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZUNvbWJvLmRlc2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUJpbmRpbmdGaWxlc0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgYmluZGluZ0ZpbGVzTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGJpbmRpbmdGaWxlc0xhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfQklORElOR19GSUxFUyk7Ci0gICAgICAgIGJpbmRpbmdGaWxlc0xhYmVsLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0JJTkRJTkdfTkFNRV9UT09MVElQKTsKLSAgICAgICAgcmV0dXJuIGJpbmRpbmdGaWxlc0xhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBjcmVhdGVCaW5kaW5nRmlsZXNMaXN0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgZmluYWwgTGlzdCBiaW5kaW5nRmlsZXNMaXN0ID0gbmV3IExpc3QocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLSAgICAgICAgYmluZGluZ0ZpbGVzTGlzdC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9CSU5ESU5HX05BTUVfVE9PTFRJUCk7Ci0gICAgICAgIHJldHVybiBiaW5kaW5nRmlsZXNMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUFkZEJpbmRpbmdGaWxlQnV0dG9uKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCwKLSAgICAgICAgICAgIGZpbmFsIExpc3QgYmluZGluZ0ZpbGVzTGlzdCkgewotICAgICAgICBCdXR0b24gYWRkQmluZGluZ0ZpbGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotICAgICAgICBhZGRCaW5kaW5nRmlsZUJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0JJTkRJTkdfRklMRVNfQUREKTsKLSAgICAgICAgYWRkQmluZGluZ0ZpbGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZyBzZWxlY3Rpb25EaWFsb2cgPSBuZXcgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2coCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ4bWwiLCAvLyROT04tTkxTLTEkIAotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfQklORElOR19GSUxFX0RJQUxPR19GSUxURVJfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0JJTkRJTkdfRklMRV9ESUFMT0dfVElUTEUpOwotICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRpYWxvZy5zZXRNZXNzYWdlKENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0JJTkRJTkdfRklMRV9ESUFMT0dfTUVTU0FHRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkRpYWxvZy5vcGVuKCkgPT0gU2VsZWN0aW9uRGlhbG9nLk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBzZWxlY3Rpb25EaWFsb2cuZ2V0UmVzdWx0KClbMF0udG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtb2RlbC5nZXRCaW5kaW5nRmlsZXMoKS5jb250YWlucyhyZXN1bHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5nZXRCaW5kaW5nRmlsZXMoKS5hZGQocmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdGaWxlc0xpc3QuYWRkKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gYWRkQmluZGluZ0ZpbGVCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlUmVtb3ZlQmluZGluZ0ZpbGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsLAotICAgICAgICAgICAgZmluYWwgTGlzdCBiaW5kaW5nRmlsZXNMaXN0KSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiByZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIHJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfQklORElOR19GSUxFU19SRU1PVkUpOwotICAgICAgICByZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgcmVtb3ZlQmluZGluZ0ZpbGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3RlZEJpbmRpbmdGaWxlcyA9IGJpbmRpbmdGaWxlc0xpc3QuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgYmluZGluZ0ZpbGUgOiBzZWxlY3RlZEJpbmRpbmdGaWxlcykgewotICAgICAgICAgICAgICAgICAgICBiaW5kaW5nRmlsZXNMaXN0LnJlbW92ZShiaW5kaW5nRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldEJpbmRpbmdGaWxlcygpLnJlbW92ZShiaW5kaW5nRmlsZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdGaWxlc0xpc3QuZ2V0SXRlbUNvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGJpbmRpbmdGaWxlc0xpc3QuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdGaWxlc0xpc3QuZ2V0SXRlbUNvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlUGFkZGluZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVhNTENhdGFsb2dMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIHhtbENhdGFsb2dMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgeG1sQ2F0YWxvZ0xhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWE1MX0NBVExPRyk7Ci0gICAgICAgIHhtbENhdGFsb2dMYWJlbC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YTUxfQ0FUQUxPR19UT09MVElQKTsKLSAgICAgICAgcmV0dXJuIHhtbENhdGFsb2dMYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlWE1MQ2F0YWxvZ1RleHQoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIFRleHQgeG1sQ2F0YWxvZ1RleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotICAgICAgICB4bWxDYXRhbG9nVGV4dC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YTUxfQ0FUQUxPR19UT09MVElQKTsKLSAgICAgICAgeG1sQ2F0YWxvZ1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHhtbENhdGFsb2cgPSB4bWxDYXRhbG9nVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0Q2F0YWxvZ0ZpbGUoeG1sQ2F0YWxvZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHJldHVybiB4bWxDYXRhbG9nVGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVYTUxDYXRhbG9nQnJvd3NlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQnV0dG9uIHhtbENhdGFsb2dCcm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotICAgICAgICB4bWxDYXRhbG9nQnJvd3NlQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWE1MX0NBVExPR19CUk9XU0UpOwotICAgICAgICByZXR1cm4geG1sQ2F0YWxvZ0Jyb3dzZUJ1dHRvbjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MzBjYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzVkMzM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZTAwMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI01vbiBGZWIgMDIgMTE6NTA6NDIgR01UIDIwMDkKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjQ4ZjJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtVmVyc2lvbjogMC4xLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtUmVnaXN0ZXJCdWRkeTogb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheGIuY29yZS5KQVhCQ29yZVBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNS4wIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjAuMzA0LDEuMS4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4Yi5jb3JlCi1JbXBvcnQtUGFja2FnZTogamF2YXguYWN0aXZhdGlvbiwKLSBqYXZheC54bWwuYmluZDt2ZXJzaW9uPSJbMi4xLjAsMi4yLjApIiwKLSBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uO3ZlcnNpb249IlsyLjEuMCwyLjIuMCkiLAotIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnM7dmVyc2lvbj0iWzIuMS4wLDIuMi4wKSIsCi0gamF2YXgueG1sLmJpbmQuYXR0YWNobWVudDt2ZXJzaW9uPSJbMi4xLjAsMi4yLjApIiwKLSBqYXZheC54bWwuYmluZC5oZWxwZXJzO3ZlcnNpb249IlsyLjEuMCwyLjIuMCkiLAotIGphdmF4LnhtbC5iaW5kLnV0aWw7dmVyc2lvbj0iWzIuMS4wLDIuMi4wKSIsCi0gb3JnLmFwYWNoZS54ZXJjZXMudXRpbAotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmEwMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMTksIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYWJvdXQuaW5pIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiOTNlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yIGZlYXR1cmUgZGV0YWlscyBpbiB0aGUgIkFib3V0IiAKLSMgZGlhbG9nICh0cmFuc2xhdGVkKS4gIE1heGltdW0gMTUgbGluZXMgYW5kIDc1IGNoYXJhY3RlcnMgcGVyIGxpbmUuCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYWJvdXQubWFwcGluZ3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0LnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4NDY5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZSBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9SkFYQiBUb29scyAoSW5jdWJhdGlvbilcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IFNoYW5lIENsYXJrZSBhbmQgb3RoZXJzIDIwMDkuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9pbmN1YmF0b3IvXG5cCi1cbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI5ZDYxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgaWNvbnMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA5YzJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzU5MjE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IFByb2dyZXNzIFNvZnR3YXJlCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSNwcm9wZXJ0aWVzIGZpbGUgZm9yIEpBWEIgQ29yZQotcGx1Z2luTmFtZT1KQVhCIFRvb2xzIENvcmUgKEluY3ViYXRpb24pCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi1KQVhCX0NBVEVHT1JZX05BTUU9SkFYQgotCi1YTUxfU0NIRU1BX1RZUEVfUlVMRVM9VmFsaWRhdGlvbiBydWxlcyBnb3Zlcm5pbmcgdGhlIHVzZSBvZiBAWG1sU2NoZW1hVHlwZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNzNhNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uQ2F0ZWdvcnkiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIG5hbWU9IiVKQVhCX0NBVEVHT1JZX05BTUUiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3Nvck9yZGVyIgotICAgICAgICAgICAgbmFtZT0iWG1sQWNjZXNzb3JPcmRlciIvPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlIgotICAgICAgICAgICAgbmFtZT0iWG1sQWNjZXNzb3JUeXBlIi8+Ci0gICAgICAKLSAgICAgIDwhLS0gVE9ETyBSZWluc3RhdGUgd2hlbiBYbWxBZGFwdGVyIGlzc3VlIGlzIHNvbHZlZAotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sQWRhcHRlciIKLSAgICAgICAgICAgIG5hbWU9IlhtbEFkYXB0ZXIiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgLS0+Ci0gICAgICAKLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUF0dHJpYnV0ZSIKLSAgICAgICAgICAgIG5hbWU9IlhtbEFueUF0dHJpYnV0ZSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlFbGVtZW50IgotICAgICAgICAgICAgbmFtZT0iWG1sQW55RWxlbWVudCI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRhY2htZW50UmVmIgotICAgICAgICAgICAgbmFtZT0iWG1sQXR0YWNobWVudFJlZiI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGUiCi0gICAgICAgICAgICBuYW1lPSJYbWxBdHRyaWJ1dGUiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudCIKLSAgICAgICAgICAgIG5hbWU9IlhtbEVsZW1lbnQiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudERlY2wiCi0gICAgICAgICAgICBuYW1lPSJYbWxFbGVtZW50RGVjbCI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50UmVmIgotICAgICAgICAgICAgbmFtZT0iWG1sRWxlbWVudFJlZiI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50UmVmcyIKLSAgICAgICAgICAgIG5hbWU9IlhtbEVsZW1lbnRSZWZzIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRXcmFwcGVyIgotICAgICAgICAgICAgbmFtZT0iWG1sRWxlbWVudFdyYXBwZXIiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudHMiCi0gICAgICAgICAgICBuYW1lPSJYbWxFbGVtZW50cyI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbnVtIgotICAgICAgICAgICAgbmFtZT0iWG1sRW51bSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbnVtVmFsdWUiCi0gICAgICAgICAgICBuYW1lPSJYbWxFbnVtVmFsdWUiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQiCi0gICAgICAgICAgICBuYW1lPSJYbWxJRCI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRFJFRiIKLSAgICAgICAgICAgIG5hbWU9IlhtbElEUkVGIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElubGluZUJpbmFyeURhdGEiCi0gICAgICAgICAgICBuYW1lPSJYbWxJbmxpbmVCaW5hcnlEYXRhIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlciIKLSAgICAgICAgICAgIG5hbWU9IlhtbEphdmFUeXBlQWRhcHRlciI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXJzIgotICAgICAgICAgICAgbmFtZT0iWG1sSmF2YVR5cGVBZGFwdGVycyI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxMaXN0IgotICAgICAgICAgICAgbmFtZT0iWG1sTGlzdCI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxNaW1lVHlwZSIKLSAgICAgICAgICAgIG5hbWU9IlhtbE1pbWVUeXBlIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbE1peGVkIgotICAgICAgICAgICAgbmFtZT0iWG1sTWl4ZWQiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTnMiCi0gICAgICAgICAgICBuYW1lPSJYbWxOcyI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSZWdpc3RyeSIKLSAgICAgICAgICAgIG5hbWU9IlhtbFJlZ2lzdHJ5Ij4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50IgotICAgICAgICAgICAgbmFtZT0iWG1sUm9vdEVsZW1lbnQiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hIgotICAgICAgICAgICAgbmFtZT0iWG1sU2NoZW1hIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYVR5cGUiCi0gICAgICAgICAgICBuYW1lPSJYbWxTY2hlbWFUeXBlIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYVR5cGVzIgotICAgICAgICAgICAgbmFtZT0iWG1sU2NoZW1hVHlwZXMiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2VlQWxzbyIKLSAgICAgICAgICAgIG5hbWU9IlhtbFNlZUFsc28iPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHJhbnNpZW50IgotICAgICAgICAgICAgbmFtZT0iWG1sVHJhbnNpZW50Ij4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGUiCi0gICAgICAgICAgICBuYW1lPSJYbWxUeXBlIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFZhbHVlIgotICAgICAgICAgICAgbmFtZT0iWG1sVmFsdWUiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgICAgIAotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheGIvY29yZS9KQVhCQ29yZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGY4ODE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheGIvY29yZS9KQVhCQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFByb2dyZXNzIFNvZnR3YXJlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4Yi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEpBWEJDb3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IAotICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheGIuY29yZS5KQVhCQ29yZU1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9OQU1FX0RJRkZFUkVOVF9DQVNFX0VYSVNUUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBUWVBFX1dJVEhfTkFNRV9BTFJFQURZX0VYSVNUUzsKLSAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfU0NIRU1BX1RZUEVfTVVTVF9IQVZFX0RFRkFVTFRfT05fRklFTERfT1JfTUVUSE9EOwotCQotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0gICAgICAgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEpBWEJDb3JlTWVzc2FnZXMuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgSkFYQkNvcmVNZXNzYWdlcygpIHsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheGIvY29yZS9KQVhCQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDgxYmFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheGIvY29yZS9KQVhCQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBQcm9ncmVzcyBTb2Z0d2FyZSBJbmMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI0pEVFV0aWxzCi1UWVBFX05BTUVfRElGRkVSRU5UX0NBU0VfRVhJU1RTPUEgVHlwZSB3aXRoIHRoZSBzYW1lIG5hbWUgYnV0IGRpZmZlcmVudCBjYXNlIGFscmVhZHkgZXhpc3RzCi1UWVBFX1dJVEhfTkFNRV9BTFJFQURZX0VYSVNUUz1BIGNvbXBpbGF0aW9uIHVuaXQgbmFtZWQgJyd7MH0nJyBhbHJlYWR5IGV4aXN0cyBpbiBwYWNrYWdlICcnezF9JycKLVhNTF9TQ0hFTUFfVFlQRV9NVVNUX0hBVkVfREVGQVVMVF9PTl9GSUVMRF9PUl9NRVRIT0Q9SWYgQFhtbFNjaGVtYVR5cGUgaXMgdXNlZCBvbiBhIGZpZWxkIG9yIGEgbWV0aG9kLCB0aGVuIHRoZSB2YWx1ZSBvZiB0eXBlKCkgbXVzdCBiZSBERUZBVUxULmNsYXNzIChKQVhCIDIuMSwgOC42LjQuMikKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheGIvY29yZS9KQVhCQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjRkYjc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheGIvY29yZS9KQVhCQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBQcm9ncmVzcyBTb2Z0d2FyZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4Yi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgSkFYQkNvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICBwcml2YXRlIHN0YXRpYyBKQVhCQ29yZVBsdWdpbiBwbHVnaW47Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBKQVhCQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgcmV0dXJuIHBsdWdpbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIHBsdWdpbiA9IHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwbHVnaW4gPSBudWxsOwotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIEpBWEJDb3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKHNldmVyaXR5LCBKQVhCQ29yZVBsdWdpbi5QTFVHSU5fSUQsIG1lc3NhZ2UpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIEpBWEJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgSkFYQkNvcmVQbHVnaW4ubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYQkNvcmVQbHVnaW4uUExVR0lOX0lELCBleGNlcHRpb24KLSAgICAgICAgICAgICAgICAuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBleGNlcHRpb24pKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MzBjYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzk3NzBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2UwMDJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jTW9uIEZlYiAwMiAxMTo1MDo0MiBHTVQgMjAwOQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ3YjhjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtVmVyc2lvbjogMC41LjIucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtUmVnaXN0ZXJCdWRkeTogb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlUGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW07YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3Jpbmc7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTtidW5kbGUtdmVyc2lvbj0iMC41LjAiLAotIGphdmF4LndzZGw7YnVuZGxlLXZlcnNpb249IlsxLjYuMiwxLjcuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cztidW5kbGUtdmVyc2lvbj0iWzEuMC4zMDQsMS4xLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscwotSW1wb3J0LVBhY2thZ2U6IGphdmF4LmFjdGl2YXRpb24sCi0gamF2YXguandzLAotIGphdmF4Lmp3cy5zb2FwLAotIGphdmF4LnhtbC5zb2FwLAotIGphdmF4LnhtbC53czt2ZXJzaW9uPSIyLjEuMCIsCi0gamF2YXgueG1sLndzLmhhbmRsZXI7dmVyc2lvbj0iMi4xLjAiLAotIGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXA7dmVyc2lvbj0iMi4xLjAiLAotIGphdmF4LnhtbC53cy5odHRwO3ZlcnNpb249IjIuMS4wIiwKLSBqYXZheC54bWwud3Muc29hcDt2ZXJzaW9uPSIyLjEuMCIsCi0gamF2YXgueG1sLndzLnNwaTt2ZXJzaW9uPSIyLjEuMCIsCi0gamF2YXgueG1sLndzLndzYWRkcmVzc2luZzt2ZXJzaW9uPSIyLjEuMCIsCi0gb3JnLmFwYWNoZS54ZXJjZXMudXRpbAotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2YTAzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMTksIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0LmluaSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2I5M2U2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yIGZlYXR1cmUgZGV0YWlscyBpbiB0aGUgIkFib3V0IiAKLSMgZGlhbG9nICh0cmFuc2xhdGVkKS4gIE1heGltdW0gMTUgbGluZXMgYW5kIDc1IGNoYXJhY3RlcnMgcGVyIGxpbmUuCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0Lm1hcHBpbmdzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9hYm91dC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzFlYWQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZSBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9SkFYLVdTIFRvb2xzIChJbmN1YmF0aW9uKVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA4LCAyMDA5LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvaW5jdWJhdG9yL1xuXAotXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI5ZDYxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA5YzJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGFkNzc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI3Byb3BlcnRpZXMgZmlsZSBmb3IgSkFYV1MgQ29yZQotcGx1Z2luTmFtZT1KQVgtV1MgVG9vbHMgQ29yZSAoSW5jdWJhdGlvbikKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLVdFQlNFUlZJQ0VfQ0xBU1NfREVGQVVMVF9QVUJMSUNfQ09OU1RSVUNUT1JfUlVMRT1DbGFzc2VzIGFubm90YXRlZCB3aXRoIEBXZWJTZXJ2aWNlIG11c3QgaGF2ZSBhIGRlZmF1bHQgcHVibGljIGNvbnN0cnVjdG9yCi1XRUJTRVJWSUNFX0NMQVNTX1BVQkxJQ19BQlNUUkFDVF9GSU5BTF9SVUxFPUNsYXNzZXMgYW5ub3RhdGVkIHdpdGggQFdlYlNlcnZpY2UgbXVzdCBiZSBhbiBvdXRlciBwdWJsaWMgY2xhc3MsIG11c3Qgbm90IGJlIGZpbmFsLCBhbmQgbXVzdCBub3QgYmUgYWJzdHJhY3QKLVdFQlNFUlZJQ0VfQ0xBU1NfTk9fRklOQUxJWkVfTUVUSE9EX1JVTEU9Q2xhc3NlcyBhbm5vdGF0ZWQgd2l0aCBAV2ViU2VydmljZSBtdXN0IG5vdCBkZWZpbmUgYSBmaW5hbGl6ZSgpIG1ldGhvZAotV0VCTUVUSE9EX09OTFlfU1VQUE9SVEVEX09OX0NMQVNTRVNfV0lUSF9XRUJTRVJWSUNFX0FOTk5PVEFUSU9OPUBXZWJNZXRob2QgYW5ub3RhdGlvbnMgb25seSBzdXBwb3J0ZWQgaW4gY2xhc3NlcyB3aXRoIHRoZSBAV2ViU2VydmljZSBhbm5vdGF0aW9uCi1XRUJTRVJWSUNFX1NFSV9OT19XRUJNRVRIT1NfUlVMRT1ObyBAV2ViTWV0aG9kIGFubm90YXRpb25zIGFsbG93ZWQgaW4gYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCBjb250YWlucyBhbiBlbmRwb2ludEludGVyZmFjZSBhdHRyaWJ1dGUgaW4gaXQncyBAV2ViU2VydmljZSBhbm5vdGF0aW9uCi1XRUJTRVJWSUNFX09OX1NFSV9BVFRSSUJVVEVTX1JVTEU9Q2VydGFpbiBAV2ViU2VydmljZSBhbm5vdGF0aW9uIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgd2hlbiB1c2VkIG9uIFNFSSdzCi1XRUJTRVJWSUNFX1dFQlNFUlZJQ0VfUFJPVklERVJfQ09FWElTVF9SVUxFPUBXZWJTZXJ2aWNlIGFuZCBAV2ViU2VydmljZVByb3ZpZGVyIGFubm90YXRpb25zIGNhbm5vdCBjb2V4aXN0Ci1PTkVXQVlfTk9fUkVUVVJOX1ZBTFVFPUBPbmV3YXkgbWV0aG9kcyBtdXN0IG5vdCByZXR1cm4gYSB2YWx1ZQotV0VCTUVUSE9EX09OTFlfUFVCTElDX01FVEhPRFM9TWV0aG9kcyBhbm5vdGF0ZWQgd2l0aCBAV2ViTWV0aG9kIG11c3QgYmUgcHVibGljLCBhbmQgbXVzdCBub3QgYmUgZGVjbGFyZWQgc3RhdGljIG9yIGZpbmFsCi1TT0FQQklORElOR19SVUxFUz1AU09BUEJpbmRpbmcgUnVsZXMuIEVuY29kZWQgdXNlIG5vdCBzdXBwb3J0ZWQuIE5vIFJQQyBzdHlsZSBvbiBtZXRob2RzLiBObyBtaXhpbmcgb2YgU09BUEJpbmRpbmcgc3R5bGVzLiBSUEMgc3R5bGUgb25seSB3aXRoIHdyYXBwZWQgcGFyYW1ldGVyIHN0eWxlCi1XRUJNRVRIT0RfRVhDTFVERV9TUEVDSUZJRURfUlVMRT1AV2ViTWV0aG9kIGV4Y2x1ZGUgYXR0cmlidXRlIGlzIG5vdCBhbGxvd2VkIGluIFNFSSdzLiBJZiBzcGVjaWZpZWQgaW4gYW4gaW1wbGVtZW50YXRpb24gY2xhc3MsIHRoZW4gb3RoZXIgYXR0cmlidXRlcyBpbiB0aGUgQFdlYk1ldGhvZCBhbm5vdGF0aW9uIGFyZSBub3QgYWxsb3dlZAotU09BUEJJTkRJTkdfRE9DVU1FTlRfQkFSRV9SVUxFUz1Eb2N1bWVudCBCYXJlIG9wZXJhdGlvbnMgYXJlIHN1YmplY3QgdG8gYSBudW1iZXIgb2YgcmVzdHJpY3Rpb25zLiBDb21iaW5hdGlvbnMgb2YgQE9uZXdheS4gTm90IEBPbmV3YXkuIFZvaWQgUmV0dXJuLiBOb24tVm9pZCBSZXR1cm4uIEBXZWJQYXJhbSBNb2RlcyBJTiwgT1VULCBJTk9VVC4gSGVhZGVyIHBhcmFtZXRlcnMKLUhPTERFUl9UWVBFU19QQVJBTUVURVJTX1JVTEU9UGFyYW1ldGVycyB0aGF0IGNvbmZvcm0gdG8gdGhlIGRlZmluaXRpb24gb2YgSG9sZGVyIFR5cGVzIG11c3QgYmUgYW5ub3RhdGVkIHdpdGggQFdlYlBhcmFtLk1vZGUuT1VUIG9yIEBXZWJQYXJhbS5Nb2RlLklOT1VUCi1VTklRVUVfTkFNRVNfUlVMRT1DaGVja3MgQFJlc3BvbnNlV3JhcHBlciwgQFJlcXVlc3RXcmFwcGVyIGFuZCBAV2ViRmF1bHQgQmVhbnMgZm9yIHVuaXF1ZSBjbGFzc05hbWUgYW5kIGZhdWx0QmVhbiBhdHRyaWJ1dGVzCi1IQU5ETEVSQ0hBSU5fUlVMRVM9QEhhbmRsZXJDaGFpbiBhbmQgQFNPQVBNZXNzYWdlSGFuZGxlcnMgYW5ub3RhdGlvbnMgY2Fubm90IGNvZXhpc3QuIEBIYW5kbGVyQ2hhaW4gYWxsb3dlZCBvbiBUWVBFIG9ubHkKLVdFQlNFUlZJQ0VSRUZTX1JVTEVTPUVhY2ggQFdlYlNlcnZpY2VSZWYgYW5ub3RhdGlvbiBpbnNpZGUgYSBAV2ViU2VydmljZVJlZnMgbXVzdCBjb250YWluIG5hbWUgYW5kIHR5cGUgZWxlbWVudHMgd2l0aCBub24tZGVmYXVsdCB2YWx1ZXMKLVdFQlNFUlZJQ0VfVEFSR0VUX05BTUVTUEFDRV9SVUxFPUNsYXNzZXMgb3IgSW50ZXJmYWNlcyBpbiB0aGUgZGVmYXVsdCBwYWNrYWdlIHRoYXQgYXJlIGFubm90YXRlZCB3aXRoIEBqYXZheC5qd3MuV2ViU2VydmljZSBtdXN0IHNwZWNpZnkgYSB0YXJnZXQgbmFtZXNwYWNlCi1XRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fUlVMRT1UaGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBiZWFuIG11c3QgcmVtYWluIGNvbnNpc3RlbnQgd2l0aCB0aGUgcG9ydFR5cGUgYW5kIGJpbmRpbmdzIGRlY2xhcmVkIGluIHRoaXMgV1NETCByZWZlcmVuY2VkIGluIHRoZSBAV2ViU2VydmljZS53c2RsTG9jYXRpb24gYXR0cmlidXRlCi1XRUJTRVJWSUNFUFJPVklERVJfUlVMRVM9QSBQcm92aWRlciBiYXNlZCBzZXJ2aWNlIGVuZHBvaW50IGltcGxlbWVudGF0aW9uIG11c3QgaW1wbGVtZW50IGEgdHlwZWQgUHJvdmlkZXIgaW50ZXJmYWNlIGFuZCBwcm92aWRlIGEgcHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IuCi1KQVhXU19DQVRFR09SWV9OQU1FPUpBWC1XUwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzMzM2RkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25DYXRlZ29yeSI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIGlkPSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIG5hbWU9IiVKQVhXU19DQVRFR09SWV9OQU1FIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb24iPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC5qd3MuV2ViU2VydmljZSIKLSAgICAgICAgICAgIG5hbWU9IldlYlNlcnZpY2UiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC5qd3MuV2ViTWV0aG9kIgotICAgICAgICAgICAgbmFtZT0iV2ViTWV0aG9kIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXguandzLldlYlBhcmFtIgotICAgICAgICAgICAgbmFtZT0iV2ViUGFyYW0iPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC5qd3MuV2ViUmVzdWx0IgotICAgICAgICAgICAgbmFtZT0iV2ViUmVzdWx0Ij4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXguandzLkhhbmRsZXJDaGFpbiIKLSAgICAgICAgICAgIG5hbWU9IkhhbmRsZXJDaGFpbiI+Ci0gICAgICAgICA8dGFyZ2V0RmlsdGVyIHRhcmdldD0iRklFTEQiLz4KLSAgICAgICAgIDx0YXJnZXRGaWx0ZXIgdGFyZ2V0PSJNRVRIT0QiLz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXguandzLk9uZXdheSIKLSAgICAgICAgICAgIG5hbWU9Ik9uZXdheSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nIgotICAgICAgICAgICAgbmFtZT0iU09BUEJpbmRpbmciPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyIgotICAgICAgICAgICAgbmFtZT0iV2ViU2VydmljZVByb3ZpZGVyIgotICAgICAgICAgICAgcmVzdHJpY3RlZFRvPSJDTEFTU19PTkxZIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQiCi0gICAgICAgICAgICBuYW1lPSJXZWJTZXJ2aWNlQ2xpZW50IgotICAgICAgICAgICAgcmVzdHJpY3RlZFRvPSJDTEFTU19PTkxZIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWYiCi0gICAgICAgICAgICBuYW1lPSJXZWJTZXJ2aWNlUmVmIgotICAgICAgICAgICAgcmVzdHJpY3RlZFRvPSJDTEFTU19PTkxZIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWZzIgotICAgICAgICAgICAgbmFtZT0iV2ViU2VydmljZVJlZnMiCi0gICAgICAgICAgICByZXN0cmljdGVkVG89IkNMQVNTX09OTFkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuU2VydmljZU1vZGUiCi0gICAgICAgICAgICBuYW1lPSJTZXJ2aWNlTW9kZSIKLSAgICAgICAgICAgIHJlc3RyaWN0ZWRUbz0iQ0xBU1NfT05MWSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5XZWJGYXVsdCIKLSAgICAgICAgICAgIG5hbWU9IldlYkZhdWx0IgotICAgICAgICAgICAgcmVzdHJpY3RlZFRvPSJDTEFTU19PTkxZIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLkJpbmRpbmdUeXBlIgotICAgICAgICAgICAgbmFtZT0iQmluZGluZ1R5cGUiCi0gICAgICAgICAgICByZXN0cmljdGVkVG89IkNMQVNTX09OTFkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXIiCi0gICAgICAgICAgICBuYW1lPSJSZXF1ZXN0V3JhcHBlciI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXIiCi0gICAgICAgICAgICBuYW1lPSJSZXNwb25zZVdyYXBwZXIiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuV2ViRW5kcG9pbnQiCi0gICAgICAgICAgICBuYW1lPSJXZWJFbmRwb2ludCIKLSAgICAgICAgICAgIHJlc3RyaWN0ZWRUbz0iQ0xBU1NfT05MWSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5SZXNwZWN0QmluZGluZyIKLSAgICAgICAgICAgIG5hbWU9IlJlc3BlY3RCaW5kaW5nIgotICAgICAgICAgICAgcmVzdHJpY3RlZFRvPSJDTEFTU19PTkxZIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLnNvYXAuQWRkcmVzc2luZyIKLSAgICAgICAgICAgIG5hbWU9IkFkZHJlc3NpbmciCi0gICAgICAgICAgICByZXN0cmljdGVkVG89IkNMQVNTX09OTFkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3Muc29hcC5NVE9NIgotICAgICAgICAgICAgbmFtZT0iTVRPTSIKLSAgICAgICAgICAgIHJlc3RyaWN0ZWRUbz0iQ0xBU1NfT05MWSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5GYXVsdEFjdGlvbiIKLSAgICAgICAgICAgIG5hbWU9IkZhdWx0QWN0aW9uIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLkFjdGlvbiIKLSAgICAgICAgICAgIG5hbWU9IkFjdGlvbiI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5zcGkuV2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uIgotICAgICAgICAgICAgbmFtZT0iV2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uUHJvY2Vzc29yIj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJTZXJ2aWNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uSG9sZGVyVHlwZVBhcmFtZXRlcnNSdWxlIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVIT0xERVJfVFlQRVNfUEFSQU1FVEVSU19SVUxFCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViU2VydmljZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLlVuaXF1ZU5hbWVzUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlVU5JUVVFX05BTUVTX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJTZXJ2aWNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uV2ViU2VydmljZURlZmF1bHRQdWJsaWNDb25zdHJ1Y3RvclJ1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVdFQlNFUlZJQ0VfQ0xBU1NfREVGQVVMVF9QVUJMSUNfQ09OU1RSVUNUT1JfUlVMRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlUHVibGljQWJzdHJhY3RGaW5hbFJ1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVdFQlNFUlZJQ0VfQ0xBU1NfUFVCTElDX0FCU1RSQUNUX0ZJTkFMX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJTZXJ2aWNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uV2ViU2VydmljZU5vRmluYWxpemVNZXRob2RSdWxlIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXRUJTRVJWSUNFX0NMQVNTX05PX0ZJTkFMSVpFX01FVEhPRF9SVUxFCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViU2VydmljZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYlNlcnZpY2VTRUlSZXN0cmljdGlvbnNSdWxlIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXRUJTRVJWSUNFX1NFSV9OT19XRUJNRVRIT1NfUlVMRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlU0VJQWxsb3dlZEF0dHJpYnV0ZXNSdWxlIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXRUJTRVJWSUNFX09OX1NFSV9BVFRSSUJVVEVTX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJTZXJ2aWNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uV2ViU2VydmljZVdlYlNlcnZpY2VQcm92aWRlckNvRXhpc3RSdWxlIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIAklV0VCU0VSVklDRV9XRUJTRVJWSUNFX1BST1ZJREVSX0NPRVhJU1RfUlVMRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYk1ldGhvZCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYk1ldGhvZENoZWNrRm9yV2ViU2VydmljZVJ1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVdFQk1FVEhPRF9PTkxZX1NVUFBPUlRFRF9PTl9DTEFTU0VTX1dJVEhfV0VCU0VSVklDRV9BTk5OT1RBVElPTgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYk1ldGhvZCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYk1ldGhvZFB1YmxpY1N0YXRpY0ZpbmFsUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCTUVUSE9EX09OTFlfUFVCTElDX01FVEhPRFMKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJNZXRob2QiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJNZXRob2RFeGNsdWRlUnVsZXMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVdFQk1FVEhPRF9FWENMVURFX1NQRUNJRklFRF9SVUxFCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuT25ld2F5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uT25ld2F5UnVsZXMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJU9ORVdBWV9OT19SRVRVUk5fVkFMVUUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uU09BUEJpbmRpbmdSdWxlcyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlU09BUEJJTkRJTkdfUlVMRVMKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uU09BUEJpbmRpbmdEb2N1bWVudEJhcmVSdWxlcyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlU09BUEJJTkRJTkdfRE9DVU1FTlRfQkFSRV9SVUxFUwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLkhhbmRsZXJDaGFpbiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLkhhbmRsZXJDaGFpblJ1bGVzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVIQU5ETEVSQ0hBSU5fUlVMRVMKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4gICAgIAotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWZzIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uV2ViU2VydmljZVJlZnNSdWxlcyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRVJFRlNfUlVMRVMKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJTZXJ2aWNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZVJ1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVdFQlNFUlZJQ0VfVEFSR0VUX05BTUVTUEFDRV9SVUxFCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+ICAgICAKLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJTZXJ2aWNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uV2ViU2VydmljZVdTRExMb2NhdGlvblJ1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVdFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9SVUxFCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uV2ViU2VydmljZVByb3ZpZGVyUnVsZXMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVdFQlNFUlZJQ0VQUk9WSURFUl9SVUxFUwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL0pBWFdTQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1M2E1ZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgSkFYV1NDb3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IAotICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBUWVBFX05BTUVfRElGRkVSRU5UX0NBU0VfRVhJU1RTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfV0lUSF9OQU1FX0FMUkVBRFlfRVhJU1RTOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ORVdBWV9OT19SRVRVUk5fVkFMVUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgT05FV0FZX05PX0NIRUNLRURfRVhDRVBUSU9OUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBPTkVXQVlfTk9fSE9MREVSX1BBUkFNRVRFUlM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCUEFSQU1fTU9ERV9PVVRfSU5PVVRfSE9MREVSX1RZUEU7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSE9MREVSX1RZUEVfTVVTVF9CRV9PVVRfSU5PVVQ7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRE9DX0JBUkVfTk9OX1ZPSURfUkVUVVJOX05PX0lOT1VUX09VVF9QQVJBTUVURVI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRE9DX0JBUkVfT05MWV9PTkVfTk9OX0hFQURFUl9JTl9QQVJBTUVURVI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRE9DX0JBUkVfVk9JRF9SRVRVUk5fT05FX0lOX1BBUkFNRVRFUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBET0NfQkFSRV9WT0lEX1JFVFVSTl9PTkVfT1VUX1BBUkFNRVRFUjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEhBTkRMRVJfQ0hBSU5fU09BUF9NRVNTQUdFX0hBTkRMRVJTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEhBTkRMRVJfQ0hBSU5fT05fRklFTEQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSEFORExFUl9DSEFJTl9PTl9NRVRIT0Q7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFUkVGU19OQU1FX1JFUVVJUkVEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VSRUZTX1RZUEVfUkVRVUlSRUQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJQQVJBTV9OQU1FX1JFUVVJUkVEX1dIRU5fRE9DX0JBUkVfT1VUX0lOT1VUOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQk1FVEhPRF9PTkxZX1NVUFBPUlRFRF9PTl9DTEFTU0VTX1dJVEhfV0VCU0VSVklDRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJNRVRIT0RfT05MWV9PTl9QVUJMSUNfTUVUSE9EUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJNRVRIT0RfTk9fRklOQUxfTU9ESUZJRVJfQUxMT1dFRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJNRVRIT0RfTk9fU1RBVElDX01PRElGSUVSX0FMTE9XRUQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCTUVUSE9EX0VYQ0xVREVfU1BFQ0lGSUVEX05PX09USEVSX0FUVFJJQlVURVNfQUxMT1dFRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJNRVRIT0RfRVhDTFVERV9OT1RfQUxMT1dFRF9PTl9TRUk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX1BVQkxJQ19BQlNUUkFDVF9GSU5BTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0RFRkFVTFRfUFVCTElDX0NPTlNUUlVDVE9SOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfT1ZFUlJJREVfRklOQUxJWkU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTkRQT0lOVElOVEVSRkFDRV9TRUk7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9QT1JUTkFNRV9TRUk7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9TRVJWSUNFTkFNRV9TRUk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTVVTVF9JTVBMRU1FTlQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX1JFRFVDRURfVklTSUJJTElUWTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfSU5DT01QQVRJQkxFX1JFVFVSTl9UWVBFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfSU5URVJGQUNFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfRk9VTkQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9BTk5PVEFURUQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9QVUJMSUM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQk1FVEhPRFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9PVVRFUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fTkFNRV9BVFRSSUJVVEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1NPQVBCSU5ESU5HOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJSRVNVTFQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQlBBUkFNOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19PTkVXQVk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX1dFQlNFUlZJQ0VQUk9WSURFUl9DT01CSU5BVElPTjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0RFRkFVTFRfUEFDS0FHRV9UQVJHRVRfTkFNRVNQQUNFOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9VTkFCTEVfVE9fTE9DQVRFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9OT19QT1JUX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX05PX1NFUlZJQ0VfTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fTk9fT1BFUlRBVElPTl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9XU0RMX09QRVJBVElPTl9PVVRQVVRfTUVUSE9EX09ORVdBWTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fU09BUF9CSU5ESU5HX1NUWUxFOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNPQVBCSU5ESU5HX05PX1JQQ19TVFlMRV9PTl9NRVRIT0RTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNPQVBCSU5ESU5HX1JQQ19FTkNPREVEX05PVF9TVVBQT1JURUQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU09BUEJJTkRJTkdfRE9DVU1FTlRfRU5DT0RFRF9OT1RfU1VQUE9SVEVEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNPQVBCSU5ESU5HX05PX01JWEVEX0JJTkRJTkdTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNPQVBCSU5ESU5HX1JQQ19OT19CQVJFX1BBUkFNRVRFUl9TVFlMRTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFUFJPVklERVJfREVGQVVMVF9QVUJMSUNfQ09OU1RSVUNUT1I7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRVBST1ZJREVSX0lNUExFTUVOVF9UWVBFRF9QUk9WSURFUl9JTlRFUkZBQ0U7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRVBST1ZJREVSX1NPQVBNRVNTQUdFX1NPQVBCSU5ESU5HOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VQUk9WSURFUl9TT0FQTUVTU0FHRV9NRVNTQUdFX01PREU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRVBST1ZJREVSX0RBVEFTT1VSQ0VfSFRUUEJJTkRJTkc7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRVBST1ZJREVSX0RBVEFTT1VSQ0VfTUVTU0FHRV9NT0RFOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE9QRVJBVElPTl9OQU1FU19NVVNUX0JFX1VOSVFVRV9FUlJPUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXUkFQUEVSX0ZBVUxUX0JFQU5fTkFNRVNfTVVTVF9CRV9VTklRVUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRE9DX0JBUkVfTUVUSE9EU19VTklRVUVfWE1MX0VMRU1FTlRTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIExPQ0FMX05BTUVfQVRUUklCVVRFU19NVVNUX0JFX1VOSVFVRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX05BTUVfQVRUUklCVVRFOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBUkFNRVRFUl9OQU1FX0NMQVNIOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEdFTkVSQVRFRF9QQVJBTUVURVJfTkFNRV9DTEFTSDsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICAvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotICAgICAgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBKQVhXU0NvcmVNZXNzYWdlcy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBKQVhXU0NvcmVNZXNzYWdlcygpIHsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlTWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL0pBWFdTQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzODc0MTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jSkRUVXRpbHMKLVRZUEVfTkFNRV9ESUZGRVJFTlRfQ0FTRV9FWElTVFM9QSBUeXBlIHdpdGggdGhlIHNhbWUgbmFtZSBidXQgZGlmZmVyZW50IGNhc2UgYWxyZWFkeSBleGlzdHMKLVRZUEVfV0lUSF9OQU1FX0FMUkVBRFlfRVhJU1RTPUEgY29tcGlsYXRpb24gdW5pdCBuYW1lZCAnJ3swfScnIGFscmVhZHkgZXhpc3RzIGluIHBhY2thZ2UgJyd7MX0nJwotCi1XRUJTRVJWSUNFX0RFRkFVTFRfUFVCTElDX0NPTlNUUlVDVE9SPUNsYXNzZXMgYW5ub3RhdGVkIHdpdGggQFdlYlNlcnZpY2UgbXVzdCBoYXZlIGEgZGVmYXVsdCBwdWJsaWMgY29uc3RydWN0b3IKLVdFQlNFUlZJQ0VfUFVCTElDX0FCU1RSQUNUX0ZJTkFMPUNsYXNzZXMgYW5ub3RhdGVkIHdpdGggQFdlYlNlcnZpY2UgbXVzdCBiZSBhbiBvdXRlciBwdWJsaWMgY2xhc3MsIG11c3Qgbm90IGJlIGZpbmFsLCBhbmQgbXVzdCBub3QgYmUgYWJzdHJhY3QKLVdFQlNFUlZJQ0VfT1ZFUlJJREVfRklOQUxJWkU9Q2xhc3NlcyBhbm5vdGF0ZWQgd2l0aCBAV2ViU2VydmljZSBtdXN0IG5vdCBkZWZpbmUgYSBmaW5hbGl6ZSgpIG1ldGhvZAotV0VCTUVUSE9EX09OTFlfU1VQUE9SVEVEX09OX0NMQVNTRVNfV0lUSF9XRUJTRVJWSUNFPUBXZWJNZXRob2QgaXMgb25seSBzdXBwb3J0ZWQgb24gY2xhc3NlcyBhbm5vdGF0ZWQgd2l0aCBAV2ViU2VydmljZQotV0VCTUVUSE9EX09OTFlfT05fUFVCTElDX01FVEhPRFM9QFdlYk1ldGhvZCBhbm5vdGF0aW9uIGlzIG5vdCBhbGxvd2VkIG9uIG5vbi1wdWJsaWMgbWV0aG9kcwotV0VCTUVUSE9EX05PX0ZJTkFMX01PRElGSUVSX0FMTE9XRUQ9QFdlYk1ldGhvZCBhbm5vdGF0aW9uIGlzIG5vdCBhbGxvd2VkIG9uIGZpbmFsIG1ldGhvZHMKLVdFQk1FVEhPRF9OT19TVEFUSUNfTU9ESUZJRVJfQUxMT1dFRD1AV2ViTWV0aG9kIGFubm90YXRpb24gaXMgbm90IGFsbG93ZWQgb24gc3RhdGljIG1ldGhvZHMKLVdFQk1FVEhPRF9FWENMVURFX1NQRUNJRklFRF9OT19PVEhFUl9BVFRSSUJVVEVTX0FMTE9XRUQ9QFdlYk1ldGhvZCBleGNsdWRlIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQuIE5vIG90aGVyIGF0dHJpYnV0ZXMgYWxsb3dlZAotV0VCTUVUSE9EX0VYQ0xVREVfTk9UX0FMTE9XRURfT05fU0VJPUBXZWJNZXRob2QgYW5ub3RhdGlvbnMgaW4gU0VJJ3MgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgdGhlIGV4Y2x1ZGUgYXR0cmlidXRlCi1XRUJTRVJWSUNFX1NFUlZJQ0VOQU1FX1NFST1AV2ViU2VydmljZSBzZXJ2aWNlTmFtZSBlbGVtZW50IGlzIG5vdCBhbGxvd2VkIG9uIFNFSQotV0VCU0VSVklDRV9FTkRQT0lOVElOVEVSRkFDRV9TRUk9QFdlYlNlcnZpY2UgZW5kcG9pbnRJbnRlcmZhY2UgZWxlbWVudCBpcyBub3QgYWxsb3dlZCBvbiBTRUkKLVdFQlNFUlZJQ0VfUE9SVE5BTUVfU0VJPUBXZWJTZXJ2aWNlIHBvcnROYW1lIGVsZW1lbnQgaXMgbm90IGFsbG93ZWQgb24gU0VJCi1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTVVTVF9JTVBMRU1FTlQ9SW1wbGVtZW50YXRpb24gY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIFNFSSBtZXRob2QgJyd7MH0nJwotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX1JFRFVDRURfVklTSUJJTElUWT1DYW5ub3QgcmVkdWNlIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBTRUkgbWV0aG9kCi1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfSU5DT01QQVRJQkxFX1JFVFVSTl9UWVBFPVRoZSByZXR1cm4gdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB7MH0KLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfSU5URVJGQUNFPVRoZSBlbmRwb2ludEludGVyZmFjZSAnJ3swfScnIG11c3QgYmUgYW4gSW50ZXJmYWNlCi1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX0ZPVU5EPVRoZSBlbmRwb2ludEludGVyZmFjZSAnJ3swfScnIGNhbm5vdCBiZSBmb3VuZAotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9BTk5PVEFURUQ9VGhlIGVuZHBvaW50SW50ZXJmYWNlICcnezB9JycgbXVzdCBiZSBhbm5vdGF0ZWQgd2l0aCBAamF2YXguandzLldlYlNlcnZpY2UKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfUFVCTElDPVRoZSBlbmRwb2ludEludGVyZmFjZSAnJ3swfScnIG11c3QgYmUgcHVibGljCi1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX09VVEVSPVRoZSBlbmRwb2ludEludGVyZmFjZSAnJ3swfScnIG11c3QgYmUgYW4gb3V0ZXIgaW50ZXJmYWNlCi1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fTkFNRV9BVFRSSUJVVEU9QFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBjb250YWlucyBhbiBlbmRwb2ludEludGVyZmFjZSBhdHRyaWJ1dGUuIE5vIG5hbWUgYXR0cmlidXRlIGFsbG93ZWQKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJNRVRIT0RTPUBXZWJTZXJ2aWNlIGFubm90YXRpb24gY29udGFpbnMgYW4gZW5kcG9pbnRJbnRlcmZhY2UgYXR0cmlidXRlLiBObyBtZXRob2RzIGFubm90YXRlZCB3aXRoIEBXZWJNZXRob2QgYWxsb3dlZCBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzcwotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1NPQVBCSU5ESU5HPUBXZWJTZXJ2aWNlIGFubm90YXRpb24gY29udGFpbnMgYW4gZW5kcG9pbnRJbnRlcmZhY2UgYXR0cmlidXRlLiBAU09BUEJpbmRpbmcgbm90IGFsbG93ZWQgaW4gaW1wbGVtZW50YXRpb24gY2xhc3MKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJSRVNVTFQ9QFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBjb250YWlucyBhbiBlbmRwb2ludEludGVyZmFjZSBhdHRyaWJ1dGUuIE5vIG1ldGhvZHMgYW5ub3RhdGVkIHdpdGggQFdlYlJlc3VsdCBhbGxvd2VkIGluIGltcGxlbWVudGF0aW9uIGNsYXNzCi1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fV0VCUEFSQU09QFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBjb250YWlucyBhbiBlbmRwb2ludEludGVyZmFjZSBhdHRyaWJ1dGUuIE5vIHBhcmFtZXRlcnMgYW5ub3RhdGVkIHdpdGggQFdlYlBhcmFtIGFsbG93ZWQgaW4gaW1wbGVtZW50YXRpb24gY2xhc3MKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19PTkVXQVk9QFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBjb250YWlucyBhbiBlbmRwb2ludEludGVyZmFjZSBhdHRyaWJ1dGUuIE5vIG1ldGhvZHMgYW5ub3RhdGVkIHdpdGggQE9uZXdheSBhbGxvd2VkIGluIGltcGxlbWVudGF0aW9uIGNsYXNzCi1XRUJTRVJWSUNFX1dFQlNFUlZJQ0VQUk9WSURFUl9DT01CSU5BVElPTj1AV2ViU2VydmljZSBhbmQgQFdlYlNlcnZpY2VQcm92aWRlciBhbm5vdGF0aW9ucyBjYW5ub3QgYmUgY29tYmluZWQKLVdFQlNFUlZJQ0VfREVGQVVMVF9QQUNLQUdFX1RBUkdFVF9OQU1FU1BBQ0U9Q2xhc3NlcyBvciBJbnRlcmZhY2VzIGluIHRoZSBkZWZhdWx0IHBhY2thZ2UgdGhhdCBhcmUgYW5ub3RhdGVkIHdpdGggQFdlYlNlcnZpY2UgbXVzdCBzcGVjaWZ5IGEgdGFyZ2V0TmFtZXNwYWNlIGF0dHJpYnV0ZQotT05FV0FZX05PX1JFVFVSTl9WQUxVRT1AT25ld2F5IG1ldGhvZHMgbXVzdCBub3QgcmV0dXJuIGEgdmFsdWUKLU9ORVdBWV9OT19DSEVDS0VEX0VYQ0VQVElPTlM9QE9uZXdheSBtZXRob2RzIG11c3Qgbm90IGRlY2xhcmUgYW55IGNoZWNrZWQgZXhjZXB0aW9ucwotT05FV0FZX05PX0hPTERFUl9QQVJBTUVURVJTPUBPbmV3YXkgbWV0aG9kcyBtdXN0IG5vdCBhY2NlcHQgYW55IGphdmF4LnhtbC53cy5Ib2xkZXI8VD4gcGFyYW1ldGVycy4gCi1XRUJQQVJBTV9NT0RFX09VVF9JTk9VVF9IT0xERVJfVFlQRT1UaGUgQFdlYlBhcmFtLk1vZGUuT1VUIGFuZCBAV2ViUGFyYW0uTW9kZS5JTk9VVCBtb2RlcyBtYXkgb25seSBiZSBzcGVjaWZpZWQgZm9yIGphdmF4LnhtbC53cy5Ib2xkZXI8VD4gcGFyYW1ldGVycwotSE9MREVSX1RZUEVfTVVTVF9CRV9PVVRfSU5PVVQ9amF2YXgueG1sLndzLkhvbGRlcjxUPiBwYXJhbWV0ZXJzIG11c3QgYmUgQFdlYlBhcmFtLk1vZGUuT1VUIG9yIEBXZWJQYXJhbS5Nb2RlLklOT1VUCi1TT0FQQklORElOR19OT19SUENfU1RZTEVfT05fTUVUSE9EUz1SUEMgc3R5bGUgQFNPQVBCaW5kaW5nIGFubm90YXRpb25zIG5vdCBzdXBwb3J0ZWQgb24gbWV0aG9kcwotU09BUEJJTkRJTkdfUlBDX0VOQ09ERURfTk9UX1NVUFBPUlRFRD1SUEMgRW5jb2RlZCBTT0FQIEJpbmRpbmdzIG5vdCBzdXBwb3J0ZWQKLVNPQVBCSU5ESU5HX0RPQ1VNRU5UX0VOQ09ERURfTk9UX1NVUFBPUlRFRD1Eb2N1bWVudCBFbmNvZGVkIFNPQVAgQmluZGluZ3Mgbm90IHN1cHBvcnRlZAotU09BUEJJTkRJTkdfTk9fTUlYRURfQklORElOR1M9TWl4ZWQgUlBDIGFuZCBEb2N1bWVudCBzdHlsZSBvcGVyYXRpb25zIG5vdCBwZXJtaXR0ZWQgaW4gdGhlIHNhbWUgc2VydmljZQotU09BUEJJTkRJTkdfUlBDX05PX0JBUkVfUEFSQU1FVEVSX1NUWUxFPVVzZSBvZiBSUEMgc3R5bGUgcmVxdWlyZXMgdXNlIG9mIFdSQVBQRUQgcGFyYW1ldGVyIHN0eWxlCi1ET0NfQkFSRV9PTkxZX09ORV9OT05fSEVBREVSX0lOX1BBUkFNRVRFUj1Eb2N1bWVudCBsaXRlcmFsIGJhcmUgbWV0aG9kcyBtYXkgaGF2ZSBvbmx5IG9uZSBub24taGVhZGVyIElOIHBhcmFtZXRlcgotRE9DX0JBUkVfTk9OX1ZPSURfUkVUVVJOX05PX0lOT1VUX09VVF9QQVJBTUVURVI9RG9jdW1lbnQgbGl0ZXJhbCBiYXJlIG1ldGhvZHMgdGhhdCBkZWNsYXJlIGEgbm9uLXZvaWQgcmV0dXJuIHZhbHVlIG1heSBub3QgaGF2ZSBhbnkgT1VUIG9yIElOT1VUIHBhcmFtZXRlcnMKLURPQ19CQVJFX1ZPSURfUkVUVVJOX09ORV9JTl9QQVJBTUVURVI9RG9jdW1lbnQgbGl0ZXJhbCBiYXJlIG1ldGhvZHMgdGhhdCBkZWNsYXJlIGEgdm9pZCByZXR1cm4gdmFsdWUgbWF5IGhhdmUgb25seSBvbmUgSU4vSU5PVVQgcGFyYW1ldGVyCi1ET0NfQkFSRV9WT0lEX1JFVFVSTl9PTkVfT1VUX1BBUkFNRVRFUj1Eb2N1bWVudCBsaXRlcmFsIGJhcmUgbWV0aG9kcyB0aGF0IGRlY2xhcmUgYSB2b2lkIHJldHVybiB2YWx1ZSBtYXkgaGF2ZSBvbmx5IG9uZSBPVVQvSU5PVVQgcGFyYW1ldGVyCi1XRUJQQVJBTV9OQU1FX1JFUVVJUkVEX1dIRU5fRE9DX0JBUkVfT1VUX0lOT1VUPVRoZSBAV2ViUGFyYW0gbmFtZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIERvY3VtZW50IEJhcmUgYW5kIHRoZSBtb2RlIGlzIE9VVCBvciBJTk9VVAotT1BFUkFUSU9OX05BTUVTX01VU1RfQkVfVU5JUVVFX0VSUk9SPU9wZXJhdGlvbiBuYW1lcyBtdXN0IGJlIHVuaXF1ZSA6ICcnezB9JycKLVdSQVBQRVJfRkFVTFRfQkVBTl9OQU1FU19NVVNUX0JFX1VOSVFVRT1HZW5lcmF0ZWQgUmVxdWVzdC9SZXNwb25zZSBhbmQgRmF1bHQgYmVhbiBjbGFzc2VzIG11c3QgaGF2ZSB1bmlxdWUgbmFtZXMgd2l0aGluIGEgcGFja2FnZSBhbmQgbXVzdCBub3QgY2xhc2ggd2l0aCBvdGhlciBjbGFzc2VzIGluIHRoYXQgcGFja2FnZSA6ICcnezB9JycKLURPQ19CQVJFX01FVEhPRFNfVU5JUVVFX1hNTF9FTEVNRU5UUz1Eb2N1bWVudCBMaXRlcmFsIEJhcmUgb3BlcmF0aW9ucyBtdXN0IGhhdmUgdW5pcXVlIFhNTCBlbGVtZW50cyBmb3IgdGhlIGlucHV0IGFuZCBvdXRwdXQgbWVzc2FnZXMgYWNyb3NzIGFsbCBvcGVyYXRpb25zIG9uIHRoZSBXZWIgU2VydmljZSA6ICcnezB9JycKLUxPQ0FMX05BTUVfQVRUUklCVVRFU19NVVNUX0JFX1VOSVFVRT1UaGUgd3JhcHBlciBiZWFuIGxvY2FsTmFtZSBhdHRyaWJ1dGVzIG11c3QgYmUgdW5pcXVlIDogJyd7MH0nJwotSU5WQUxJRF9OQU1FX0FUVFJJQlVURT1UaGUgbmFtZSAnJ3swfScnIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycwotV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1VOQUJMRV9UT19MT0NBVEU9VW5hYmxlIHRvIGxvY2F0ZSB3c2RsIGF0IHdzZGxMb2NhdGlvbjogJyd7MH0nJwotV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX05PX1BPUlRfTkFNRT1ObyB3c2RsOnBvcnQgbWF0Y2hpbmcgdGhlIHBvcnROYW1lICcnezB9JycgY2FuIGJlIGZvdW5kIGluIHRoZSBXU0RMICcnezF9JycKLVdFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9OT19TRVJWSUNFX05BTUU9Tm8gd3NkbDpzZXJ2aWNlIG1hdGNoaW5nIHRoZSBzZXJ2aWNlTmFtZSAnJ3swfScnIGNhbiBiZSBmb3VuZCBpbiB0aGUgV1NETCAnJ3sxfScnCi1XRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fTk9fT1BFUlRBVElPTl9OQU1FPU5vIEBXZWJNZXRob2QgbWF0Y2hpbmcgdGhlIHdzZGw6b3BlcmF0aW9uICcnezB9JycgY2FuIGJlIGZvdW5kCi1XRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fV1NETF9PUEVSQVRJT05fT1VUUFVUX01FVEhPRF9PTkVXQVk9VGhlIE1ldGhvZCAnJ3swfScnIGlzIGFubm90YXRlZCBAT25ld2F5IGJ1dCB0aGUgd3NkbDpvcGVyYXRpb24gJyd7MH0nJyBzcGVjaWZpZXMgYSB3c2RsOm91dHB1dCBlbGVtZW50Ci1XRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fU09BUF9CSU5ESU5HX1NUWUxFPVRoZSB3c2RsICcnezB9Jycgc3BlY2lmaWVzIGEgJyd7MX0nJyBTT0FQIGJpbmRpbmcgc3R5bGUgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlICcnezJ9JycgU09BUCBiaW5kaW5nIHN0eWxlIG9mIHRoZSB3ZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbi9TRUkKLVBBUkFNRVRFUl9OQU1FX0NMQVNIPVBhcmFtZXRlciBuYW1lcyBtdXN0IGJlIHVuaXF1ZTogJyd7MH0nJwotR0VORVJBVEVEX1BBUkFNRVRFUl9OQU1FX0NMQVNIPVBhcmFtZXRlciBOYW1lICcnezB9Jycgd2lsbCBjbGFzaCB3aXRoIGEgZ2VuZXJhdGVkIHBhcmFtZXRlciBuYW1lCi1IQU5ETEVSX0NIQUlOX1NPQVBfTUVTU0FHRV9IQU5ETEVSUz1ASGFuZGxlckNoYWluIGFuZCBAU09BUE1lc3NhZ2VIYW5kbGVycyBjYW5ub3QgYmUgY29tYmluZWQKLUhBTkRMRVJfQ0hBSU5fT05fRklFTEQ9VGhlIEBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiBtYXkgb25seSBiZSBzcGVjaWZpZWQgb24gYSBUWVBFLiBUaGUgYW5ub3RhdGlvbiB0YXJnZXQgaW5jbHVkZXMgRklFTEQgZm9yIHVzZSBieSBKQVgtV1MgMi4wCi1IQU5ETEVSX0NIQUlOX09OX01FVEhPRD1UaGUgQEhhbmRsZXJDaGFpbiBhbm5vdGF0aW9uIG1heSBvbmx5IGJlIHNwZWNpZmllZCBvbiBhIFRZUEUuIFRoZSBhbm5vdGF0aW9uIHRhcmdldCBpbmNsdWRlcyBNRVRIT0QgZm9yIHVzZSBieSBKQVgtV1MgMi4wCi1XRUJTRVJWSUNFUkVGU19OQU1FX1JFUVVJUkVEPUVhY2ggQFdlYlNlcnZpY2VSZWYgYW5ub3RhdGlvbiBpbnNpZGUgYSBAV2ViU2VydmljZVJlZnMgbXVzdCBjb250YWluIGEgbmFtZSBlbGVtZW50IHdpdGggYSBub24tZGVmYXVsdCAoIiIpIHZhbHVlCi1XRUJTRVJWSUNFUkVGU19UWVBFX1JFUVVJUkVEPUVhY2ggQFdlYlNlcnZpY2VSZWYgYW5ub3RhdGlvbiBpbnNpZGUgYSBAV2ViU2VydmljZVJlZnMgbXVzdCBjb250YWluIGEgdHlwZSBlbGVtZW50IHdpdGggYSBub24tZGVmYXVsdCAoT2JqZWN0LmNsYXNzKSB2YWx1ZQotV0VCU0VSVklDRVBST1ZJREVSX0RFRkFVTFRfUFVCTElDX0NPTlNUUlVDVE9SPUNsYXNzZXMgYW5ub3RhdGVkIHdpdGggQFdlYlNlcnZpY2VQcm92aWRlciBtdXN0IGhhdmUgYSBkZWZhdWx0IHB1YmxpYyBjb25zdHJ1Y3RvcgotV0VCU0VSVklDRVBST1ZJREVSX0lNUExFTUVOVF9UWVBFRF9QUk9WSURFUl9JTlRFUkZBQ0U9QSBQcm92aWRlciBiYXNlZCBlbmRwb2ludCBpbXBsZW1lbnRhdGlvbiBtdXN0IGltcGxlbWVudCBhIHR5cGVkIGphdmF4LnhtbC53cy5Qcm92aWRlciBpbnRlcmZhY2UuIFByb3ZpZGVyIGltcGxlbWVudGF0aW9ucyB3b3JrIHdpdGggdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBvYmplY3RzOiBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSwgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2UgYW5kIGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZQotV0VCU0VSVklDRVBST1ZJREVSX1NPQVBNRVNTQUdFX1NPQVBCSU5ESU5HPWphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlIG9iamVjdHMgcmVxdWlyZSB0aGUgUHJvdmlkZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlIHRoZSBTT0FQIEJpbmRpbmcKLVdFQlNFUlZJQ0VQUk9WSURFUl9TT0FQTUVTU0FHRV9NRVNTQUdFX01PREU9amF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2Ugb2JqZWN0cyByZXF1aXJlIHRoZSBQcm92aWRlciBpbXBsZW1lbnRhdGlvbiB0byBzcGVjaWZ5IGEgQGphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZSBhbm5vdGF0aW9uIHdpdGggamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZS5NRVNTQUdFIGFzIHRoZSB2YWx1ZSAKLVdFQlNFUlZJQ0VQUk9WSURFUl9EQVRBU09VUkNFX0hUVFBCSU5ESU5HPWphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZSBkZXJpdmVkIG9iamVjdHMgcmVxdWlyZSB0aGUgUHJvdmlkZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlIHRoZSBIVFRQIEJpbmRpbmcKLVdFQlNFUlZJQ0VQUk9WSURFUl9EQVRBU09VUkNFX01FU1NBR0VfTU9ERT1qYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2UgZGVyaXZlZCBvYmplY3RzIHJlcXVpcmUgdGhlIFByb3ZpZGVyIGltcGxlbWVudGF0aW9uIHRvIHNwZWNpZnkgYSBAamF2YXgueG1sLndzLlNlcnZpY2VNb2RlIGFubm90YXRpb24gd2l0aCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlLk1FU1NBR0UgYXMgdGhlIHZhbHVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9KQVhXU0NvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMxMjdmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9KQVhXU0NvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEpBWFdTQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICBwcml2YXRlIHN0YXRpYyBKQVhXU0NvcmVQbHVnaW4gcGx1Z2luOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSkFYV1NDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0gICAgICByZXR1cm4gcGx1Z2luOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKLSAgICAgICAgcGx1Z2luID0gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBsdWdpbiA9IG51bGw7Ci0gICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKHNldmVyaXR5LCBKQVhXU0NvcmVQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBKQVhXU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NDb3JlUGx1Z2luLlBMVUdJTl9JRCwgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9IYW5kbGVyQ2hhaW5SdWxlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9IYW5kbGVyQ2hhaW5SdWxlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzFmZTgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vSGFuZGxlckNoYWluUnVsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IGphdmF4Lmp3cy5IYW5kbGVyQ2hhaW47DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7DQotDQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5GaWVsZERlY2xhcmF0aW9uOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBIYW5kbGVyQ2hhaW5SdWxlcyBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgew0KLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihIYW5kbGVyQ2hhaW4uY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQNCi0gICAgICAgICAgICAgICAgLmdldERlY2xhcmF0aW9uc0Fubm90YXRlZFdpdGgoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsNCi0NCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgew0KLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgew0KLSAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQ0KLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5qd3Muc29hcC5TT0FQTWVzc2FnZUhhbmRsZXJzLmNsYXNzKTsNCi0gICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb25NaXJyb3IgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IoYW5ub3RhdGlvbk1pcnJvci5nZXRQb3NpdGlvbigpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5IQU5ETEVSX0NIQUlOX1NPQVBfTUVTU0FHRV9IQU5ETEVSUyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikgew0KLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5qd3MuSGFuZGxlckNoYWluLmNsYXNzKTsNCi0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcihhbm5vdGF0aW9uTWlycm9yLmdldFBvc2l0aW9uKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSEFORExFUl9DSEFJTl9PTl9GSUVMRCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7DQotICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3IgYW5ub3RhdGlvbk1pcnJvciA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4Lmp3cy5IYW5kbGVyQ2hhaW4uY2xhc3MpOw0KLQ0KLSAgICAgICAgICAgICAgICBwcmludEVycm9yKGFubm90YXRpb25NaXJyb3IuZ2V0UG9zaXRpb24oKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5IQU5ETEVSX0NIQUlOX09OX01FVEhPRCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vSG9sZGVyVHlwZVBhcmFtZXRlcnNSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL0hvbGRlclR5cGVQYXJhbWV0ZXJzUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzhlZDJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vSG9sZGVyVHlwZVBhcmFtZXRlcnNSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLk1PREU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uUGFyYW1ldGVyRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuVHlwZU1pcnJvcjsKLQotcHVibGljIGNsYXNzIEhvbGRlclR5cGVQYXJhbWV0ZXJzUnVsZSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsKLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFdlYlNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldERlY2xhcmF0aW9uc0Fubm90YXRlZFdpdGgoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgdmFsaWRhdGVQYXJhbWV0ZXJzKChUeXBlRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUGFyYW1ldGVycyhUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzID0gdHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKTsKLSAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb248UGFyYW1ldGVyRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBmb3IgKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlciA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICBUeXBlTWlycm9yIHR5cGVNaXJyb3IgPSBlbnZpcm9ubWVudC5nZXRUeXBlVXRpbHMoKS5nZXRFcmFzdXJlKHBhcmFtZXRlci5nZXRUeXBlKCkpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNIb2xkZXJQYXJhbWV0ZXIgPSB0eXBlTWlycm9yLnRvU3RyaW5nKCkuZXF1YWxzKEhvbGRlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmIChpc1dlYlBhcmFtT3V0SW5vdXRNb2RlKHBhcmFtZXRlcikgJiYgIWlzSG9sZGVyUGFyYW1ldGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IocGFyYW1ldGVyLmdldFBvc2l0aW9uKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJQQVJBTV9NT0RFX09VVF9JTk9VVF9IT0xERVJfVFlQRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0hvbGRlclBhcmFtZXRlciAmJiBpc1dlYlBhcmFtSW5Nb2RlKHBhcmFtZXRlcikpewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKHBhcmFtZXRlci5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkhPTERFUl9UWVBFX01VU1RfQkVfT1VUX0lOT1VUKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzV2ViUGFyYW1Jbk1vZGUoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyKSB7Ci0gICAgICAgIFN0cmluZyBtb2RlID0gZ2V0TW9kZShwYXJhbWV0ZXIpOwotICAgICAgICBpZiAobW9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbW9kZS5lcXVhbHMoV2ViUGFyYW0uTW9kZS5JTi50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzV2ViUGFyYW1PdXRJbm91dE1vZGUoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyKSB7Ci0gICAgICAgIFN0cmluZyBtb2RlID0gZ2V0TW9kZShwYXJhbWV0ZXIpOwotICAgICAgICBpZiAobW9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbW9kZS5lcXVhbHMoV2ViUGFyYW0uTW9kZS5PVVQubmFtZSgpKSB8fCBtb2RlLmVxdWFscyhXZWJQYXJhbS5Nb2RlLklOT1VULm5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldE1vZGUoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXIsIFdlYlBhcmFtLmNsYXNzKTsKLSAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUod2ViUGFyYW0sIE1PREUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9PbmV3YXlSdWxlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9PbmV3YXlSdWxlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGU3NjRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vT25ld2F5UnVsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7Ci1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlBhcmFtZXRlckRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuVHlwZU1pcnJvcjsKLQotcHVibGljIGNsYXNzIE9uZXdheVJ1bGVzIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oT25ld2F5LmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7ICAgICAgICAKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgIGlmICghbWV0aG9kRGVjbGFyYXRpb24uZ2V0UmV0dXJuVHlwZSgpLmVxdWFscyhlbnZpcm9ubWVudC5nZXRUeXBlVXRpbHMoKS5nZXRWb2lkVHlwZSgpKSkgewotICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLCBtZXRob2REZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5PTkVXQVlfTk9fUkVUVVJOX1ZBTFVFKTsgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtZXRob2REZWNsYXJhdGlvbi5nZXRUaHJvd25UeXBlcygpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihhbm5vdGF0aW9uRGVjbGFyYXRpb24sIG1ldGhvZERlY2xhcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLk9ORVdBWV9OT19DSEVDS0VEX0VYQ0VQVElPTlMpOyAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hlY2tQYXJhbWV0ZXJzKG1ldGhvZERlY2xhcmF0aW9uLCBhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjaGVja1BhcmFtZXRlcnMoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sCi0gICAgICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbikgewotICAgICAgICBDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpOwotICAgICAgICBmb3IgKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlciA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgIFR5cGVNaXJyb3IgdHlwZU1pcnJvciA9IGVudmlyb25tZW50LmdldFR5cGVVdGlscygpLmdldEVyYXN1cmUocGFyYW1ldGVyLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICBpZiAodHlwZU1pcnJvci50b1N0cmluZygpLmVxdWFscyhIb2xkZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHByaW50RXJyb3IoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLCBtZXRob2REZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLk9ORVdBWV9OT19IT0xERVJfUEFSQU1FVEVSUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9TT0FQQmluZGluZ0RvY3VtZW50QmFyZVJ1bGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1NPQVBCaW5kaW5nRG9jdW1lbnRCYXJlUnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRiYTQzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1NPQVBCaW5kaW5nRG9jdW1lbnRCYXJlUnVsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkhFQURFUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5NT0RFOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlsczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5QYXJhbWV0ZXJEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5UeXBlTWlycm9yOwotCi1wdWJsaWMgY2xhc3MgU09BUEJpbmRpbmdEb2N1bWVudEJhcmVSdWxlcyBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsKLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQKLSAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihTT0FQQmluZGluZy5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotICAgICAgICAKLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgZGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTWlycm9ycygpOwotICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICBpZiAobWlycm9yLmdldEFubm90YXRpb25UeXBlKCkuZ2V0RGVjbGFyYXRpb24oKS5lcXVhbHMoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEpBWFdTVXRpbHMuaXNEb2N1bWVudEJhcmUobWlycm9yKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2REZWNsYXJhdGlvbnMgPSB0eXBlRGVjbGFyYXRpb24uZ2V0TWV0aG9kcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2REZWNsYXJhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01ldGhvZChtZXRob2REZWNsYXJhdGlvbik7ICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgZGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uTWlycm9yIG1pcnJvciA6IGFubm90YXRpb25NaXJyb3JzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaXJyb3IuZ2V0QW5ub3RhdGlvblR5cGUoKS5nZXREZWNsYXJhdGlvbigpLmVxdWFscyhhbm5vdGF0aW9uRGVjbGFyYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSkFYV1NVdGlscy5pc0RvY3VtZW50QmFyZShtaXJyb3IpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01ldGhvZCgoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NNZXRob2QoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgCi0gICAgICAgIC8vQE9uZXdheSBvcGVyYXRpb25zCi0gICAgICAgIGlmIChpc09uZXdheShtZXRob2REZWNsYXJhdGlvbikgJiYgIWlzU2luZ2xlTm9uSGVhZGVySU5QYXJhbWV0ZXIocGFyYW1ldGVycykpIHsKLSAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgCi0gICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfT05MWV9PTkVfTk9OX0hFQURFUl9JTl9QQVJBTUVURVIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoaXNWb2lkUmV0dXJuVHlwZShtZXRob2REZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBpZiAoY291bnRJTlBhcmFtZXRlcnMocGFyYW1ldGVycykgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfVk9JRF9SRVRVUk5fT05FX0lOX1BBUkFNRVRFUik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb3VudE9VVFBhcmFtZXRlcnMocGFyYW1ldGVycykgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfVk9JRF9SRVRVUk5fT05FX09VVF9QQVJBTUVURVIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoY291bnRJTlBhcmFtZXRlcnMocGFyYW1ldGVycykgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5ET0NfQkFSRV9PTkxZX09ORV9OT05fSEVBREVSX0lOX1BBUkFNRVRFUik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICBpZiAoY291bnRPVVRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG1ldGhvZERlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfTk9OX1ZPSURfUkVUVVJOX05PX0lOT1VUX09VVF9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vY2hlY2sgZm9yIEBXZWJQYXJhbS5uYW1lIGF0dHJpYnV0ZSB3aGVuIEBXZWJQYXJhbS5Nb2RlID0gT1VUIG9yIElOT1VUCi0vLyAgICAgICAgZm9yKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgewotLy8gICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgV2ViUGFyYW0uY2xhc3MpOwotLy8gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbk1pcnJvciAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICBTdHJpbmcgbW9kZSA9IGdldFdlYlBhcmFtTW9kZShhbm5vdGF0aW9uTWlycm9yLCBwYXJhbWV0ZXJEZWNsYXJhdGlvbik7Ci0vLyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBOQU1FKTsKLS8vICAgICAgICAgICAgICAgIAotLy8gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCAmJiAobW9kZS5lcXVhbHMoTW9kZS5PVVQubmFtZSgpKSB8fCBtb2RlLmVxdWFscyhNb2RlLklOT1VULm5hbWUoKSkpKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihhbm5vdGF0aW9uTWlycm9yLmdldFBvc2l0aW9uKCksIAotLy8gICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlBBUkFNX05BTUVfUkVRVUlSRURfV0hFTl9ET0NfQkFSRV9PVVRfSU5PVVQpOwotLy8gICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNPbmV3YXkoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBvbmV3YXkgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2REZWNsYXJhdGlvbiwgT25ld2F5LmNsYXNzKTsKLSAgICAgICAgaWYgKG9uZXdheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZvaWRSZXR1cm5UeXBlKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBtZXRob2REZWNsYXJhdGlvbi5nZXRSZXR1cm5UeXBlKCkuZXF1YWxzKGVudmlyb25tZW50LmdldFR5cGVVdGlscygpLmdldFZvaWRUeXBlKCkpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTaW5nbGVOb25IZWFkZXJJTlBhcmFtZXRlcihDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHJldHVybiBjb3VudE5vbkhlYWRlcklOUGFyYW1ldGVycyhwYXJhbWV0ZXJzKSA8PSAxOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBjb3VudE5vbkhlYWRlcklOUGFyYW1ldGVycyhDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIGludCBpbk5vbkhlYWRlclBhcmFtZXRlcnMgPSAwOwotICAgICAgICBmb3IgKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgaWYgKGlzTm9uSGVhZGVySU5QYXJhbWV0ZXIocGFyYW1ldGVyRGVjbGFyYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgaW5Ob25IZWFkZXJQYXJhbWV0ZXJzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluTm9uSGVhZGVyUGFyYW1ldGVyczsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTm9uSGVhZGVySU5QYXJhbWV0ZXIoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJQYXJhbSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHBhcmFtZXRlckRlY2xhcmF0aW9uLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgIGlmICh3ZWJQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0V2ViUGFyYW1Nb2RlKHdlYlBhcmFtLCBwYXJhbWV0ZXJEZWNsYXJhdGlvbikuZXF1YWxzKE1vZGUuSU4ubmFtZSgpKQotICAgICAgICAgICAgICAmJiAhaXNIZWFkZXIod2ViUGFyYW0pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZ2V0RGVmYXVsdFdlYlBhcmFtTW9kZShwYXJhbWV0ZXJEZWNsYXJhdGlvbikuZXF1YWxzKE1vZGUuSU4ubmFtZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgY291bnRJTlBhcmFtZXRlcnMoQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycykgewotICAgICAgICBpbnQgaW5Ob25IZWFkZXJQYXJhbWV0ZXJzID0gMDsKLSAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbiA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgIGlmIChpc0lOUGFyYW1ldGVyKHBhcmFtZXRlckRlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgIGluTm9uSGVhZGVyUGFyYW1ldGVycysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbk5vbkhlYWRlclBhcmFtZXRlcnM7Ci0gICAgfQotIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0lOUGFyYW1ldGVyKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICBpZiAod2ViUGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1vZGUgPSBnZXRXZWJQYXJhbU1vZGUod2ViUGFyYW0sIHBhcmFtZXRlckRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiAobW9kZS5lcXVhbHMoTW9kZS5JTi5uYW1lKCkpIHx8IG1vZGUuZXF1YWxzKE1vZGUuSU5PVVQubmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgIWlzSGVhZGVyKHdlYlBhcmFtKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGRlZmF1bHRNb2RlID0gZ2V0RGVmYXVsdFdlYlBhcmFtTW9kZShwYXJhbWV0ZXJEZWNsYXJhdGlvbik7Ci0gICAgICAgIGlmIChkZWZhdWx0TW9kZS5lcXVhbHMoTW9kZS5JTi5uYW1lKCkpIHx8IGRlZmF1bHRNb2RlLmVxdWFscyhNb2RlLklOT1VULm5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGNvdW50T1VUUGFyYW1ldGVycyhDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIGludCBvdXROb25IZWFkZXJQYXJhbWV0ZXJzID0gMDsKLSAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbiA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgIGlmIChpc09VVFBhcmFtZXRlcihwYXJhbWV0ZXJEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBvdXROb25IZWFkZXJQYXJhbWV0ZXJzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dE5vbkhlYWRlclBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzT1VUUGFyYW1ldGVyKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICBpZiAod2ViUGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1vZGUgPSBnZXRXZWJQYXJhbU1vZGUod2ViUGFyYW0sIHBhcmFtZXRlckRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiAobW9kZS5lcXVhbHMoTW9kZS5PVVQubmFtZSgpKSB8fCBtb2RlLmVxdWFscyhNb2RlLklOT1VULm5hbWUoKSkpCi0gICAgICAgICAgICAgICAgICAgICYmICFpc0hlYWRlcih3ZWJQYXJhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChnZXREZWZhdWx0V2ViUGFyYW1Nb2RlKHBhcmFtZXRlckRlY2xhcmF0aW9uKS5lcXVhbHMoTW9kZS5JTk9VVC5uYW1lKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNIZWFkZXIoQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yKSB7Ci0gICAgICAgIEJvb2xlYW4gaGVhZGVyID0gQW5ub3RhdGlvblV0aWxzLmdldEJvb2xlYW5WYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBIRUFERVIpOwotICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgcmV0dXJuIGhlYWRlci5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldFdlYlBhcmFtTW9kZShBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBtb2RlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKGFubm90YXRpb25NaXJyb3IsIE1PREUpOwotICAgICAgICBpZiAobW9kZSA9PSBudWxsIHx8IG1vZGUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgbW9kZSA9IGdldERlZmF1bHRXZWJQYXJhbU1vZGUocGFyYW1ldGVyRGVjbGFyYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtb2RlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0V2ViUGFyYW1Nb2RlKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIFR5cGVNaXJyb3IgdHlwZU1pcnJvciA9IGVudmlyb25tZW50LmdldFR5cGVVdGlscygpLmdldEVyYXN1cmUocGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0VHlwZSgpKTsKLSAgICAgICAgaWYgKHR5cGVNaXJyb3IudG9TdHJpbmcoKS5lcXVhbHMoSG9sZGVyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBNb2RlLklOT1VULm5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTW9kZS5JTi5uYW1lKCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9TT0FQQmluZGluZ1J1bGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1NPQVBCaW5kaW5nUnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU4NzlkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1NPQVBCaW5kaW5nUnVsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUEFSQU1FVEVSX1NUWUxFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlNUWUxFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlVTRTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgU09BUEJpbmRpbmdSdWxlcyBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsKLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBzb2FwQmluZGluZ0RlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihTT0FQQmluZGluZy5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChzb2FwQmluZGluZ0RlY2xhcmF0aW9uKTsKLQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGNoZWNrRm9yRW5jb2RlZFVzZShkZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBjaGVja0ZvclJQQ0JhcmVPblR5cGVEZWNsYXJhdGlvbigoVHlwZURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tGb3JSUENTdHlsZU9uTWV0aG9kRGVjbGFyYXRpb24oKE1ldGhvZERlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tGb3JSUENCYXJlT25UeXBlRGVjbGFyYXRpb24oVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHNvYXBCaW5kaW5nID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24odHlwZURlY2xhcmF0aW9uLCBTT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIFN0cmluZyBzdHlsZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShzb2FwQmluZGluZywgU1RZTEUpOwotICAgICAgICBpZiAoc3R5bGUgIT0gbnVsbCAmJiBzdHlsZS5lcXVhbHMoU3R5bGUuUlBDLnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyU3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoc29hcEJpbmRpbmcsIFBBUkFNRVRFUl9TVFlMRSk7Ci0gICAgICAgICAgICBpZiAocGFyYW1ldGVyU3R5bGUgIT0gbnVsbCAmJiBwYXJhbWV0ZXJTdHlsZS5lcXVhbHMoUGFyYW1ldGVyU3R5bGUuQkFSRS50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgIHByaW50RXJyb3Ioc29hcEJpbmRpbmcuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuU09BUEJJTkRJTkdfUlBDX05PX0JBUkVfUEFSQU1FVEVSX1NUWUxFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNoZWNrIGZvciBEb2N1bWVudCBzdHlsZSBAU09BUEJpbmRpbmcgb24gbWV0aG9kcwotICAgICAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZERlY2xhcmF0aW9ucyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBzb2FwQmluZGluZzIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2REZWNsYXJhdGlvbiwgU09BUEJpbmRpbmcuY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmIChzb2FwQmluZGluZzIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3R5bGUyID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHNvYXBCaW5kaW5nMiwgU1RZTEUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGUyID09IG51bGwgfHwgc3R5bGUyLmVxdWFscyhTdHlsZS5ET0NVTUVOVC50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihzb2FwQmluZGluZzIuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuU09BUEJJTkRJTkdfTk9fTUlYRURfQklORElOR1MpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRm9yRW5jb2RlZFVzZShEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHNvYXBCaW5kaW5nID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sIFNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgU3RyaW5nIHVzZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShzb2FwQmluZGluZywgVVNFKTsKLSAgICAgICAgaWYgKHVzZSAhPSBudWxsICYmIHVzZS5lcXVhbHMoVXNlLkVOQ09ERUQudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgIFN0cmluZyBzdHlsZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShzb2FwQmluZGluZywgU1RZTEUpOwotICAgICAgICAgICAgaWYgKHN0eWxlID09IG51bGwgfHwgc3R5bGUuZXF1YWxzKFN0eWxlLkRPQ1VNRU5ULnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcihzb2FwQmluZGluZy5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5TT0FQQklORElOR19ET0NVTUVOVF9FTkNPREVEX05PVF9TVVBQT1JURUQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcmludEVycm9yKHNvYXBCaW5kaW5nLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLlNPQVBCSU5ESU5HX1JQQ19FTkNPREVEX05PVF9TVVBQT1JURUQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRm9yUlBDU3R5bGVPbk1ldGhvZERlY2xhcmF0aW9uKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmcgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2REZWNsYXJhdGlvbiwgU09BUEJpbmRpbmcuY2xhc3MpOwotICAgICAgICBTdHJpbmcgc3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoc29hcEJpbmRpbmcsIFNUWUxFKTsKLSAgICAgICAgaWYgKHN0eWxlICE9IG51bGwgJiYgc3R5bGUuZXF1YWxzKFN0eWxlLlJQQy50b1N0cmluZygpKSkgewotICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3Ioc29hcEJpbmRpbmcuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuU09BUEJJTkRJTkdfTk9fUlBDX1NUWUxFX09OX01FVEhPRFMpOwotICAgICAgICB9Ci0gICAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vVW5pcXVlTmFtZXNSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1VuaXF1ZU5hbWVzUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmRiMDVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vVW5pcXVlTmFtZXNSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5DTEFTU19OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkZBVUxUX0JFQU47Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuSEVBREVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkxPQ0FMX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuTU9ERTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLk9QRVJBVElPTl9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlJFU1BPTlNFX1NVRkZJWDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5UQVJHRVRfTkFNRVNQQUNFOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuWE1MQ2hhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25WYWx1ZTsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlBhcmFtZXRlckRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlJlZmVyZW5jZVR5cGU7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5UeXBlTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnV0aWwuU291cmNlUG9zaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBVbmlxdWVOYW1lc1J1bGUgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IgewotICAgIHByaXZhdGUgc3RhdGljIFBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiYXJnXFxkKysiKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gd2ViU2VydmljZURlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKHdlYlNlcnZpY2VEZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgZGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgY2hlY2tPcGVyYXRpb25OYW1lcyh0eXBlRGVjbGFyYXRpb24uZ2V0TWV0aG9kcygpKTsKLSAgICAgICAgICAgICAgICBjaGVja1dyYXBwZXJBbmRGYXVsdEJlYW5OYW1lcyh0eXBlRGVjbGFyYXRpb24uZ2V0TWV0aG9kcygpKTsKLSAgICAgICAgICAgICAgICBjaGVja0RvY3VtZW50QmFyZU1ldGhvZHModHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKSk7Ci0gICAgICAgICAgICAgICAgY2hlY2tNZXRob2RQYXJhbWV0ZXJzKHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjaGVja09wZXJhdGlvbk5hbWVzKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzKSB7Ci0gICAgICAgIE1hcDxEZWNsYXJhdGlvbiwgUU5hbWU+IG5hbWVNYXAgPSBuZXcgSGFzaE1hcDxEZWNsYXJhdGlvbiwgUU5hbWU+KCk7Ci0gICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBuYW1lTWFwLnB1dChtZXRob2REZWNsYXJhdGlvbiwgbmV3IFFOYW1lKGdldFRhcmdldE5hbWVzcGFjZShtZXRob2REZWNsYXJhdGlvbi5nZXREZWNsYXJpbmdUeXBlKCkpLCAKLSAgICAgICAgICAgICAgICAgICAgZ2V0T3BlcmF0aW9uTmFtZShtZXRob2REZWNsYXJhdGlvbikpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgRGVjbGFyYXRpb25bXSBrZXlzID0gbmFtZU1hcC5rZXlTZXQoKS50b0FycmF5KG5ldyBEZWNsYXJhdGlvbltuYW1lTWFwLnNpemUoKV0pOwotICAgICAgICBRTmFtZVtdIHZhbHVlcyA9IG5hbWVNYXAudmFsdWVzKCkudG9BcnJheShuZXcgUU5hbWVbbmFtZU1hcC5zaXplKCldKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSB2YWx1ZXNbaV07Ci0gICAgICAgICAgICB2YWxpZGF0ZU5hbWUocU5hbWUsIGtleXNbaV0pOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgdmFsdWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgb3RoZXJRTmFtZSA9IHZhbHVlc1tqXTsKLSAgICAgICAgICAgICAgICBpZiAocU5hbWUuZXF1YWxzKG90aGVyUU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Ioa2V5c1tpXS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLk9QRVJBVElPTl9OQU1FU19NVVNUX0JFX1VOSVFVRV9FUlJPUiwgcU5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihrZXlzW2pdLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuT1BFUkFUSU9OX05BTUVTX01VU1RfQkVfVU5JUVVFX0VSUk9SLCBvdGhlclFOYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb24sIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3IgYW5ub3RhdGlvbk1pcnJvciA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBhbm5vdGF0aW9uKTsKLSAgICAgICAgaWYgKGFubm90YXRpb25NaXJyb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBhdHRyaWJ1dGVOYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tXcmFwcGVyQW5kRmF1bHRCZWFuTmFtZXMoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZERlY2xhcmF0aW9ucykgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIHJlcXVlc3RXcmFwcGVyRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFJlcXVlc3RXcmFwcGVyLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiByZXNwb3NlV3JhcHBlckRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihSZXNwb25zZVdyYXBwZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBTZXQ8RGVjbGFyYXRpb24+IG1ldGhvZHMgPSBuZXcgSGFzaFNldDxEZWNsYXJhdGlvbj4oKTsKLSAgICAgICAgbWV0aG9kcy5hZGRBbGwoZW52aXJvbm1lbnQuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChyZXF1ZXN0V3JhcHBlckRlY2xhcmF0aW9uKSk7Ci0gICAgICAgIG1ldGhvZHMuYWRkQWxsKGVudmlyb25tZW50LmdldERlY2xhcmF0aW9uc0Fubm90YXRlZFdpdGgocmVzcG9zZVdyYXBwZXJEZWNsYXJhdGlvbikpOwotCi0gICAgICAgIExpc3Q8QW5ub3RhdGlvblZhbHVlPiBjbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uVmFsdWU+KCk7Ci0gICAgICAgIE1hcDxPYmplY3QsIFFOYW1lPiBxTmFtZXMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIFFOYW1lPigpOwotCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHJlcXVlc3RXcmFwcGVyID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sIFJlcXVlc3RXcmFwcGVyLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0V3JhcHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHJlcXVlc3RXcmFwcGVyLCBDTEFTU19OQU1FLCBjbGFzc05hbWVzKTsKLSAgICAgICAgICAgICAgICBhZGRMb2NhbE5hbWUocmVxdWVzdFdyYXBwZXIsIExPQ0FMX05BTUUsIGRlY2xhcmF0aW9uLCBxTmFtZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHJlc3BvbnNlV3JhcHBlciA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBSZXNwb25zZVdyYXBwZXIuY2xhc3MpOwotICAgICAgICAgICAgaWYgKHJlc3BvbnNlV3JhcHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHJlc3BvbnNlV3JhcHBlciwgQ0xBU1NfTkFNRSwgY2xhc3NOYW1lcyk7Ci0gICAgICAgICAgICAgICAgYWRkTG9jYWxOYW1lKHJlc3BvbnNlV3JhcHBlciwgTE9DQUxfTkFNRSwgZGVjbGFyYXRpb24sIHFOYW1lcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFNldDxSZWZlcmVuY2VUeXBlPiB0aHJvd25UeXBlcyA9IG5ldyBIYXNoU2V0PFJlZmVyZW5jZVR5cGU+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICB0aHJvd25UeXBlcy5hZGRBbGwobWV0aG9kRGVjbGFyYXRpb24uZ2V0VGhyb3duVHlwZXMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKFJlZmVyZW5jZVR5cGUgcmVmZXJlbmNlVHlwZSA6IHRocm93blR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAocmVmZXJlbmNlVHlwZSBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24gPSAoQ2xhc3NEZWNsYXJhdGlvbikgcmVmZXJlbmNlVHlwZTsKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYkZhdWx0ID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oY2xhc3NEZWNsYXJhdGlvbiwgV2ViRmF1bHQuY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmICh3ZWJGYXVsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHdlYkZhdWx0LCBGQVVMVF9CRUFOLCBjbGFzc05hbWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzTmFtZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEFubm90YXRpb25WYWx1ZSBjbGFzc05hbWUgPSBjbGFzc05hbWVzLmdldChpKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IGNsYXNzTmFtZXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgb3RoZXJDbGFzc05hbWUgPSBjbGFzc05hbWVzLmdldChqKTsKLSAgICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lLmdldFZhbHVlKCkudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKG90aGVyQ2xhc3NOYW1lLmdldFZhbHVlKCkudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihjbGFzc05hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XUkFQUEVSX0ZBVUxUX0JFQU5fTkFNRVNfTVVTVF9CRV9VTklRVUUsIGNsYXNzTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG90aGVyQ2xhc3NOYW1lLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV1JBUFBFUl9GQVVMVF9CRUFOX05BTUVTX01VU1RfQkVfVU5JUVVFLCBvdGhlckNsYXNzTmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdmFsaWRhdGVRTmFtZXMocU5hbWVzLCBKQVhXU0NvcmVNZXNzYWdlcy5MT0NBTF9OQU1FX0FUVFJJQlVURVNfTVVTVF9CRV9VTklRVUUpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVRTmFtZXMoTWFwPE9iamVjdCwgUU5hbWU+IHFOYW1lcywgU3RyaW5nIGVycm9yTWVzc2FnZSkgewotICAgICAgICBPYmplY3RbXSBrZXlzID0gIHFOYW1lcy5rZXlTZXQoKS50b0FycmF5KG5ldyBPYmplY3RbcU5hbWVzLnNpemUoKV0pOwotICAgICAgICBRTmFtZVtdIHZhbHVlcyA9IHFOYW1lcy52YWx1ZXMoKS50b0FycmF5KG5ldyBRTmFtZVtxTmFtZXMuc2l6ZSgpXSk7Ci0gICAgICAgCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gdmFsdWVzW2ldOwotICAgICAgICAgICAgdmFsaWRhdGVOYW1lKHFOYW1lLCBrZXlzW2ldKTsKLSAgICAgICAgICAgIGZvcihpbnQgaiA9IGkgKyAxOyBqIDwgdmFsdWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgb3RoZXJRTmFtZSA9IHZhbHVlc1tqXTsKLSAgICAgICAgICAgICAgICBpZiAocU5hbWUuZXF1YWxzKG90aGVyUU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IoZ2V0UG9zaXRpb24oa2V5c1tpXSksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoZXJyb3JNZXNzYWdlLCBxTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGdldFBvc2l0aW9uKGtleXNbal0pLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKGVycm9yTWVzc2FnZSwgb3RoZXJRTmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgYWRkQ2xhc3NOYW1lKEFubm90YXRpb25NaXJyb3IgYW5ub3RhdGlvbk1pcnJvciwgU3RyaW5nIGF0dHJpYnV0ZUtleSwKLSAgICAgICAgICAgIExpc3Q8QW5ub3RhdGlvblZhbHVlPiBjbGFzc05hbWVzKSB7Ci0gICAgICAgIEFubm90YXRpb25WYWx1ZSBjbGFzc05hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKGFubm90YXRpb25NaXJyb3IsIGF0dHJpYnV0ZUtleSk7Ci0gICAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgY2xhc3NOYW1lcy5hZGQoY2xhc3NOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRMb2NhbE5hbWUoQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yLCBTdHJpbmcgYXR0cmlidXRlS2V5LCAKLSAgICAgICAgICAgIERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBNYXA8T2JqZWN0LCBRTmFtZT4gcU5hbWVzKSB7Ci0gICAgICAgIEFubm90YXRpb25WYWx1ZSBsb2NhbE5hbWVWYWx1ZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUoYW5ub3RhdGlvbk1pcnJvciwgYXR0cmlidXRlS2V5KTsKLSAgICAgICAgaWYgKGxvY2FsTmFtZVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHFOYW1lcy5wdXQobG9jYWxOYW1lVmFsdWUsIG5ldyBRTmFtZShnZXRUYXJnZXROYW1lc3BhY2UoYW5ub3RhdGlvbk1pcnJvciwgCi0gICAgICAgICAgICAgICAgICAgIChNZXRob2REZWNsYXJhdGlvbilkZWNsYXJhdGlvbiksIGxvY2FsTmFtZVZhbHVlLmdldFZhbHVlKCkudG9TdHJpbmcoKSkpOwotICAgICAgICB9ICAgIAotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0RvY3VtZW50QmFyZU1ldGhvZHMoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZHMpIHsKLSAgICAgICAgTGlzdDxNZXRob2REZWNsYXJhdGlvbj4gZG9jQmFyZU1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZERlY2xhcmF0aW9uPigpOwotICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kcykgewotICAgICAgICAgICAgaWYgKGhhc0RvY3VtZW50QmFyZVNPQVBCaW5kaW5nKG1ldGhvZERlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgIGRvY0JhcmVNZXRob2RzLmFkZChtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIE1hcDxPYmplY3QsIFFOYW1lPiBxTmFtZXMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIFFOYW1lPigpOwotICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogZG9jQmFyZU1ldGhvZHMpIHsKLSAgICAgICAgICAgIGdldERvY3VtZW50QmFyZU9wZXJhdGlvblJlcXVlc3QobWV0aG9kRGVjbGFyYXRpb24sIHFOYW1lcyk7Ci0gICAgICAgICAgICBnZXREb2N1bWVudEJhcmVPcGVyYXRpb25SZXNwb25zZShtZXRob2REZWNsYXJhdGlvbiwgcU5hbWVzKTsgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdmFsaWRhdGVRTmFtZXMocU5hbWVzLCBKQVhXU0NvcmVNZXNzYWdlcy5ET0NfQkFSRV9NRVRIT0RTX1VOSVFVRV9YTUxfRUxFTUVOVFMpOwotICAgIH0KLQotICAgIHByaXZhdGUgU291cmNlUG9zaXRpb24gZ2V0UG9zaXRpb24oT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFubm90YXRpb25WYWx1ZSkgewotICAgICAgICAgICAgcmV0dXJuICgoQW5ub3RhdGlvblZhbHVlKSB2YWx1ZSkuZ2V0UG9zaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgcmV0dXJuICgoTWV0aG9kRGVjbGFyYXRpb24pIHZhbHVlKS5nZXRQb3NpdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFBhcmFtZXRlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChQYXJhbWV0ZXJEZWNsYXJhdGlvbikgdmFsdWUpLmdldFBvc2l0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU5hbWUoUU5hbWUgcU5hbWUsIE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBxTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgaWYgKG5hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgaWYgKCFYTUxDaGFyLmlzVmFsaWROQ05hbWUobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBwcmludEVycm9yKGdldFBvc2l0aW9uKG9iamVjdCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5JTlZBTElEX05BTUVfQVRUUklCVVRFLCBuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVOYW1lKEFubm90YXRpb25WYWx1ZSB2YWx1ZSkgewotICAgICAgICBTdHJpbmcgbmFtZSA9IHZhbHVlLmdldFZhbHVlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgaWYgKG5hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgaWYgKCFYTUxDaGFyLmlzVmFsaWROQ05hbWUobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBwcmludEVycm9yKHZhbHVlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5JTlZBTElEX05BTUVfQVRUUklCVVRFLCBuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2V0RG9jdW1lbnRCYXJlT3BlcmF0aW9uUmVxdWVzdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgTWFwPE9iamVjdCwgUU5hbWU+IHFOYW1lcykgewotICAgICAgICBDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpOwotICAgICAgICBmb3IgKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJQYXJhbSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHBhcmFtZXRlckRlY2xhcmF0aW9uLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAod2ViUGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtb2RlID0gZ2V0V2ViUGFyYW1Nb2RlKHdlYlBhcmFtLCBwYXJhbWV0ZXJEZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKG1vZGUuZXF1YWxzKE1vZGUuSU4ubmFtZSgpKSB8fCBtb2RlLmVxdWFscyhNb2RlLklOT1VULm5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0T3BlcmF0aW9uUmVxdWVzdCh3ZWJQYXJhbSwgbWV0aG9kRGVjbGFyYXRpb24sIHBhcmFtZXRlckRlY2xhcmF0aW9uLCBxTmFtZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcU5hbWVzLnB1dChwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgZ2V0T3BlcmF0aW9uUmVxdWVzdERlZmF1bHQobWV0aG9kRGVjbGFyYXRpb24pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZ2V0T3BlcmF0aW9uUmVxdWVzdChBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLAotICAgICAgICAgICAgUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24sIE1hcDxPYmplY3QsIFFOYW1lPiBxTmFtZXMpIHsKLSAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKGFubm90YXRpb25NaXJyb3IsIE5BTUUpOwotICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBRTmFtZSBxTmFtZSA9IG5ldyBRTmFtZShnZXRUYXJnZXROYW1lc3BhY2UoYW5ub3RhdGlvbk1pcnJvciwgbWV0aG9kRGVjbGFyYXRpb24pLCBuYW1lLmdldFZhbHVlKCkKLSAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcU5hbWVzLnB1dChuYW1lLCBxTmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBxTmFtZXMucHV0KHBhcmFtZXRlckRlY2xhcmF0aW9uLCBnZXRPcGVyYXRpb25SZXF1ZXN0RGVmYXVsdChtZXRob2REZWNsYXJhdGlvbikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBRTmFtZSBnZXRPcGVyYXRpb25SZXF1ZXN0RGVmYXVsdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICByZXR1cm4gbmV3IFFOYW1lKGdldFRhcmdldE5hbWVzcGFjZShtZXRob2REZWNsYXJhdGlvbi5nZXREZWNsYXJpbmdUeXBlKCkpLCBtZXRob2REZWNsYXJhdGlvbgotICAgICAgICAgICAgICAgIC5nZXRTaW1wbGVOYW1lKCkpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZ2V0RG9jdW1lbnRCYXJlT3BlcmF0aW9uUmVzcG9uc2UoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIE1hcDxPYmplY3QsIFFOYW1lPiBxTmFtZXMpIHsKLSAgICAgICAgaWYgKCFyZXR1cm5zVm9pZChtZXRob2REZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgIGdldE9wZXJhdGlvblJlc3BvbnNlKEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZERlY2xhcmF0aW9uLCBXZWJSZXN1bHQuY2xhc3MpLAotICAgICAgICAgICAgICAgICAgICBtZXRob2REZWNsYXJhdGlvbiwgcU5hbWVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb248UGFyYW1ldGVyRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBmb3IgKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmICh3ZWJQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtb2RlID0gZ2V0V2ViUGFyYW1Nb2RlKHdlYlBhcmFtLCBwYXJhbWV0ZXJEZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtb2RlLmVxdWFscyhNb2RlLk9VVC5uYW1lKCkpIHx8IG1vZGUuZXF1YWxzKE1vZGUuSU5PVVQubmFtZSgpKSAmJiAhaXNIZWFkZXIod2ViUGFyYW0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRPcGVyYXRpb25SZXNwb25zZSh3ZWJQYXJhbSwgbWV0aG9kRGVjbGFyYXRpb24sIHFOYW1lcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0RGVmYXVsdFdlYlBhcmFtTW9kZShwYXJhbWV0ZXJEZWNsYXJhdGlvbikuZXF1YWxzKE1vZGUuSU5PVVQubmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBxTmFtZXMucHV0KHBhcmFtZXRlckRlY2xhcmF0aW9uLCBnZXRPcGVyYXRpb25SZXNwb25zZURlZmF1bHQobWV0aG9kRGVjbGFyYXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBnZXRPcGVyYXRpb25SZXNwb25zZShBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLAotICAgICAgICAgICAgTWFwPE9iamVjdCwgUU5hbWU+IHFOYW1lcykgewotICAgICAgICBpZiAoYW5ub3RhdGlvbk1pcnJvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgbmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUoYW5ub3RhdGlvbk1pcnJvciwgTkFNRSk7Ci0gICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcU5hbWVzLnB1dChuYW1lLCBuZXcgUU5hbWUoZ2V0VGFyZ2V0TmFtZXNwYWNlKGFubm90YXRpb25NaXJyb3IsIG1ldGhvZERlY2xhcmF0aW9uKSwgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbHVlKCkudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBxTmFtZXMucHV0KG1ldGhvZERlY2xhcmF0aW9uLCBnZXRPcGVyYXRpb25SZXNwb25zZURlZmF1bHQobWV0aG9kRGVjbGFyYXRpb24pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHFOYW1lcy5wdXQobWV0aG9kRGVjbGFyYXRpb24sIGdldE9wZXJhdGlvblJlc3BvbnNlRGVmYXVsdChtZXRob2REZWNsYXJhdGlvbikpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgUU5hbWUgZ2V0T3BlcmF0aW9uUmVzcG9uc2VEZWZhdWx0KE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUoZ2V0VGFyZ2V0TmFtZXNwYWNlKG1ldGhvZERlY2xhcmF0aW9uLmdldERlY2xhcmluZ1R5cGUoKSksIG1ldGhvZERlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgLmdldFNpbXBsZU5hbWUoKQotICAgICAgICAgICAgICAgICsgUkVTUE9OU0VfU1VGRklYKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNIZWFkZXIoQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yKSB7Ci0gICAgICAgIEJvb2xlYW4gaGVhZGVyID0gQW5ub3RhdGlvblV0aWxzLmdldEJvb2xlYW5WYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBIRUFERVIpOwotICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgcmV0dXJuIGhlYWRlci5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldFdlYlBhcmFtTW9kZShBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBtb2RlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKGFubm90YXRpb25NaXJyb3IsIE1PREUpOwotICAgICAgICBpZiAobW9kZSA9PSBudWxsIHx8IG1vZGUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgbW9kZSA9IGdldERlZmF1bHRXZWJQYXJhbU1vZGUocGFyYW1ldGVyRGVjbGFyYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtb2RlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0V2ViUGFyYW1Nb2RlKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIFR5cGVNaXJyb3IgdHlwZU1pcnJvciA9IGVudmlyb25tZW50LmdldFR5cGVVdGlscygpLmdldEVyYXN1cmUocGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0VHlwZSgpKTsKLSAgICAgICAgaWYgKHR5cGVNaXJyb3IudG9TdHJpbmcoKS5lcXVhbHMoSG9sZGVyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBNb2RlLklOT1VULm5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTW9kZS5JTi5uYW1lKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHJldHVybnNWb2lkKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBtZXRob2REZWNsYXJhdGlvbi5nZXRSZXR1cm5UeXBlKCkuZXF1YWxzKGVudmlyb25tZW50LmdldFR5cGVVdGlscygpLmdldFZvaWRUeXBlKCkpOyAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrTWV0aG9kUGFyYW1ldGVycyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgIExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZERlY2xhcmF0aW9uPigpOwotICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICAvL05vdCBEb2MgQmFyZQotICAgICAgICAgICAgaWYgKCFoYXNEb2N1bWVudEJhcmVTT0FQQmluZGluZyhtZXRob2REZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBtZXRob2RzLmFkZChtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBMaXN0PEFubm90YXRpb25WYWx1ZT4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb25WYWx1ZT4oKTsKLSAgICAgICAgICAgIExpc3Q8UGFyYW1ldGVyRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSAoTGlzdDxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4pIG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24gOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJQYXJhbSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHBhcmFtZXRlckRlY2xhcmF0aW9uLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKHdlYlBhcmFtLCBOQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZvckdlbmVyYXRlZE5hbWVDbGFzaChuYW1lLCBwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgcGFyYW1ldGVycyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgbmFtZSA9IG5hbWVzLmdldChpKTsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZU5hbWUobmFtZSk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgbmFtZXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG90aGVyTmFtZSA9IG5hbWVzLmdldChqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUudG9TdHJpbmcoKS5lcXVhbHMob3RoZXJOYW1lLnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG5hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuUEFSQU1FVEVSX05BTUVfQ0xBU0gsIG5hbWUuZ2V0VmFsdWUoKS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG90aGVyTmFtZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5QQVJBTUVURVJfTkFNRV9DTEFTSCwgb3RoZXJOYW1lLmdldFZhbHVlKCkudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RGb3JHZW5lcmF0ZWROYW1lQ2xhc2goQW5ub3RhdGlvblZhbHVlIHdlYlBhcmFtTmFtZSwgUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyLAotICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycykgewotICAgICAgICBTdHJpbmcgbmFtZSA9IHdlYlBhcmFtTmFtZS50b1N0cmluZygpOwotICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobmFtZSk7Ci0gICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgaW50IGFyZ04gPSBJbnRlZ2VyLnBhcnNlSW50KG5hbWUuc3Vic3RyaW5nKDMpKTsKLSAgICAgICAgICAgIGlmIChhcmdOICE9IHBhcmFtZXRlcnMuaW5kZXhPZihwYXJhbWV0ZXIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZ04gPCBwYXJhbWV0ZXJzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJOID0gcGFyYW1ldGVycy5nZXQoYXJnTik7Ci0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW1OID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyTiwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBpZiAod2ViUGFyYW1OICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25WYWx1ZSB3ZWJQYXJhbU5hbWVOID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZSh3ZWJQYXJhbU4sIE5BTUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdlYlBhcmFtTmFtZU4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IocGFyYW1ldGVyTi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuR0VORVJBVEVEX1BBUkFNRVRFUl9OQU1FX0NMQVNILCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJQYXJhbU5hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkdFTkVSQVRFRF9QQVJBTUVURVJfTkFNRV9DTEFTSCwgbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3ZWJQYXJhbU5hbWVOLnRvU3RyaW5nKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Iod2ViUGFyYW1OYW1lTi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuR0VORVJBVEVEX1BBUkFNRVRFUl9OQU1FX0NMQVNILCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJQYXJhbU5hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkdFTkVSQVRFRF9QQVJBTUVURVJfTkFNRV9DTEFTSCwgbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihwYXJhbWV0ZXJOLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkdFTkVSQVRFRF9QQVJBTUVURVJfTkFNRV9DTEFTSCwgbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJQYXJhbU5hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuR0VORVJBVEVEX1BBUkFNRVRFUl9OQU1FX0NMQVNILCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGdldEF0dHJpYnV0ZVZhbHVlKHR5cGVEZWNsYXJhdGlvbiwgV2ViU2VydmljZS5jbGFzcywgVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIEpEVFV0aWxzLmdldFRhcmdldE5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZSh0eXBlRGVjbGFyYXRpb24uZ2V0UGFja2FnZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZShBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbk1pcnJvciwgVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gZ2V0VGFyZ2V0TmFtZXNwYWNlKG1ldGhvZERlY2xhcmF0aW9uLmdldERlY2xhcmluZ1R5cGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRPcGVyYXRpb25OYW1lKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gZ2V0QXR0cmlidXRlVmFsdWUobWV0aG9kRGVjbGFyYXRpb24sIFdlYk1ldGhvZC5jbGFzcywgT1BFUkFUSU9OX05BTUUpOwotICAgICAgICBpZiAob3BlcmF0aW9uTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uTmFtZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWV0aG9kRGVjbGFyYXRpb24uZ2V0U2ltcGxlTmFtZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNEb2N1bWVudEJhcmVTT0FQQmluZGluZyhEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHNvYXBCaW5kaW5nID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sIFNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgaWYgKHNvYXBCaW5kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBKQVhXU1V0aWxzLmlzRG9jdW1lbnRCYXJlKHNvYXBCaW5kaW5nKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uOwotICAgICAgICAgICAgcmV0dXJuIGhhc0RvY3VtZW50QmFyZVNPQVBCaW5kaW5nKG1ldGhvZERlY2xhcmF0aW9uLmdldERlY2xhcmluZ1R5cGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYk1ldGhvZENoZWNrRm9yV2ViU2VydmljZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzUzNDIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJNZXRob2RDaGVja0ZvcldlYlNlcnZpY2VSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViTWV0aG9kLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPEFubm90YXRpb25NaXJyb3I+IGFubm90YXRpb25NaXJyb3JzID0gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk1pcnJvcnMoKTsKLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgIGlmIChtaXJyb3IuZ2V0QW5ub3RhdGlvblR5cGUoKS5nZXREZWNsYXJhdGlvbigpLmVxdWFscyhhbm5vdGF0aW9uRGVjbGFyYXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAhY2hlY2tGb3JXZWJTZXJ2aWNlQW5ub3RhdGlvbigoKE1ldGhvZERlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbikuZ2V0RGVjbGFyaW5nVHlwZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihtaXJyb3IuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfT05MWV9TVVBQT1JURURfT05fQ0xBU1NFU19XSVRIX1dFQlNFUlZJQ0UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tGb3JXZWJTZXJ2aWNlQW5ub3RhdGlvbihUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlRGVjbGFyYXRpb24sIFdlYlNlcnZpY2UuY2xhc3MpICE9IG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJNZXRob2RFeGNsdWRlUnVsZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViTWV0aG9kRXhjbHVkZVJ1bGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNjkyM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJNZXRob2RFeGNsdWRlUnVsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuRVhDTFVERTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25WYWx1ZTsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkludGVyZmFjZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFdlYk1ldGhvZEV4Y2x1ZGVSdWxlcyBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViTWV0aG9kLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKAotICAgICAgICAgICAgICAgIGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPEFubm90YXRpb25NaXJyb3I+IGFubm90YXRpb25NaXJyb3JzID0gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk1pcnJvcnMoKTsKLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yIDogYW5ub3RhdGlvbk1pcnJvcnMpIHsKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgZXhjbHVkZUF0dHJpYnV0ZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUoYW5ub3RhdGlvbk1pcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0xVREUpOwotICAgICAgICAgICAgICAgIGlmIChleGNsdWRlQXR0cmlidXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0RGVjbGFyaW5nVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChCb29sZWFuKSBleGNsdWRlQXR0cmlidXRlLmdldFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihleGNsdWRlQXR0cmlidXRlLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9FWENMVURFX05PVF9BTExPV0VEX09OX1NFSSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhbm5vdGF0aW9uTWlycm9yLmdldEVsZW1lbnRWYWx1ZXMoKS5zaXplKCkgPiAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgQm9vbGVhbi52YWx1ZU9mKGV4Y2x1ZGVBdHRyaWJ1dGUuZ2V0VmFsdWUoKS50b1N0cmluZygpKS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IoZXhjbHVkZUF0dHJpYnV0ZS5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfRVhDTFVERV9TUEVDSUZJRURfTk9fT1RIRVJfQVRUUklCVVRFU19BTExPV0VEKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MjAxMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1vZGlmaWVyOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQkKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViTWV0aG9kLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKAotICAgICAgICAgICAgICAgIGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kRGVjbGFyYXRpb24uZ2V0RGVjbGFyaW5nVHlwZSgpIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPE1vZGlmaWVyPiBtb2RpZmllcnMgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuUFVCTElDKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9PTkxZX09OX1BVQkxJQ19NRVRIT0RTKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuRklOQUwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihtZXRob2REZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfTk9fRklOQUxfTU9ESUZJRVJfQUxMT1dFRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuU1RBVElDKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX05PX1NUQVRJQ19NT0RJRklFUl9BTExPV0VEKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlRGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlRGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDFhNzZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZURlZmF1bHRQdWJsaWNDb25zdHJ1Y3RvclJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQ2xhc3NEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1vZGlmaWVyOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZURlZmF1bHRQdWJsaWNDb25zdHJ1Y3RvclJ1bGUgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsKLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFdlYlNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldERlY2xhcmF0aW9uc0Fubm90YXRlZFdpdGgoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGhhc0RlZmF1bHRDb25zdHJ1Y3RvciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiA9IChDbGFzc0RlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPENvbnN0cnVjdG9yRGVjbGFyYXRpb24+IGNvbnN0cnVjdG9ycyA9IGNsYXNzRGVjbGFyYXRpb24uZ2V0Q29uc3RydWN0b3JzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9ycy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBoYXNEZWZhdWx0Q29uc3RydWN0b3IgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uIDogY29uc3RydWN0b3JzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5QVUJMSUMpICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKS5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0RlZmF1bHRDb25zdHJ1Y3RvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFoYXNEZWZhdWx0Q29uc3RydWN0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBtaXJyb3IuZ2V0QW5ub3RhdGlvblR5cGUoKS50b1N0cmluZygpLmVxdWFscyhhbm5vdGF0aW9uRGVjbGFyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihkZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9ERUZBVUxUX1BVQkxJQ19DT05TVFJVQ1RPUik7IAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlTm9GaW5hbGl6ZU1ldGhvZFJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZU5vRmluYWxpemVNZXRob2RSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNGJkMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlTm9GaW5hbGl6ZU1ldGhvZFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuRklOQUxJWkU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZU5vRmluYWxpemVNZXRob2RSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBmaW5hbGl6ZU1ldGhvZCA9IGdldEZpbmFsaXplTWV0aG9kKGRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgIGlmIChmaW5hbGl6ZU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IoZmluYWxpemVNZXRob2QuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9PVkVSUklERV9GSU5BTElaRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE1ldGhvZERlY2xhcmF0aW9uIGdldEZpbmFsaXplTWV0aG9kKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pZGVjbGFyYXRpb247Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kRGVjbGFyYXRpb25zID0gdHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2REZWNsYXJhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kRGVjbGFyYXRpb24uZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyhGSU5BTElaRSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZERlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VQcm92aWRlclJ1bGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VQcm92aWRlclJ1bGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NzVhMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlUHJvdmlkZXJSdWxlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuVkFMVUU7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZU1vZGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlLk1vZGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsNCi0NCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQ2xhc3NEZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkludGVyZmFjZURlY2xhcmF0aW9uOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Nb2RpZmllcjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5JbnRlcmZhY2VUeXBlOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlR5cGVNaXJyb3I7DQotDQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VQcm92aWRlclJ1bGVzIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsNCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7DQotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudA0KLSAgICAgICAgICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFdlYlNlcnZpY2VQcm92aWRlci5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7DQotDQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsNCi0gICAgICAgIAlpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICAJCWNoZWNrRm9yRGVmYXVsdENvbnN0cnVjdG9yKChDbGFzc0RlY2xhcmF0aW9uKWRlY2xhcmF0aW9uKTsNCi0gICAgICAgIAkJY2hlY2tGb3JQcm92aWRlckludGVyZmFjZSgoQ2xhc3NEZWNsYXJhdGlvbilkZWNsYXJhdGlvbik7DQotICAgICAgICAJfQ0KLSAgICAgICAgfQ0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgY2hlY2tGb3JQcm92aWRlckludGVyZmFjZShDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgIENvbGxlY3Rpb248SW50ZXJmYWNlVHlwZT4gaW50ZXJmYWNlcyA9IGNsYXNzRGVjbGFyYXRpb24uZ2V0U3VwZXJpbnRlcmZhY2VzKCk7DQotICAgICAgICBib29sZWFuIGltcGxlbWVudHNUeXBlZFByb3ZpZGVyID0gZmFsc2U7DQotICAgICAgICBpZiAoaW50ZXJmYWNlcy5zaXplKCkgPiAwKSB7DQotICAgICAgICAgICAgZm9yIChJbnRlcmZhY2VUeXBlIGludGVyZmFjZVR5cGUgOiBpbnRlcmZhY2VzKSB7DQotICAgICAgICAgICAgICAgIENvbGxlY3Rpb248VHlwZU1pcnJvcj4gdHlwZVBhcmFtZXRlcnMgPSBpbnRlcmZhY2VUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHR5cGVQYXJhbWV0ZXJzLnNpemUoKSA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoVHlwZU1pcnJvciB0eXBlTWlycm9yIDogdHlwZVBhcmFtZXRlcnMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZU1pcnJvciBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2wgPSAoQ2xhc3NEZWNsYXJhdGlvbikgdHlwZU1pcnJvcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzRGVjbC5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKFNPQVBNZXNzYWdlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrU09BUE1lc3NhZ2VSZXF1aXJlbWVudHMoY2xhc3NEZWNsYXJhdGlvbik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzVHlwZWRQcm92aWRlciA9IHRydWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPEludGVyZmFjZVR5cGU+IGltcGxlbWVudGVkSW50ZXJmYWNlcyA9IGNsYXNzRGVjbC5nZXRTdXBlcmludGVyZmFjZXMoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJbnRlcmZhY2VUeXBlIGltcGxlbWVudGVkSW50ZXJmYWNlIDogaW1wbGVtZW50ZWRJbnRlcmZhY2VzKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2VEZWNsYXJhdGlvbiBpbnRlcmZhY2VEZWNsID0gaW1wbGVtZW50ZWRJbnRlcmZhY2UuZ2V0RGVjbGFyYXRpb24oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcmZhY2VEZWNsICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKFNvdXJjZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHNUeXBlZFByb3ZpZGVyID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcmZhY2VEZWNsLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoRGF0YVNvdXJjZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrRGF0YVNvdXJjZVJlcXVpcmVtZW50cyhjbGFzc0RlY2xhcmF0aW9uKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50c1R5cGVkUHJvdmlkZXIgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVNaXJyb3IgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2VEZWNsYXJhdGlvbiBpbnRlcmZhY2VEZWNsID0gKEludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlTWlycm9yOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKFNvdXJjZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzVHlwZWRQcm92aWRlciA9IHRydWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKERhdGFTb3VyY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tEYXRhU291cmNlUmVxdWlyZW1lbnRzKGNsYXNzRGVjbGFyYXRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50c1R5cGVkUHJvdmlkZXIgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWltcGxlbWVudHNUeXBlZFByb3ZpZGVyKSB7DQotICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlUHJvdmlkZXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihjbGFzc0RlY2xhcmF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZVByb3ZpZGVyLmNsYXNzKTsNCi0gICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3Iod2ViU2VydmljZVByb3ZpZGVyLmdldFBvc2l0aW9uKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRVBST1ZJREVSX0lNUExFTUVOVF9UWVBFRF9QUk9WSURFUl9JTlRFUkZBQ0UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotCQ0KLQlwcml2YXRlIHZvaWQgY2hlY2tTT0FQTWVzc2FnZVJlcXVpcmVtZW50cyhDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgIGlmICghaXNTT0FQQmluZGluZyhjbGFzc0RlY2xhcmF0aW9uKSkgew0KLSAgICAgICAgICAgIHByaW50RXJyb3IoY2xhc3NEZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFUFJPVklERVJfU09BUE1FU1NBR0VfU09BUEJJTkRJTkcpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFpc01lc3NhZ2VNb2RlKGNsYXNzRGVjbGFyYXRpb24pKSB7DQotICAgICAgICAgICAgcHJpbnRFcnJvcihjbGFzc0RlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VQUk9WSURFUl9TT0FQTUVTU0FHRV9NRVNTQUdFX01PREUpOw0KLSAgICAgICAgfQ0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgY2hlY2tEYXRhU291cmNlUmVxdWlyZW1lbnRzKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgew0KLSAgICAgICAgaWYgKCFpc0hUVFBCaW5kaW5nKGNsYXNzRGVjbGFyYXRpb24pKSB7DQotICAgICAgICAgICAgcHJpbnRFcnJvcihjbGFzc0RlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VQUk9WSURFUl9EQVRBU09VUkNFX0hUVFBCSU5ESU5HKTsNCi0gICAgICAgIH0NCi0NCi0JICAgIGlmICghaXNNZXNzYWdlTW9kZShjbGFzc0RlY2xhcmF0aW9uKSkgew0KLSAgICAgICAgICAgIHByaW50RXJyb3IoY2xhc3NEZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFUFJPVklERVJfREFUQVNPVVJDRV9NRVNTQUdFX01PREUpOw0KLQ0KLSAgICAgICAgfQ0KLSAgICB9DQotCQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTT0FQQmluZGluZyhDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgIFN0cmluZyBiaW5kaW5nVHlwZSA9IGdldEJpbmRpbmdUeXBlVmFsdWUoY2xhc3NEZWNsYXJhdGlvbik7DQotICAgICAgICBpZiAoYmluZGluZ1R5cGUuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykgDQotICAgICAgICAgICAgICAgIHx8IGJpbmRpbmdUeXBlLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpDQotICAgICAgICAgICAgICAgIHx8IGJpbmRpbmdUeXBlLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORykNCi0gICAgICAgICAgICAgICAgfHwgYmluZGluZ1R5cGUuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HKSkgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0hUVFBCaW5kaW5nKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgew0KLSAgICAgICAgU3RyaW5nIGJpbmRpbmdUeXBlID0gZ2V0QmluZGluZ1R5cGVWYWx1ZShjbGFzc0RlY2xhcmF0aW9uKTsNCi0gICAgICAgIGlmIChiaW5kaW5nVHlwZS5lcXVhbHMoSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HKSkgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldEJpbmRpbmdUeXBlVmFsdWUoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICBBbm5vdGF0aW9uTWlycm9yIGJpbmRpbmdUeXBlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oY2xhc3NEZWNsYXJhdGlvbiwgQmluZGluZ1R5cGUuY2xhc3MpOw0KLSAgICAgICAgaWYgKGJpbmRpbmdUeXBlICE9IG51bGwpIHsNCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYmluZGluZ1R5cGUsIFZBTFVFKTsNCi0gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORzsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNZXNzYWdlTW9kZShDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgIHJldHVybiBnZXRTZXJ2aWNlTW9kZShjbGFzc0RlY2xhcmF0aW9uKS5lcXVhbHMoTW9kZS5NRVNTQUdFLm5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGF5bG9hZE1vZGUoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICByZXR1cm4gZ2V0U2VydmljZU1vZGUoY2xhc3NEZWNsYXJhdGlvbikuZXF1YWxzKE1vZGUuUEFZTE9BRC5uYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldFNlcnZpY2VNb2RlKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgew0KLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBzZXJ2aWNlTW9kZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGNsYXNzRGVjbGFyYXRpb24sIFNlcnZpY2VNb2RlLmNsYXNzKTsNCi0gICAgICAgIGlmIChzZXJ2aWNlTW9kZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHNlcnZpY2VNb2RlLCBWQUxVRSk7DQotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBNb2RlLlBBWUxPQUQudG9TdHJpbmcoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tGb3JEZWZhdWx0Q29uc3RydWN0b3IoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7DQotCQlib29sZWFuIGhhc0RlZmF1bHRDb25zdHJ1Y3RvciA9IGZhbHNlOw0KLQkJQ29sbGVjdGlvbjxDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPiBjb25zdHJ1Y3RvcnMgPSBjbGFzc0RlY2xhcmF0aW9uLmdldENvbnN0cnVjdG9ycygpOw0KLQkJaWYgKGNvbnN0cnVjdG9ycy5zaXplKCkgPT0gMCkgew0KLQkJCWhhc0RlZmF1bHRDb25zdHJ1Y3RvciA9IHRydWU7DQotCQl9IGVsc2Ugew0KLQkJCWZvciAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uIDogY29uc3RydWN0b3JzKSB7DQotCQkJCWlmIChjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLlBVQkxJQykgJiYgDQotCQkJCQkJY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpID09IDApIHsNCi0JCQkJCWhhc0RlZmF1bHRDb25zdHJ1Y3RvciA9IHRydWU7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWlmICghaGFzRGVmYXVsdENvbnN0cnVjdG9yKSB7DQotCQkJQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlUHJvdmlkZXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihjbGFzc0RlY2xhcmF0aW9uLCBXZWJTZXJ2aWNlUHJvdmlkZXIuY2xhc3MpOw0KLQkJCXByaW50Rml4YWJsZUVycm9yKHdlYlNlcnZpY2VQcm92aWRlci5nZXRQb3NpdGlvbigpLA0KLQkJCSAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRVBST1ZJREVSX0RFRkFVTFRfUFVCTElDX0NPTlNUUlVDVE9SKTsgDQotCQl9ICAgICAgICAgICAgICAgIA0KLQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVB1YmxpY0Fic3RyYWN0RmluYWxSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTE0YWU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVB1YmxpY0Fic3RyYWN0RmluYWxSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1vZGlmaWVyOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxNb2RpZmllcj4gbW9kaWZpZXJzID0gZGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1vZGlmaWVycy5jb250YWlucyhNb2RpZmllci5GSU5BTCkgfHwgbW9kaWZpZXJzLmNvbnRhaW5zKE1vZGlmaWVyLkFCU1RSQUNUKSAKLSAgICAgICAgICAgICAgICAgICAgIHx8ICFtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuUFVCTElDKSkgewotICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPEFubm90YXRpb25NaXJyb3I+IGFubm90YXRpb25NaXJyb3JzID0gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk1pcnJvcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uTWlycm9yIG1pcnJvciA6IGFubm90YXRpb25NaXJyb3JzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWlycm9yLmdldEFubm90YXRpb25UeXBlKCkudG9TdHJpbmcoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IoZGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1BVQkxJQ19BQlNUUkFDVF9GSU5BTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pZGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbi5nZXROZXN0ZWRUeXBlcygpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGVzdE5lc3RlZFR5cGVzKHR5cGVEZWNsYXJhdGlvbi5nZXROZXN0ZWRUeXBlcygpLCBhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdGVzdE5lc3RlZFR5cGVzKENvbGxlY3Rpb248VHlwZURlY2xhcmF0aW9uPiBuZXN0ZWRUeXBlcywgCi0gICAgICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbikgewotICAgICAgICBmb3IgKFR5cGVEZWNsYXJhdGlvbiBuZXN0ZWREZWNsYXJhdGlvbiA6IG5lc3RlZFR5cGVzKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPEFubm90YXRpb25NaXJyb3I+IGFubm90YXRpb25NaXJyb3JzID0gbmVzdGVkRGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk1pcnJvcnMoKTsKLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgIGlmIChtaXJyb3IuZ2V0QW5ub3RhdGlvblR5cGUoKS50b1N0cmluZygpLmVxdWFscyhhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG1pcnJvci5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfUFVCTElDX0FCU1RSQUNUX0ZJTkFMKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VSZWZzUnVsZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVJlZnNSdWxlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODdmNWU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVJlZnNSdWxlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5OQU1FOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5UWVBFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5WQUxVRTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVJlZnM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7DQotDQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25WYWx1ZTsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQ2xhc3NEZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247DQotDQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VSZWZzUnVsZXMgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3Igew0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsNCi0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudA0KLSAgICAgICAgICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFdlYlNlcnZpY2VSZWZzLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50DQotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pOw0KLQ0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7DQotICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlUmVmcyA9IEFubm90YXRpb25VdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sIFdlYlNlcnZpY2VSZWZzLmNsYXNzKTsNCi0NCi0gICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgd2ViU2VydmljZVJlZnNWYWx1ZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUod2ViU2VydmljZVJlZnMsIFZBTFVFKTsNCi0NCi0gICAgICAgICAgICBpZiAod2ViU2VydmljZVJlZnNWYWx1ZSAhPSBudWxsICYmIHdlYlNlcnZpY2VSZWZzVmFsdWUuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIExpc3Q8Pz4pIHsNCi0gICAgICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uVmFsdWU+IHZhbHVlID0gKExpc3Q8QW5ub3RhdGlvblZhbHVlPikgd2ViU2VydmljZVJlZnNWYWx1ZS5nZXRWYWx1ZSgpOw0KLQ0KLSAgICAgICAgICAgICAgICBmb3IgKEFubm90YXRpb25WYWx1ZSBhbm5vdGF0aW9uVmFsdWUgOiB2YWx1ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb25WYWx1ZS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQW5ub3RhdGlvbk1pcnJvcikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViU2VydmljZVJlZiA9IChBbm5vdGF0aW9uTWlycm9yKSBhbm5vdGF0aW9uVmFsdWUuZ2V0VmFsdWUoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgd2ViU2VydmljZVJlZk5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUod2ViU2VydmljZVJlZiwgTkFNRSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdlYlNlcnZpY2VSZWZOYW1lID09IG51bGwgfHwgd2ViU2VydmljZVJlZk5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJTZXJ2aWNlUmVmLmdldFBvc2l0aW9uKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRVJFRlNfTkFNRV9SRVFVSVJFRCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25WYWx1ZSB3ZWJTZXJ2aWNlUmVmTmFtZVR5cGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ViU2VydmljZVJlZiwgVFlQRSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdlYlNlcnZpY2VSZWZOYW1lVHlwZSAhPSBudWxsICYmIHdlYlNlcnZpY2VSZWZOYW1lVHlwZSBpbnN0YW5jZW9mIEFubm90YXRpb25WYWx1ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgdHlwZSA9IChBbm5vdGF0aW9uVmFsdWUpIHdlYlNlcnZpY2VSZWZOYW1lVHlwZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiA9IChDbGFzc0RlY2xhcmF0aW9uKSB0eXBlLmdldFZhbHVlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKHdlYlNlcnZpY2VSZWYuZ2V0UG9zaXRpb24oKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VSRUZTX1RZUEVfUkVRVUlSRUQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJTZXJ2aWNlUmVmLmdldFBvc2l0aW9uKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRVJFRlNfVFlQRV9SRVFVSVJFRCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVNFSUFsbG93ZWRBdHRyaWJ1dGVzUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlU0VJQWxsb3dlZEF0dHJpYnV0ZXNSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MjUwZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlU0VJQWxsb3dlZEF0dHJpYnV0ZXNSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkVORFBPSU5UX0lOVEVSRkFDRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5QT1JUX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuU0VSVklDRV9OQU1FOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25WYWx1ZTsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5JbnRlcmZhY2VEZWNsYXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTRUlBbGxvd2VkQXR0cmlidXRlc1J1bGUgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsKLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFdlYlNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldERlY2xhcmF0aW9uc0Fubm90YXRlZFdpdGgoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgSW50ZXJmYWNlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPEFubm90YXRpb25NaXJyb3I+IGFubm90YXRpb25NaXJyb3JzID0gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk1pcnJvcnMoKTsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uTWlycm9yIG1pcnJvciA6IGFubm90YXRpb25NaXJyb3JzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25WYWx1ZSBzZXJ2aWNlTmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUobWlycm9yLCBTRVJWSUNFX05BTUUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3Ioc2VydmljZU5hbWUuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9TRVJWSUNFTkFNRV9TRUkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25WYWx1ZSBlbmRwb2ludEludGVyZmFjZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUobWlycm9yLCBFTkRQT0lOVF9JTlRFUkZBQ0UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZW5kcG9pbnRJbnRlcmZhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IoZW5kcG9pbnRJbnRlcmZhY2UuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTkRQT0lOVElOVEVSRkFDRV9TRUkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgcG9ydE5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKG1pcnJvciwgUE9SVF9OQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnROYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKHBvcnROYW1lLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfUE9SVE5BTUVfU0VJKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlU0VJUmVzdHJpY3Rpb25zUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlU0VJUmVzdHJpY3Rpb25zUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWU4ODUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVNFSVJlc3RyaWN0aW9uc1J1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkVORFBPSU5UX0lOVEVSRkFDRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5OQU1FOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsKLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblZhbHVlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkNsYXNzRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uSW50ZXJmYWNlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTW9kaWZpZXI7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uUGFyYW1ldGVyRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVNFSVJlc3RyaWN0aW9uc1J1bGUgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsKLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFdlYlNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIENvbGxlY3Rpb248QW5ub3RhdGlvbk1pcnJvcj4gYW5ub3RhdGlvbk1pcnJvcnMgPSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTWlycm9ycygpOwotICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgZW5kcG9pbnRJbnRlcmZhY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKG1pcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkRQT0lOVF9JTlRFUkZBQ0UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZW5kcG9pbnRJbnRlcmZhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKG1pcnJvciwgTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IobmFtZS5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX05BTUVfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrUmVzdHJpY3Rpb25zKChDbGFzc0RlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbiwgZW5kcG9pbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tKU1IxODFBbm5vdGF0aW9ucygoQ2xhc3NEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVzdHJpY3Rpb25zKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiwgQW5ub3RhdGlvblZhbHVlIGVuZHBvaW50SW50ZXJmYWNlKSB7Ci0gICAgICAgIFN0cmluZyBzZWkgPSBlbmRwb2ludEludGVyZmFjZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmICgoSkRUVXRpbHMudmFsaWRhdGVKYXZhVHlwZU5hbWUoc2VpKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IGVudmlyb25tZW50LmdldFR5cGVEZWNsYXJhdGlvbihzZWkpOwotICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghKHR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgIHByaW50RXJyb3IoZW5kcG9pbnRJbnRlcmZhY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfSU5URVJGQUNFLCBzZWkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0eXBlRGVjbGFyYXRpb24uZ2V0RGVjbGFyaW5nVHlwZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmludEVycm9yKGVuZHBvaW50SW50ZXJmYWNlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX09VVEVSLCBzZWkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3IgYW5ub3RhdGlvbk1pcnJvciA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGVEZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbk1pcnJvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcihlbmRwb2ludEludGVyZmFjZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9BTk5PVEFURUQsIHNlaSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXR5cGVEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5QVUJMSUMpKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcihlbmRwb2ludEludGVyZmFjZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9QVUJMSUMsIHNlaSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWNsYXNzRGVjbGFyYXRpb24uZ2V0U3VwZXJpbnRlcmZhY2VzKCkuY29udGFpbnModHlwZURlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBzZWlNZXRob2RzID0gdHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gaW1wbE1ldGhvZHMgPSBjbGFzc0RlY2xhcmF0aW9uLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIHNlaU1ldGhvZCA6IHNlaU1ldGhvZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbXBsZW1lbnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIGltcGxNZXRob2QgOiBpbXBsTWV0aG9kcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFubm90YXRpb25VdGlscy5jb21wYXJlTWV0aG9kcyhzZWlNZXRob2QsIGltcGxNZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbXBsTWV0aG9kLmdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLlBVQkxJQykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJcHJpbnRGaXhhYmxlRXJyb3IoaW1wbE1ldGhvZC5nZXRQb3NpdGlvbigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQlKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfUkVEVUNFRF9WSVNJQklMSVRZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbXBsTWV0aG9kLmdldFJldHVyblR5cGUoKS5lcXVhbHMoc2VpTWV0aG9kLmdldFJldHVyblR5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJcHJpbnRGaXhhYmxlRXJyb3IoaW1wbE1ldGhvZC5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCUpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9JTkNPTVBBVElCTEVfUkVUVVJOX1RZUEUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCWdldEltcGxlbWVudHNNZXNzYWdlKHR5cGVEZWNsYXJhdGlvbiwgc2VpTWV0aG9kKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJIiIsIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9JTkNPTVBBVElCTEVfUkVUVVJOX1RZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpbXBsZW1lbnRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IoZW5kcG9pbnRJbnRlcmZhY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX01VU1RfSU1QTEVNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbXBsZW1lbnRzTWVzc2FnZSh0eXBlRGVjbGFyYXRpb24sIHNlaU1ldGhvZCkpLCAiIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTVVTVF9JTVBMRU1FTlQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnRFcnJvcihlbmRwb2ludEludGVyZmFjZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX0ZPVU5ELCBzZWkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEltcGxlbWVudHNNZXNzYWdlKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uIHNlaU1ldGhvZCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVpbGRlcih0eXBlRGVjbGFyYXRpb24uZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtZXNzYWdlLmFwcGVuZChzZWlNZXRob2QuZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gc2VpTWV0aG9kLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgSXRlcmF0b3I8UGFyYW1ldGVyRGVjbGFyYXRpb24+IGl0ZXIgPSBwYXJhbWV0ZXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24gPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB0eXBlTWlycm9yID0gZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0RXJhc3VyZShwYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXRUeXBlKCkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCh0eXBlTWlycm9yLnN1YnN0cmluZyh0eXBlTWlycm9yLmxhc3RJbmRleE9mKCIuIikgKyAxKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBtZXNzYWdlLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBtZXNzYWdlLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrSlNSMTgxQW5ub3RhdGlvbnMoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmcgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihjbGFzc0RlY2xhcmF0aW9uLCBTT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIGlmIChzb2FwQmluZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihzb2FwQmluZGluZy5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fU09BUEJJTkRJTkcpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24+IGltcGxNZXRob2RzID0gY2xhc3NEZWNsYXJhdGlvbgotICAgICAgICAgICAgICAgIC5nZXRNZXRob2RzKCk7Ci0gICAgICAgIGZvciAoY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBpbXBsTWV0aG9kcykgewotICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBtc29hcEJpbmRpbmcgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2REZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MpOwotICAgICAgICAgICAgaWYgKG1zb2FwQmluZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IobXNvYXBCaW5kaW5nLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fU09BUEJJTkRJTkcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIG9uZXdheSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZERlY2xhcmF0aW9uLCBPbmV3YXkuY2xhc3MpOwotICAgICAgICAgICAgaWYgKG9uZXdheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3Iob25ld2F5LmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fT05FV0FZKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJNZXRob2QgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2REZWNsYXJhdGlvbiwgV2ViTWV0aG9kLmNsYXNzKTsKLSAgICAgICAgICAgIGlmICh3ZWJNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKHdlYk1ldGhvZC5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQk1FVEhPRFMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJSZXN1bHQgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2REZWNsYXJhdGlvbiwgV2ViUmVzdWx0LmNsYXNzKTsKLSAgICAgICAgICAgIGlmICh3ZWJSZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKHdlYlJlc3VsdC5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQlJFU1VMVCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENvbGxlY3Rpb248UGFyYW1ldGVyRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBmb3IgKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBhcmFtLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAod2ViUGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcih3ZWJQYXJhbS5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJQQVJBTSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGY3MDMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuVEFSR0VUX05BTUVTUEFDRTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOw0KLQ0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVmFsdWU7DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5QYWNrYWdlRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZVJ1bGUgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3Igew0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsNCi0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50DQotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudA0KLSAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uRGVjbGFyYXRpb24pOw0KLQ0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7DQotICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7DQotICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViU2VydmljZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBXZWJTZXJ2aWNlLmNsYXNzKTsNCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIHRhcmdldE5hbWVzcGFjZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUod2ViU2VydmljZSwgVEFSR0VUX05BTUVTUEFDRSk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgZGVjbGFyYXRpb247DQotICAgICAgICAgICAgICAgIFBhY2thZ2VEZWNsYXJhdGlvbiBwYWNrYWdlRGVjbGFyYXRpb24gPSB0eXBlRGVjbGFyYXRpb24uZ2V0UGFja2FnZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAocGFja2FnZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKS5sZW5ndGgoKSA9PSAwICYmIHRhcmdldE5hbWVzcGFjZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKHdlYlNlcnZpY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9ERUZBVUxUX1BBQ0tBR0VfVEFSR0VUX05BTUVTUEFDRSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgJiYgdGFyZ2V0TmFtZXNwYWNlLmdldFZhbHVlKCkudG9TdHJpbmcoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih0YXJnZXROYW1lc3BhY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9ERUZBVUxUX1BBQ0tBR0VfVEFSR0VUX05BTUVTUEFDRSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9ICAgICAgICAgICAgDQotICAgICAgICB9DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlV1NETExvY2F0aW9uUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlV1NETExvY2F0aW9uUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTZlZTg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVdTRExMb2NhdGlvblJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkVORFBPSU5UX0lOVEVSRkFDRTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuRVhDTFVERTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuT1BFUkFUSU9OX05BTUU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlBPUlRfTkFNRTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUE9SVF9TVUZGSVg7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlNFUlZJQ0VfTkFNRTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuU0VSVklDRV9TVUZGSVg7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlNUWUxFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5UQVJHRVRfTkFNRVNQQUNFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5XU0RMX0xPQ0FUSU9OOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsNCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsNCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOw0KLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsNCi1pbXBvcnQgamF2YXgud3NkbC5Qb3J0Ow0KLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcDEyLlNPQVAxMkJpbmRpbmc7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5XU0RMVXRpbHM7DQotDQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25WYWx1ZTsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQ2xhc3NEZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247DQotDQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VXU0RMTG9jYXRpb25SdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgew0KLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50DQotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7DQotDQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsNCi0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICAgICAgICAgIENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiA9IChDbGFzc0RlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbjsNCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sIFdlYlNlcnZpY2UuY2xhc3MpOw0KLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgd3NkbExvY2F0aW9uVmFsdWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKHdlYlNlcnZpY2UsIFdTRExfTE9DQVRJT04pOw0KLSAgICAgICAgICAgICAgICBpZiAod3NkbExvY2F0aW9uVmFsdWUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAJYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IHdzZGxMb2NhdGlvblZhbHVlLmdldFZhbHVlKCkudG9TdHJpbmcoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHdzZGxMb2NhdGlvbiAhPSBudWxsICYmIHdzZGxMb2NhdGlvbi50cmltKCkubGVuZ3RoKCkgPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFVSTCB3c2RsVVJMID0gbmV3IFVSTCh3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IFdTRExVdGlscy5yZWFkV1NETCh3c2RsVVJMKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9ICBnZXRTZXJ2aWNlUU5hbWUod2ViU2VydmljZSwgKENsYXNzRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShkZWZpbml0aW9uLCBzZXJ2aWNlUU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSAgZ2V0UG9ydE5hbWUod2ViU2VydmljZSwgY2xhc3NEZWNsYXJhdGlvbik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0IHBvcnQgPSBnZXRQb3J0KHNlcnZpY2UsIHBvcnROYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEJpbmRpbmcoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUJpbmRpbmcoYmluZGluZywgY2xhc3NEZWNsYXJhdGlvbiwgd2ViU2VydmljZSwgd3NkbExvY2F0aW9uKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kTWFwID0gZ2V0V2ViTWV0aG9kcyhjbGFzc0RlY2xhcmF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ViU2VydmljZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxPcGVyYXRpb24+IG9wZXJhdGlvbnMgPSBiaW5kaW5nLmdldFBvcnRUeXBlKCkuZ2V0T3BlcmF0aW9ucygpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoT3BlcmF0aW9uIG9wZXJhdGlvbiA6IG9wZXJhdGlvbnMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBtZXRob2RNYXAuZ2V0KG9wZXJhdGlvbi5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kRGVjbGFyYXRpb24gPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJTZXJ2aWNlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9OT19PUEVSVEFUSU9OX05BTUUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXROYW1lKCkpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igb25ld2F5ID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZERlY2xhcmF0aW9uLCBPbmV3YXkuY2xhc3MpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uZXdheSAhPSBudWxsICYmIG9wZXJhdGlvbi5nZXRPdXRwdXQoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihtZXRob2REZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1dTRExfT1BFUkFUSU9OX09VVFBVVF9NRVRIT0RfT05FV0FZLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHttZXRob2REZWNsYXJhdGlvbi5nZXRTaW1wbGVOYW1lKCksIG9wZXJhdGlvbi5nZXROYW1lKCl9KSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Iod2ViU2VydmljZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX05PX1BPUlRfTkFNRSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7cG9ydE5hbWUsIHdzZGxMb2NhdGlvbn0pKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Iod2ViU2VydmljZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fTk9fU0VSVklDRV9OQU1FLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3NlcnZpY2VRTmFtZS5nZXRMb2NhbFBhcnQoKSwgd3NkbExvY2F0aW9ufSkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3c2RsTG9jYXRpb25WYWx1ZS5nZXRQb3NpdGlvbigpLCBtdXJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnROb3RpY2Uod3NkbExvY2F0aW9uVmFsdWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9VTkFCTEVfVE9fTE9DQVRFLCB3c2RsTG9jYXRpb24pKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQmluZGluZyhCaW5kaW5nIGJpbmRpbmcsIENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiwgDQotICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlLCBTdHJpbmcgd3NkbExvY2F0aW9uKSB7DQotICAgICAgICBTdHJpbmcgc3R5bGUgPSBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVC5uYW1lKCk7DQotICAgICAgICANCi0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmdBbm5vdGF0aW9uID0gZ2V0U09BUEJpbmRpbmcoY2xhc3NEZWNsYXJhdGlvbiwgd2ViU2VydmljZSk7DQotICAgICAgICBpZiAoc29hcEJpbmRpbmdBbm5vdGF0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgIFN0cmluZyBzdHlsZVZhbHVlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHNvYXBCaW5kaW5nQW5ub3RhdGlvbiwgU1RZTEUpOw0KLSAgICAgICAgICAgaWYgKHN0eWxlVmFsdWUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgIHN0eWxlID0gc3R5bGVWYWx1ZTsNCi0gICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSAgYmluZGluZy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsNCi0gICAgICAgIGZvciAoT2JqZWN0IGVsZW1lbnRFeHRlbnNpYmxlIDogZXh0ZW5zaWJpbGl0eUVsZW1lbnRzKSB7DQotICAgICAgICAgICAgaWYgKGVsZW1lbnRFeHRlbnNpYmxlIGluc3RhbmNlb2YgU09BUEJpbmRpbmcpIHsNCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcgc29hcEJpbmRpbmcgPSAoU09BUEJpbmRpbmcpIGVsZW1lbnRFeHRlbnNpYmxlOw0KLSAgICAgICAgICAgICAgICBpZiAoc3R5bGUuY29tcGFyZVRvSWdub3JlQ2FzZShzb2FwQmluZGluZy5nZXRTdHlsZSgpKSAhPSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKHNvYXBCaW5kaW5nQW5ub3RhdGlvbiA9PSBudWxsID8gd2ViU2VydmljZS5nZXRQb3NpdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc29hcEJpbmRpbmdBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCksIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9TT0FQX0JJTkRJTkdfU1RZTEUsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7d3NkbExvY2F0aW9uLCBzb2FwQmluZGluZy5nZXRTdHlsZSgpLCBzdHlsZX0pKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoZWxlbWVudEV4dGVuc2libGUgaW5zdGFuY2VvZiBTT0FQMTJCaW5kaW5nKSB7DQotICAgICAgICAgICAgICAgIFNPQVAxMkJpbmRpbmcgc29hcDEyQmluZGluZyA9IChTT0FQMTJCaW5kaW5nKSBlbGVtZW50RXh0ZW5zaWJsZTsNCi0gICAgICAgICAgICAgICAgaWYgKHN0eWxlLmNvbXBhcmVUb0lnbm9yZUNhc2Uoc29hcDEyQmluZGluZy5nZXRTdHlsZSgpKSAhPSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKHNvYXBCaW5kaW5nQW5ub3RhdGlvbiA9PSBudWxsID8gd2ViU2VydmljZS5nZXRQb3NpdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc29hcEJpbmRpbmdBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1NPQVBfQklORElOR19TVFlMRSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHt3c2RsTG9jYXRpb24sIHNvYXAxMkJpbmRpbmcuZ2V0U3R5bGUoKSwgc3R5bGV9KSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgQW5ub3RhdGlvbk1pcnJvciBnZXRTT0FQQmluZGluZyhUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2UpIHsNCi0gICAgICAgIFN0cmluZyBlbmRwb2ludEludGVyZmFjZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZSh3ZWJTZXJ2aWNlLCBFTkRQT0lOVF9JTlRFUkZBQ0UpOw0KLSAgICAgICAgaWYgKGVuZHBvaW50SW50ZXJmYWNlICE9IG51bGwpIHsNCi0gICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gc2VpRGVjbGFyYXRpb24gPSBlbnZpcm9ubWVudC5nZXRUeXBlRGVjbGFyYXRpb24oZW5kcG9pbnRJbnRlcmZhY2UpOw0KLSAgICAgICAgICAgIGlmIChzZWlEZWNsYXJhdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHR5cGVEZWNsYXJhdGlvbiA9IHNlaURlY2xhcmF0aW9uOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlRGVjbGFyYXRpb24sIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLmNsYXNzKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNZXRob2REZWNsYXJhdGlvbj4gZ2V0V2ViTWV0aG9kcyhUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2UpIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZERlY2xhcmF0aW9uPigpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGVuZHBvaW50SW50ZXJmYWNlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHdlYlNlcnZpY2UsIEVORFBPSU5UX0lOVEVSRkFDRSk7DQotICAgICAgICBpZiAoZW5kcG9pbnRJbnRlcmZhY2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIFR5cGVEZWNsYXJhdGlvbiBzZWlEZWNsYXJhdGlvbiA9IGVudmlyb25tZW50LmdldFR5cGVEZWNsYXJhdGlvbihlbmRwb2ludEludGVyZmFjZSk7DQotICAgICAgICAgICAgaWYgKHNlaURlY2xhcmF0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdHlwZURlY2xhcmF0aW9uID0gc2VpRGVjbGFyYXRpb247DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kcyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCk7DQotICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kcykgew0KLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViTWV0aG9kID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIFdlYk1ldGhvZC5jbGFzcyk7DQotICAgICAgICAgICAgaWYgKHdlYk1ldGhvZCAhPSBudWxsICYmICFpc0V4bHVkZWQod2ViTWV0aG9kKSkgew0KLSAgICAgICAgICAgICAgICBtZXRob2RNYXAucHV0KGdldE9wZXJhdGlvbk5hbWUod2ViTWV0aG9kLCBtZXRob2REZWNsYXJhdGlvbiksIG1ldGhvZERlY2xhcmF0aW9uKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBtZXRob2RNYXAucHV0KG1ldGhvZERlY2xhcmF0aW9uLmdldFNpbXBsZU5hbWUoKSwgbWV0aG9kRGVjbGFyYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtZXRob2RNYXA7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRXhsdWRlZChBbm5vdGF0aW9uTWlycm9yIHdlYk1ldGhvZCkgew0KLSAgICAgICAgQm9vbGVhbiBleGNsdWRlID0gQW5ub3RhdGlvblV0aWxzLmdldEJvb2xlYW5WYWx1ZSh3ZWJNZXRob2QsIEVYQ0xVREUpOw0KLSAgICAgICAgaWYgKGV4Y2x1ZGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBleGNsdWRlLmJvb2xlYW5WYWx1ZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldE9wZXJhdGlvbk5hbWUoQW5ub3RhdGlvbk1pcnJvciB3ZWJNZXRob2QsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7DQotICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZSh3ZWJNZXRob2QsIE9QRVJBVElPTl9OQU1FKTsNCi0gICAgICAgIGlmIChvcGVyYXRpb25OYW1lICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uTmFtZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtZXRob2REZWNsYXJhdGlvbi5nZXRTaW1wbGVOYW1lKCk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotICAgIHByaXZhdGUgU2VydmljZSBnZXRTZXJ2aWNlKERlZmluaXRpb24gZGVmaW5pdGlvbiwgUU5hbWUgc2VydmljZVFOYW1lKSB7DQotICAgICAgICBNYXAgc2VydmljZXNNYXAgPSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7DQotICAgICAgICBTZXQ8TWFwLkVudHJ5PiBzZXJ2aWNlc1NldCA9IHNlcnZpY2VzTWFwLmVudHJ5U2V0KCk7DQotICAgICAgICBmb3IgKE1hcC5FbnRyeTxRTmFtZSwgU2VydmljZT4gc2VydmljZUVudHJ5IDogc2VydmljZXNTZXQpIHsNCi0gICAgICAgICAgICBRTmFtZSBzZXJ2aWNlRW50cnlLZXkgPSBzZXJ2aWNlRW50cnkuZ2V0S2V5KCk7DQotICAgICAgICAgICAgaWYgKHNlcnZpY2VFbnRyeUtleS5lcXVhbHMoc2VydmljZVFOYW1lKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZUVudHJ5LmdldFZhbHVlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0gICAgDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLSAgICBwcml2YXRlIFBvcnQgZ2V0UG9ydChTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyBwb3J0TmFtZSkgew0KLSAgICAgICAgTWFwIHBvcnRzTWFwID0gc2VydmljZS5nZXRQb3J0cygpOw0KLSAgICAgICAgU2V0PE1hcC5FbnRyeT4gcG9ydHNTZXQgPSBwb3J0c01hcC5lbnRyeVNldCgpOyAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBQb3J0PiBwb3J0RW50cnkgOiBwb3J0c1NldCkgew0KLSAgICAgICAgICAgIFN0cmluZyBwb3J0RW50cnlLZXkgPSBwb3J0RW50cnkuZ2V0S2V5KCk7DQotICAgICAgICAgICAgaWYgKHBvcnRFbnRyeUtleS5lcXVhbHMocG9ydE5hbWUpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBwb3J0RW50cnkuZ2V0VmFsdWUoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBRTmFtZSBnZXRTZXJ2aWNlUU5hbWUoQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlLCBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZSh3ZWJTZXJ2aWNlLCBTRVJWSUNFX05BTUUpOw0KLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lID09IG51bGwpIHsNCi0gICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IGNsYXNzRGVjbGFyYXRpb24uZ2V0U2ltcGxlTmFtZSgpICsgU0VSVklDRV9TVUZGSVg7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFFOYW1lKGdldFRhcmdldE5hbWVzcGFjZSh3ZWJTZXJ2aWNlLCBjbGFzc0RlY2xhcmF0aW9uKSwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldFBvcnROYW1lKEFubm90YXRpb25NaXJyb3Igd2ViU2VydmljZSwgQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUod2ViU2VydmljZSwgUE9SVF9OQU1FKTsNCi0gICAgICAgIGlmIChwb3J0TmFtZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgcG9ydE5hbWUgPSBjbGFzc0RlY2xhcmF0aW9uLmdldFNpbXBsZU5hbWUoKSArIFBPUlRfU1VGRklYOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHBvcnROYW1lOw0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlLCBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUod2ViU2VydmljZSwgVEFSR0VUX05BTUVTUEFDRSk7DQotICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlID09IG51bGwpIHsNCi0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSBKRFRVdGlscy5nZXRUYXJnZXROYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUoDQotICAgICAgICAgICAgICAgICAgICBjbGFzc0RlY2xhcmF0aW9uLmdldFBhY2thZ2UoKS5nZXRRdWFsaWZpZWROYW1lKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlV2ViU2VydmljZVByb3ZpZGVyQ29FeGlzdFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhYTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVdlYlNlcnZpY2VQcm92aWRlckNvRXhpc3RSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0KLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgIGNoZWNrV2ViU2VydmljZVByb3ZpZGVyKG1pcnJvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tXZWJTZXJ2aWNlUHJvdmlkZXIoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IpIHsKLSAgICAgICAgaWYgKG1pcnJvci5nZXRBbm5vdGF0aW9uVHlwZSgpLnRvU3RyaW5nKCkuZXF1YWxzKFdlYlNlcnZpY2VQcm92aWRlci5jbGFzcy5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihtaXJyb3IuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgLldFQlNFUlZJQ0VfV0VCU0VSVklDRVBST1ZJREVSX0NPTUJJTkFUSU9OKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL3V0aWxzL0pBWFdTVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL3V0aWxzL0pBWFdTVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM5OWIzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS91dGlscy9KQVhXU1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVQbHVnaW47Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSkFYV1NVdGlscyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT04gPSAiYWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSRyA9ICJhcmciOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRSA9ICJjbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX0NIQVJBQ1RFUiA9ICIuIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORFBPSU5UX0lOVEVSRkFDRSA9ICJlbmRwb2ludEludGVyZmFjZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVURFID0gImV4Y2x1ZGUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfQkVBTiA9ICJmYXVsdEJlYW4iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOQUxJWkUgPSAiZmluYWxpemUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSID0gImhlYWRlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhXU19TVUJQQUNLQUdFID0gImpheHdzIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX05BTUUgPSAibG9jYWxOYW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREUgPSAibW9kZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRVJBVElPTl9OQU1FID0gIm9wZXJhdGlvbk5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX1NUWUxFID0gInBhcmFtZXRlclN0eWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRfTkFNRSA9ICJwYXJ0TmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX05BTUUgPSAicG9ydE5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9TVUZGSVggPSAiUG9ydCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRSA9ICJSZXNwb25zZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRV9TVUZGSVggPSAiUmVzcG9uc2UiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUVVJOID0gInJldHVybiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX05BTUUgPSAic2VydmljZU5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9TVUZGSVggPSAiU2VydmljZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFlMRSA9ICJzdHlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFID0gInRhcmdldE5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRSA9ICJ1c2UiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9MT0NBVElPTiA9ICJ3c2RsTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIEpBWFdTVXRpbHMoKSB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RvY3VtZW50QmFyZShBbm5vdGF0aW9uTWlycm9yIG1pcnJvcikgewotICAgICAgICBTdHJpbmcgc3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUobWlycm9yLCBTVFlMRSk7Ci0gICAgICAgIFN0cmluZyB1c2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUobWlycm9yLCBVU0UpOwotICAgICAgICBTdHJpbmcgcGFyYW1ldGVyU3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUobWlycm9yLCBQQVJBTUVURVJfU1RZTEUpOwotCi0gICAgICAgIHJldHVybiBKQVhXU1V0aWxzLmlzRG9jdW1lbnRCYXJlKHN0eWxlLCB1c2UsIHBhcmFtZXRlclN0eWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb2N1bWVudEJhcmUoSUFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBTVFlMRSk7Ci0gICAgICAgICAgICBTdHJpbmcgdXNlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBVU0UpOwotICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlclN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBQQVJBTUVURVJfU1RZTEUpOwotICAgICAgICAgICAgcmV0dXJuIEpBWFdTVXRpbHMuaXNEb2N1bWVudEJhcmUoc3R5bGUsIHVzZSwgcGFyYW1ldGVyU3R5bGUpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb2N1bWVudEJhcmUob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICBTdHJpbmcgc3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFNUWUxFKTsKLSAgICAgICAgU3RyaW5nIHVzZSA9IEFubm90YXRpb25VdGlscy5nZXRFbnVtVmFsdWUoYW5ub3RhdGlvbiwgVVNFKTsKLSAgICAgICAgU3RyaW5nIHBhcmFtZXRlclN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBQQVJBTUVURVJfU1RZTEUpOwotCi0gICAgICAgIHJldHVybiBKQVhXU1V0aWxzLmlzRG9jdW1lbnRCYXJlKHN0eWxlLCB1c2UsIHBhcmFtZXRlclN0eWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb2N1bWVudEJhcmUoU3RyaW5nIHN0eWxlLCBTdHJpbmcgdXNlLCBTdHJpbmcgcGFyYW1ldGVyU3R5bGUpIHsKLSAgICAgICAgcmV0dXJuIChzdHlsZSA9PSBudWxsIHx8IHN0eWxlLmVxdWFscyhTdHlsZS5ET0NVTUVOVC5uYW1lKCkpKQotICAgICAgICAgICAgICAgICYmICh1c2UgPT0gbnVsbCB8fCB1c2UuZXF1YWxzKFVzZS5MSVRFUkFMLm5hbWUoKSkpCi0gICAgICAgICAgICAgICAgJiYgKHBhcmFtZXRlclN0eWxlICE9IG51bGwgJiYgcGFyYW1ldGVyU3R5bGUuZXF1YWxzKFBhcmFtZXRlclN0eWxlLkJBUkUubmFtZSgpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRG9jdW1lbnRXcmFwcGVkKEFubm90YXRpb25NaXJyb3IgbWlycm9yKSB7Ci0gICAgICAgIFN0cmluZyBzdHlsZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShtaXJyb3IsIFNUWUxFKTsKLSAgICAgICAgU3RyaW5nIHVzZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShtaXJyb3IsIFVTRSk7Ci0gICAgICAgIFN0cmluZyBwYXJhbWV0ZXJTdHlsZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShtaXJyb3IsIFBBUkFNRVRFUl9TVFlMRSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gSkFYV1NVdGlscy5pc0RvY3VtZW50V3JhcHBlZChzdHlsZSwgdXNlLCBwYXJhbWV0ZXJTdHlsZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RvY3VtZW50V3JhcHBlZChJQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFNUWUxFKTsKLSAgICAgICAgICAgIFN0cmluZyB1c2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFVTRSk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyU3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFBBUkFNRVRFUl9TVFlMRSk7Ci0gICAgICAgICAgICByZXR1cm4gSkFYV1NVdGlscy5pc0RvY3VtZW50V3JhcHBlZChzdHlsZSwgdXNlLCBwYXJhbWV0ZXJTdHlsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRG9jdW1lbnRXcmFwcGVkKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBTVFlMRSk7Ci0gICAgICAgIFN0cmluZyB1c2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFVTRSk7Ci0gICAgICAgIFN0cmluZyBwYXJhbWV0ZXJTdHlsZSA9IEFubm90YXRpb25VdGlscy5nZXRFbnVtVmFsdWUoYW5ub3RhdGlvbiwgUEFSQU1FVEVSX1NUWUxFKTsKLQotICAgICAgICByZXR1cm4gSkFYV1NVdGlscy5pc0RvY3VtZW50V3JhcHBlZChzdHlsZSwgdXNlLCBwYXJhbWV0ZXJTdHlsZSk7Ci0gICAgfQotCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRG9jdW1lbnRXcmFwcGVkKFN0cmluZyBzdHlsZSwgU3RyaW5nIHVzZSwgU3RyaW5nIHBhcmFtZXRlclN0eWxlKSB7Ci0gICAgICAgIHJldHVybiAoc3R5bGUgPT0gbnVsbCB8fCBzdHlsZS5lcXVhbHMoU3R5bGUuRE9DVU1FTlQubmFtZSgpKSkKLSAgICAgICAgICAgICAgICAmJiAodXNlID09IG51bGwgfHwgdXNlLmVxdWFscyhVc2UuTElURVJBTC5uYW1lKCkpKQotICAgICAgICAgICAgICAgICYmIChwYXJhbWV0ZXJTdHlsZSA9PSBudWxsIHx8IHBhcmFtZXRlclN0eWxlLmVxdWFscyhQYXJhbWV0ZXJTdHlsZS5XUkFQUEVELm5hbWUoKSkpOwotICAgIH0KLQotICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZWQ5MTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5FRlM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBKRFQgVXRpbGl0eSBjbGFzcy4KLSAqIDxwPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciAKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCAKLSAqIHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgCi0gKiB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKRFRVdGlscyB7Ci0KLSAgICBwcml2YXRlIEpEVFV0aWxzKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUb0NsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGN1cnJlbnRFbnRyaWVzID0gQXJyYXlzLmFzTGlzdChqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSk7Ci0gICAgICAgICAgICBMaXN0PElDbGFzc3BhdGhFbnRyeT4gbmV3RW50cmllcyA9IG5ldyBBcnJheUxpc3Q8SUNsYXNzcGF0aEVudHJ5PigpOwotICAgICAgICAgICAgbmV3RW50cmllcy5hZGRBbGwoY3VycmVudEVudHJpZXMpOwotICAgICAgICAgICAgaWYgKGNsYXNzcGF0aEVudHJ5ICE9IG51bGwgJiYgIW5ld0VudHJpZXMuY29udGFpbnMoY2xhc3NwYXRoRW50cnkpKSB7Ci0gICAgICAgICAgICAgICAgbmV3RW50cmllcy5hZGQoY2xhc3NwYXRoRW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0VudHJpZXMudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W25ld0VudHJpZXMuc2l6ZSgpXSksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRnJvbUNsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGN1cnJlbnRFbnRyaWVzID0gQXJyYXlzLmFzTGlzdChqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSk7Ci0gICAgICAgICAgICBMaXN0PElDbGFzc3BhdGhFbnRyeT4gbmV3RW50cmllcyA9IG5ldyBBcnJheUxpc3Q8SUNsYXNzcGF0aEVudHJ5PigpOwotICAgICAgICAgICAgbmV3RW50cmllcy5hZGRBbGwoY3VycmVudEVudHJpZXMpOwotICAgICAgICAgICAgaWYgKGNsYXNzcGF0aEVudHJ5ICE9IG51bGwgJiYgbmV3RW50cmllcy5jb250YWlucyhjbGFzc3BhdGhFbnRyeSkpIHsKLSAgICAgICAgICAgICAgICBuZXdFbnRyaWVzLnJlbW92ZShjbGFzc3BhdGhFbnRyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3RW50cmllcy50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbbmV3RW50cmllcy5zaXplKCldKSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tUeXBlRXhpc3RzKElUeXBlIHR5cGUsIFN0cmluZyBjb21waWxhdGlvblVuaXROYW1lKSB7Ci0gICAgICAgIGNvbXBpbGF0aW9uVW5pdE5hbWUgPSBjb21waWxhdGlvblVuaXROYW1lLnRyaW0oKTsKLQotICAgICAgICBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCk7Ci0gICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gcGFja2FnZUZyYWdtZW50LmdldENvbXBpbGF0aW9uVW5pdChjb21waWxhdGlvblVuaXROYW1lKTsKLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gY29tcGlsYXRpb25Vbml0LmdldFJlc291cmNlKCk7Ci0KLSAgICAgICAgaWYgKHJlc291cmNlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU0NvcmVQbHVnaW4uUExVR0lOX0lELCBKQVhXU0NvcmVNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAuYmluZChKQVhXU0NvcmVNZXNzYWdlcy5UWVBFX1dJVEhfTkFNRV9BTFJFQURZX0VYSVNUUywgbmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxhdGlvblVuaXROYW1lLCBwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSB9KSk7Ci0gICAgICAgIH0KLSAgICAgICAgVVJJIGxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSUZpbGVTdG9yZSBmaWxlU3RvcmUgPSBFRlMuZ2V0U3RvcmUobG9jYXRpb24pOwotICAgICAgICAgICAgICAgIGlmIChmaWxlU3RvcmUuZmV0Y2hJbmZvKCkuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5UWVBFX05BTUVfRElGRkVSRU5UX0NBU0VfRVhJU1RTKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSkgewotICAgICAgICByZXR1cm4gSkRUVXRpbHMuZ2V0VHlwZShKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSksIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKQotICAgICAgICAgICAgICAgIC5nZXRFbGVtZW50TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotICAgICAgICByZXR1cm4gamF2YVByb2plY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICByZXR1cm4gSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SmF2YVByb2plY3RPdXRwdXREaXJlY3RvcnlQYXRoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotICAgICAgICBJUGF0aCBvdXRwdXRQYXRoOwotICAgICAgICBTdHJpbmcgZnVsbFBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3V0cHV0UGF0aCA9IGphdmFQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCk7Ci0gICAgICAgICAgICBmdWxsUGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihvdXRwdXRQYXRoKS5nZXRMb2NhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgIC50b09TU3RyaW5nKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZnVsbFBhdGg7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SmF2YVByb2plY3RPdXRwdXREaXJlY3RvcnlQYXRoKFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICByZXR1cm4gSkRUVXRpbHMuZ2V0SmF2YVByb2plY3RPdXRwdXREaXJlY3RvcnlQYXRoKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SmF2YVByb2plY3RTb3VyY2VEaXJlY3RvcnlQYXRoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwKLSAgICAgICAgICAgIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSkgewotICAgICAgICAKLSAgICAgICAgSVR5cGUgdHlwZSA9IEpEVFV0aWxzLmdldFR5cGUoamF2YVByb2plY3QsIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKTsKLSAgICAgICAgSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSB0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpOwotICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KXBhY2thZ2VGcmFnbWVudC5nZXRQYXJlbnQoKTsKLSAgICAgICAgSVJlc291cmNlIHNyY0RpcmVjdG9yeVJlc291cmNlID0gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRSZXNvdXJjZSgpOwotICAgICAgICByZXR1cm4gc3JjRGlyZWN0b3J5UmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SmF2YVByb2plY3RTb3VyY2VEaXJlY3RvcnlQYXRoKFN0cmluZyBwcm9qZWN0TmFtZSwgCi0gICAgICAgICAgICBTdHJpbmcgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpIHsKLSAgICAgICAgcmV0dXJuIEpEVFV0aWxzLmdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSksCi0gICAgICAgICAgICAgICAgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIEpEVFV0aWxzLmdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBKRFRVdGlscy5nZXRKYXZhUHJvamVjdFNvdXJjZURpcmVjdG9yeVBhdGgoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKYXZhUHJvamVjdFNvdXJjZURpcmVjdG9yeVBhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdFtdIHBhY2thZ2VGcmFnbWVudFJvb3RzID0gamF2YVByb2plY3QuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLSAgICAgICAgICAgIElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgPSBwYWNrYWdlRnJhZ21lbnRSb290c1swXTsKLSAgICAgICAgICAgIElSZXNvdXJjZSBzcmNEaXJlY3RvcnlSZXNvdXJjZSA9IHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgICAgIHJldHVybiBzcmNEaXJlY3RvcnlSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lRnJvbUNsYXNzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHJldHVybiBKRFRVdGlscy5nZXRUeXBlKGphdmFQcm9qZWN0LCBmdWxseVF1YWxpZmllZENsYXNzTmFtZSkuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZUZyb21DbGFzcyhTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSkgewotICAgICAgICByZXR1cm4gSkRUVXRpbHMKLSAgICAgICAgICAgICAgICAuZ2V0UGFja2FnZU5hbWVGcm9tQ2xhc3MoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpLCBmdWxseVF1YWxpZmllZENsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGdpdmVuIDxjb2RlPklUeXBlPC9jb2RlPiBpcyBhbiBpbnRlcmZhY2UgYWxsIG1ldGhvZHMgZGVjbGFyZWQgaW4gdGhhdCBpbnRlcmZhY2UgYXJlIHJldHVybmVkLgotICAgICAqIDxwPgotICAgICAqIEFsdGVybmF0aXZlbHkgaWYgdGhlIGdpdmVuIGdpdmVuIDxjb2RlPklUeXBlPC9jb2RlPiBpcyBhIGNsYXNzIG9ubHkgbWV0aG9kcyB0aGF0IGFyZSBleHBsaWNpdGx5IG1hcmtlZAotICAgICAqIHB1YmxpYyBhcmUgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUKLSAgICAgKiBAcmV0dXJuIHRoZSBwdWJsaWMgbWV0aG9kcyBkZWNsYXJlZCBpbiB0aGlzIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElNZXRob2RbXSBnZXRQdWJsaWNNZXRob2RzKElUeXBlIHR5cGUpIHsKLSAgICAgICAgTGlzdDxJTWV0aG9kPiBwdWJsaWNNZXRob2RzID0gbmV3IEFycmF5TGlzdDxJTWV0aG9kPigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSU1ldGhvZFtdIGFsbE1ldGhvZHMgPSB0eXBlLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgIGlmICh0eXBlLmlzSW50ZXJmYWNlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWxsTWV0aG9kczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsTWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gYWxsTWV0aG9kc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoRmxhZ3MuaXNQdWJsaWMobWV0aG9kLmdldEZsYWdzKCkpICYmICFtZXRob2QuaXNDb25zdHJ1Y3RvcigpICYmICFtZXRob2QuaXNNYWluTWV0aG9kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljTWV0aG9kcy5hZGQobWV0aG9kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHVibGljTWV0aG9kcy50b0FycmF5KG5ldyBJTWV0aG9kW3B1YmxpY01ldGhvZHMuc2l6ZSgpXSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNvdXJjZUZyb21UeXBlKElUeXBlIHR5cGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLmdldEJ1ZmZlcigpLmdldENvbnRlbnRzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PSBudWxsIHx8IHBhY2thZ2VOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAiaHR0cDovL2RlZmF1bHRfcGFja2FnZS8iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG5hbWVzcGFjZUVsZW1lbnRzID0gQXJyYXlzLmFzTGlzdChwYWNrYWdlTmFtZS5zcGxpdCgiXFwuIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIENvbGxlY3Rpb25zLnJldmVyc2UobmFtZXNwYWNlRWxlbWVudHMpOwotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly8iOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBuYW1lc3BhY2VJdGVyYXRvciA9IG5hbWVzcGFjZUVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChuYW1lc3BhY2VJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBlbGVtZW50ID0gbmFtZXNwYWNlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKGVsZW1lbnQudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSArPSBlbGVtZW50OwotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlICs9ICIuIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0YXJnZXROYW1lc3BhY2UgKz0gIi8iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJVHlwZSBnZXRUeXBlKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gamF2YVByb2plY3QuZmluZFR5cGUoZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJVHlwZSBnZXRUeXBlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSkgewotICAgICAgICByZXR1cm4gSkRUVXRpbHMuZ2V0VHlwZShKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0KSwgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVR5cGUgZ2V0VHlwZShTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSkgewotICAgICAgICByZXR1cm4gSkRUVXRpbHMuZ2V0VHlwZShKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSksIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQdWJsaWNNZXRob2QoSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBGbGFncy5pc1B1YmxpYyhtZXRob2QuZ2V0RmxhZ3MoKSkgJiYgIW1ldGhvZC5pc0NvbnN0cnVjdG9yKCkgJiYgIW1ldGhvZC5pc01haW5NZXRob2QoKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVKYXZhVHlwZU5hbWUoU3RyaW5nIGNvbXBpbGF0aW9uVW5pdE5hbWUpIHsKLSAgICAgICAgU3RyaW5nIHNvdXJjZUxldmVsID0gSmF2YUNvcmUuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSk7Ci0gICAgICAgIFN0cmluZyBjb21wbGlhbmNlTGV2ZWwgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSk7Ci0gICAgICAgIHJldHVybiBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVKYXZhVHlwZU5hbWUoY29tcGlsYXRpb25Vbml0TmFtZSwgc291cmNlTGV2ZWwsIGNvbXBsaWFuY2VMZXZlbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlSmF2YVR5cGVOYW1lKFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGNvbXBpbGF0aW9uVW5pdE5hbWUpIHsKLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBTdHJpbmcgc291cmNlTGV2ZWwgPSBqYXZhUHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFLCB0cnVlKTsKLSAgICAgICAgU3RyaW5nIGNvbXBsaWFuY2VMZXZlbCA9IGphdmFQcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLCB0cnVlKTsKLSAgICAgICAgcmV0dXJuIEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUphdmFUeXBlTmFtZShjb21waWxhdGlvblVuaXROYW1lLCBzb3VyY2VMZXZlbCwgY29tcGxpYW5jZUxldmVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVQYWNrYWdlTmFtZShTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIFN0cmluZyBzb3VyY2VMZXZlbCA9IGphdmFQcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UsIHRydWUpOwotICAgICAgICBTdHJpbmcgY29tcGxpYW5jZUxldmVsID0gamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIHRydWUpOwotICAgICAgICByZXR1cm4gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlUGFja2FnZU5hbWUocGFja2FnZU5hbWUsIHNvdXJjZUxldmVsLCBjb21wbGlhbmNlTGV2ZWwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZUlkZW50aWZpZXIoU3RyaW5nIGlkKSB7Ci0gICAgICAgIFN0cmluZyBzb3VyY2VMZXZlbCA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UpOwotICAgICAgICBTdHJpbmcgY29tcGxpYW5jZUxldmVsID0gSmF2YUNvcmUuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UpOwotICAgICAgICByZXR1cm4gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSWRlbnRpZmllcihpZCwgc291cmNlTGV2ZWwsIGNvbXBsaWFuY2VMZXZlbCk7Ci0gICAgfQotCi0JcHVibGljIHN0YXRpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdEZyb21GaWxlKElGaWxlIGZpbGUpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQl0cnkgewotCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpIHsKLQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBwYWNrYWdlRnJhZ21lbnRSb290cyA9IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCQkJZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290IDogcGFja2FnZUZyYWdtZW50Um9vdHMpIHsKLQkJCQkJaWYgKHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKSB7Ci0JCQkJCQlJSmF2YUVsZW1lbnRbXSBwYWNrYWdlRnJhZ21lbnRzID0gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRDaGlsZHJlbigpOwotCQkJCQkJZm9yIChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgOiBwYWNrYWdlRnJhZ21lbnRzKSB7Ci0JCQkJCQkJaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpIHsKLQkJCQkJCQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSAoSVBhY2thZ2VGcmFnbWVudClqYXZhRWxlbWVudDsKLQkJCQkJCQkJSUNvbXBpbGF0aW9uVW5pdFtdIGNvbXBpbGF0aW9uVW5pdHMgPSBwYWNrYWdlRnJhZ21lbnQuZ2V0Q29tcGlsYXRpb25Vbml0cygpOwotCQkJCQkJCQlmb3IgKElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0IDogY29tcGlsYXRpb25Vbml0cykgewotCQkJCQkJCQkJaWYgKGNvbXBpbGF0aW9uVW5pdC5nZXRQYXRoKCkuZXF1YWxzKGZpbGUuZ2V0RnVsbFBhdGgoKSkpIHsKLQkJCQkJCQkJCQlyZXR1cm4gY29tcGlsYXRpb25Vbml0OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQlKQVhXU0NvcmVQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCUpBWFdTQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLSAgICBwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UpIHsKLSAgICAgICAgQVNUUGFyc2VyIHBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOwotICAgICAgICBwYXJzZXIuc2V0U291cmNlKHNvdXJjZSk7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBwYXJzZXIuY3JlYXRlQVNUKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICBjb21waWxhdGlvblVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGNvbXBpbGF0aW9uVW5pdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL1dTRExVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmM0YzgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL1dTRExVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQWRkcmVzczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcDEyLlNPQVAxMkFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFdyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5VUklVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi0vKioKLSAqIFdTREwgVXRpbGl0eSBjbGFzcy4KLSAqIDxwPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciAKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCAKLSAqIHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgCi0gKiB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBXU0RMVXRpbHMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0ZJTEVfTkFNRV9QQVRURVJOID0gIlthLXpBLVowLTlfXFwtXSsud3NkbCI7Ly8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX1FVRVJZID0gIj93c2RsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVBhdGggV1NETF9GT0xERVJfUEFUSCA9IG5ldyBQYXRoKCJ3c2RsLyIpOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVQgPSAzMDAwMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfRklMRV9FWFRFTlNJT04gPSAiLndzZGwiOyAvLyROT04tTkxTLTEkCi0JCi0gICAgcHJpdmF0ZSBXU0RMVXRpbHMoKSB7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgc3RhdGljIERlZmluaXRpb24gcmVhZFdTREwoVVJMIHdzZGxVUkwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgCVVSTENvbm5lY3Rpb24gdXJsQ29ubmVjdGlvbiA9IHdzZGxVUkwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAJdXJsQ29ubmVjdGlvbi5zZXRDb25uZWN0VGltZW91dChUSU1FT1VUKTsKLSAgICAJdXJsQ29ubmVjdGlvbi5zZXRSZWFkVGltZW91dChUSU1FT1VUKTsKLSAgICAJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSB1cmxDb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShpbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICBXU0RMRmFjdG9yeSB3c2RsRmFjdG9yeSA9IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBXU0RMUmVhZGVyIHdzZGxSZWFkZXIgPSB3c2RsRmFjdG9yeS5uZXdXU0RMUmVhZGVyKCk7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSB3c2RsUmVhZGVyLnJlYWRXU0RMKHdzZGxVUkwuZ2V0UGF0aCgpLCBpbnB1dFNvdXJjZSk7Ci0gICAgICAgICAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgICAgICAgfSBjYXRjaCAoV1NETEV4Y2VwdGlvbiB3c2RsZSkgewotICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyh3c2RsZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVdTREwoVVJMIHdzZGxVUkwsIERlZmluaXRpb24gZGVmaW5pdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLSAgICAJVVJJIHdzZGxVUkkgPSBudWxsOwotICAgICAgICBPdXRwdXRTdHJlYW0gd3NkbE91dHB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgIAl3c2RsVVJJID0gd3NkbFVSTC50b1VSSSgpOwotICAgICAgICAgICAgRmlsZSB3c2RsRmlsZSA9IG5ldyBGaWxlKHdzZGxVUkkpOwotICAgICAgICAgICAgd3NkbE91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHdzZGxGaWxlKTsKLSAgICAgICAgICAgIFdTRExGYWN0b3J5IHdzZGxGYWN0b3J5ID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFdTRExXcml0ZXIgd3NkbFdyaXRlciA9IHdzZGxGYWN0b3J5Lm5ld1dTRExXcml0ZXIoKTsKLSAgICAgICAgICAgIHdzZGxXcml0ZXIud3JpdGVXU0RMKGRlZmluaXRpb24sIHdzZGxPdXRwdXRTdHJlYW0pOwotICAgICAgICB9IGNhdGNoIChXU0RMRXhjZXB0aW9uIHdzZGxlKSB7Ci0gICAgICAgIAlKQVhXU0NvcmVQbHVnaW4ubG9nKHdzZGxlKTsKLSAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIHVyaXNlKSB7Ci0gICAgICAgIAlKQVhXU0NvcmVQbHVnaW4ubG9nKHVyaXNlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICh3c2RsT3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3c2RsT3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKLQkJCQkJCS5nZXRGaWxlRm9yTG9jYXRpb24oVVJJVXRpbC50b1BhdGgod3NkbFVSSSkpOwotICAgICAgICAgICAgICAgIGlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIAlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFdTRExGaWxlTmFtZShTdHJpbmcgd3NkbEZpbGVOYW1lKSB7Ci0gICAgICAgIHJldHVybiB3c2RsRmlsZU5hbWUgIT0gbnVsbCAmJiB3c2RsRmlsZU5hbWUubWF0Y2hlcyhXU0RMX0ZJTEVfTkFNRV9QQVRURVJOKTsgICAgIAotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSUZvbGRlciBnZXRXZWJDb250ZW50Rm9sZGVyKFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgIAlyZXR1cm4gV1NETFV0aWxzLmdldFdlYkNvbnRlbnRGb2xkZXIoV1NETFV0aWxzLmdldFByb2plY3QocHJvamVjdE5hbWUpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJRm9sZGVyIGdldFdlYkNvbnRlbnRGb2xkZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGb2xkZXIoCi0JCQkJV1NETFV0aWxzLmdldFdlYkNvbnRlbnRQYXRoKHByb2plY3QpKTsKLQl9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElGb2xkZXIgZ2V0V1NETEZvbGRlcihTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIFdTRExVdGlscy5nZXRXU0RMRm9sZGVyKFdTRExVdGlscy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJRm9sZGVyIGdldFdTRExGb2xkZXIoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBJUGF0aCB3c2RsRm9sZGVyUGF0aCA9IFdTRExVdGlscy5nZXRXZWJDb250ZW50UGF0aChwcm9qZWN0KS5hcHBlbmQoV1NETFV0aWxzLldTRExfRk9MREVSX1BBVEgpOwotICAgICAgICBJRm9sZGVyIHdzZGxGb2xkZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcih3c2RsRm9sZGVyUGF0aCk7Ci0gICAgICAgIGlmICghd3NkbEZvbGRlci5leGlzdHMoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3c2RsRm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbEZvbGRlcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJUGF0aCBnZXRXZWJDb250ZW50UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBKMkVFVXRpbHMuZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCkuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMRmlsZU5hbWVGcm9tVVJMKFVSTCB3c2RsVVJMKSB7Ci0gICAgICAgIElQYXRoIHdzZGxQYXRoID0gbmV3IFBhdGgod3NkbFVSTC50b0V4dGVybmFsRm9ybSgpKTsKLSAgICAgICAgcmV0dXJuIHdzZGxQYXRoLmxhc3RTZWdtZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogd2lsbCByZXR1cm4gb25lIG9mOiAKLSAgICAgKiA8bGk+U09BUEFkZHJlc3M8bGk+U09BUDEyQWRkcmVzczxsaT5udWxsIGlmIGl0IGNhbiBub3QgZmluZCBhIHNvYXAgYWRkcmVzcwotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZ2V0RW5kcG9pbnRBZGRyZXNzKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotICAgICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNYXAgc2VydmljZXNNYXAgPSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICBTZXQ8TWFwLkVudHJ5PiBzZXJ2aWNlc1NldCA9IHNlcnZpY2VzTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeSBzZXJ2aWNlRW50cnkgOiBzZXJ2aWNlc1NldCkgewotICAgICAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBzZXJ2aWNlRW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBNYXAgcG9ydHNNYXAgPSBzZXJ2aWNlLmdldFBvcnRzKCk7Ci0gICAgICAgICAgICAgICAgU2V0PE1hcC5FbnRyeT4gcG9ydHNTZXQgPSBwb3J0c01hcC5lbnRyeVNldCgpOwotICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5IHBvcnRFbnRyeSA6IHBvcnRzU2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFBvcnQgcG9ydCA9IChQb3J0KSBwb3J0RW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSBwb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvYmplY3QgOiBleHRlbnNpYmlsaXR5RWxlbWVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcyB8fCBvYmplY3QgaW5zdGFuY2VvZiBTT0FQMTJBZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChFeHRlbnNpYmlsaXR5RWxlbWVudCkgb2JqZWN0OyAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMTG9jYXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBXU0RMVXRpbHMuZ2V0RW5kcG9pbnRBZGRyZXNzKGRlZmluaXRpb24pOwotCQlpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgIT0gbnVsbCkgewotCSAgICAgICAgU3RyaW5nIGxvY2F0aW9uVVJJID0gZ2V0TG9jYXRpb25VUkkoZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotCSAgICAgICAgaWYgKGxvY2F0aW9uVVJJLmxlbmd0aCgpID4gMCkgewotCSAgICAgICAgICAgIFVSTCBlbmRwb2ludFVSTCA9IG5ldyBVUkwobG9jYXRpb25VUkkpOwotCSAgICAgICAgICAgIGlmIChlbmRwb2ludFVSTC5nZXRRdWVyeSgpID09IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgbG9jYXRpb25VUkkgKz0gV1NETF9RVUVSWTsKLQkgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uVVJJOwotCSAgICAgICAgfQotCQl9Ci0JICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYXRpb25VUkkoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpIHsKLQkgICAgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEFkZHJlc3MpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFNPQVBBZGRyZXNzKSBleHRlbnNpYmlsaXR5RWxlbWVudCkuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQMTJBZGRyZXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChTT0FQMTJBZGRyZXNzKSBleHRlbnNpYmlsaXR5RWxlbWVudCkuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWVGcm9tTmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwYWNrYWdlTmFtZUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgIFVSTCBuYW1lc3BhY2VVUkwgPSBuZXcgVVJMKG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSB3d3cgaWYgdGhlcmUKLSAgICAgICAgICAgIFN0cmluZyBhdXRob3JpdHkgPSBuYW1lc3BhY2VVUkwuZ2V0QXV0aG9yaXR5KCk7Ci0gICAgICAgICAgICBpZiAoYXV0aG9yaXR5LmluZGV4T2YoInd3dyIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBhdXRob3JpdHkgPSBhdXRob3JpdHkuc3Vic3RyaW5nKGF1dGhvcml0eS5pbmRleE9mKCIuIikgKyAxLCBhdXRob3JpdHkubGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBhdXRob3JpdHlFbGVtZW50cyA9IEFycmF5cy5hc0xpc3QoYXV0aG9yaXR5LnNwbGl0KCJcXC4iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnJldmVyc2UoYXV0aG9yaXR5RWxlbWVudHMpOwotICAgICAgICAgICAgcGFja2FnZU5hbWVFbGVtZW50cy5hZGRBbGwoYXV0aG9yaXR5RWxlbWVudHMpOwotCi0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IG5hbWVzcGFjZVVSTC5nZXRQYXRoKCk7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcGF0aEVsZW1lbnRzID0gQXJyYXlzLmFzTGlzdChwYXRoLnNwbGl0KCJbL1xcXFxdIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBwYWNrYWdlTmFtZUVsZW1lbnRzLmFkZEFsbChwYXRoRWxlbWVudHMpOwotCi0gICAgICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IHBhY2thZ2VJdGVyYXRvciA9IHBhY2thZ2VOYW1lRWxlbWVudHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChwYWNrYWdlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnQgPSBwYWNrYWdlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgKz0gZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lICs9ICIuIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpIHsKLSAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2cobXVybGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZS50b0xvd2VyQ2FzZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMWE0MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGIxOWFkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZTA0ODRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNNb24gSnVsIDIwIDE1OjI1OjMxIEVFU1QgMjAwOQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNDJmZWQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDINCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjANCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wDQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbjtzaW5nbGV0b246PXRydWUNCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyDQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5pbnRlcm5hbC5wbHVnaW4uRG9tSW50ZWdyYXRpb25QbHVnaW4NCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4NCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLA0KLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywNCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWksDQotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLA0KLSBvcmcuZWNsaXBzZS51aS5pZGUsDQotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvciwNCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24sDQotIG9yZy5lY2xpcHNlLmpkdC51aSwNCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSwNCi0gb3JnLmVjbGlwc2UuanN0LmplZS51aSwNCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWksDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscw0KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5DQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41DQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5hY3Rpb25zLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnZhbGlkYXRpb24NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDEwYWZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkF1Z3VzdCAxNSwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmNGU3OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXQuaHRtbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzdjYjg5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgTGFuZ3VhZ2UgRmlsZSBmb3IgdGhpcyBQbHVnaW4NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBHZW5lcmljIExhYmVsIGFuZCBEZXNjcmlwdGlvbg0KLUJ1bmRsZS1OYW1lLjA9RE9NIEludGVncmF0aW9uIChJbmN1YmF0aW9uKQ0KLUJ1bmRsZS1WZW5kb3IuMD1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQ0KLQ0KLURvbVZhbGlkYXRvcl9OYW1lID0gV2ViIFNlcnZpY2VzIFZhbGlkYXRpb24NCi1Eb21WYWxpZGF0aW9uX01hcmtlck5hbWUgPSBXZWIgU2VydmljZXMgUHJvYmxlbSBNYXJrZXINCi1uYXZpZ2F0b3JDb250ZW50Lm5hbWUuMCA9IEpBWC1XUyBXZWIgU2VydmljZXMgRWxlbWVudHMNCi1kZWNvcmF0b3IubGFiZWwuMCA9IFdlYiBTZXJ2aWNlIERlY29yYXRvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwMzc5NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+DQotPCEtLQ0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICAgDQotICAgIENvbnRyaWJ1dG9yczoNCi0gICAgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAtLT4NCi0NCi08cGx1Z2luPg0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0Lml0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3JpZXMiPg0KLQkJPGZhY3RvcnkgDQotCQkJdXJpID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2RvbS5lY29yZSIgDQotCQkJY2xhc3MgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiIA0KLQkJCXN1cHBvcnRlZFR5cGVzID0gDQotCQkJCSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcg0KLQkJCQlvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXINCi0JCQkJb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyDQotCQkJCW9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcg0KLQkJCQlvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlIiAvPg0KLQk8L2V4dGVuc2lvbj4NCi0JDQotICA8IS0tIHt7eyBEZWZpbmVzIGludGVncmF0aW9uIGZvciBET00gb2JqZWN0cyB0byBuYXZpZ2F0aW9uIHRyZWUgLS0+DQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4gDQotCQk8bmF2aWdhdG9yQ29udGVudA0KLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QubmF2aWdhdG9yLmoyZWUudWkuc2FwV1MiDQotCQkJY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciINCi0JCQlsYWJlbFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIiDQotCQkJYWN0aXZlQnlEZWZhdWx0PSJ0cnVlIg0KLQkJCW5hbWU9IiVuYXZpZ2F0b3JDb250ZW50Lm5hbWUuMCINCi0JCQlwcmlvcml0eT0iaGlnaGVzdCI+DQotCQkJPHRyaWdnZXJQb2ludHM+DQotCQkJCTxvcj4NCi0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIgLz4NCi0JCQkJPC9vcj4NCi0JCQk8L3RyaWdnZXJQb2ludHM+DQotCQkJPHBvc3NpYmxlQ2hpbGRyZW4+DQotCQkJCTxvcj4NCi0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlIi8+DQotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIi8+DQotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kIi8+DQotCQkJCTwvb3I+DQotCQkJPC9wb3NzaWJsZUNoaWxkcmVuPg0KLQkJCTxhY3Rpb25Qcm92aWRlcg0KLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9ucy5XU0FjdGlvblByb3ZpZGVyIg0KLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9ucy5XU0FjdGlvblByb3ZpZGVyIj4NCi0JCQkJPGVuYWJsZW1lbnQ+DQotCQkJCQk8b3I+DQotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuIi8+DQotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UiLz4NCi0JCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIi8+DQotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCIvPg0KLQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSIvPg0KLQkJCQkJPC9vcj4NCi0JCQkJPC9lbmFibGVtZW50Pg0KLQkJCTwvYWN0aW9uUHJvdmlkZXI+DQotCQk8L25hdmlnYXRvckNvbnRlbnQ+DQotCTwvZXh0ZW5zaW9uPg0KLQkNCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZGVjb3JhdG9ycyI+DQotCQk8ZGVjb3JhdG9yDQotCQkJYWRhcHRhYmxlPSJ0cnVlIg0KLSAgICAgICAgICAgIGxvY2F0aW9uPSJCT1RUT01fUklHSFQiDQotICAgICAgICAgICAgbGlnaHR3ZWlnaHQ9ImZhbHNlIg0KLSAgICAgICAgICAgIGxhYmVsPSIlZGVjb3JhdG9yLmxhYmVsLjAiDQotICAgICAgICAgICAgc3RhdGU9InRydWUiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLldlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvciINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuV2ViU2VydmljZURlY29yYXRvciI+DQotCQkJPGVuYWJsZW1lbnQ+DQotCQkJCTxvcj4NCi0JCQkJCTxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JU0VJQ2hpbGRMaXN0Ii8+DQotCQkJCQk8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSVdlYlNlcnZpY2VDaGlsZExpc3QiLz4NCi0JCQkJCTxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCIvPg0KLQkJCQkJPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCIvPg0KLQkJCQkJPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtIi8+DQotCQkJCQk8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSIvPg0KLQkJCQkJPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIvPg0KLQkJCQk8L29yPg0KLQkJCTwvZW5hYmxlbWVudD4NCi0JCTwvZGVjb3JhdG9yPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgPCEtLSB9fX0gLS0+DQotICA8IS0tIHt7eyBEZWZpbmVzIGludGVncmF0aW9uIGZvciBET00gb2JqZWN0cyB0byBwcm9wZXJ0aWVzIHZpZXcgLS0+DQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4NCi0JCTxmYWN0b3J5DQotCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSINCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkiPg0KLQkJCTxhZGFwdGVyDQotCQkJCXR5cGU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXIiPg0KLQkJCTwvYWRhcHRlcj4NCi0JCTwvZmFjdG9yeT4NCi0JCTxmYWN0b3J5DQotCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIg0KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSI+DQotCQkJPGFkYXB0ZXINCi0JCQkJdHlwZT0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlciI+DQotCQkJPC9hZGFwdGVyPg0KLQkJPC9mYWN0b3J5Pg0KLQkJPGZhY3RvcnkNCi0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCINCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkiPg0KLQkJCTxhZGFwdGVyDQotCQkJCXR5cGU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXIiPg0KLQkJCTwvYWRhcHRlcj4NCi0JCTwvZmFjdG9yeT4NCi0JCTxmYWN0b3J5DQotCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kIg0KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSI+DQotCQkJPGFkYXB0ZXINCi0JCQkJdHlwZT0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlciI+DQotCQkJPC9hZGFwdGVyPg0KLQkJPC9mYWN0b3J5Pg0KLQkJPGZhY3RvcnkNCi0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSINCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkiPg0KLQkJCTxhZGFwdGVyDQotCQkJCXR5cGU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXIiPg0KLQkJCTwvYWRhcHRlcj4NCi0JCTwvZmFjdG9yeT4JCQ0KLQkJPGZhY3RvcnkNCi0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLklET01Qcm9wZXJ0eVZhbHVlIg0KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01JdGVtVmFsdWVQcm9wZXJ0eVNvdXJjZUZhY3RvcnkiPg0KLQkJCTxhZGFwdGVyDQotCQkJCXR5cGU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlIj4NCi0JCQk8L2FkYXB0ZXI+DQotCQk8L2ZhY3Rvcnk+CQkNCi0gICA8L2V4dGVuc2lvbj4NCi08IS0tIH19fSAtLT4NCi08IS0tIHt7eyBEZWZpbmVzIGludGVncmF0aW9uIGZvciBXU1QgdmFsaWRhdGlvbiBmcmFtZXdvcmsgLS0+DQotICAgPGV4dGVuc2lvbg0KLQkgICAgICAgICBpZD0id3NWYWxpZGF0b3IiDQotCSAgICAgICAgIG5hbWU9IiVEb21WYWxpZGF0b3JfTmFtZSINCi0JICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvciI+DQotCSAgICAgIAk8dmFsaWRhdG9yPg0KLQkJICAgICAgICAgPGZpbHRlciBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiIG5hbWVGaWx0ZXI9IiouamF2YSIgLz4NCi0JCSAgICAgICAgIDxtYXJrZXJJZCBtYXJrZXJJZFZhbHVlPSJXc1ZhbGlkYXRvck1hcmtlciIgLz4NCi0JCSAgICAgICAgIDxoZWxwZXINCi0JCSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnZhbGlkYXRpb24uRG9tVmFsaWRhdGlvbkhlbHBlciI+DQotCQkgICAgICAgICA8L2hlbHBlcj4NCi0JCSAgICAgICAgIDxydW4NCi0JCSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnZhbGlkYXRpb24uRG9tVmFsaWRhdGlvbk1hbmFnZXIiPg0KLQkJICAgICAgICAgPC9ydW4+DQotCSAgICAgIAk8L3ZhbGlkYXRvcj4JICAgICAgCQ0KLQk8L2V4dGVuc2lvbj4NCi0JPGV4dGVuc2lvbg0KLSAgICAgICAgIGlkPSJXc1ZhbGlkYXRvck1hcmtlciINCi0gICAgICAgICBuYW1lPSIlRG9tVmFsaWRhdGlvbl9NYXJrZXJOYW1lIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4NCi0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvYmxlbW1hcmtlciIvPg0KLSAgICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50ZXh0bWFya2VyIi8+ICAgICAgDQotICAgICAgPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiIC8+DQotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLTwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC9wbHVnaW4vRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL2ludGVybmFsL3BsdWdpbi9Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0NDIxYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL2ludGVybmFsL3BsdWdpbi9Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24uaW50ZXJuYWwucGx1Z2luOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOw0KLQ0KLXB1YmxpYyBjbGFzcyBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzIGV4dGVuZHMgTkxTDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5pbnRlcm5hbC5wbHVnaW4uRG9tSW50ZWdyYXRpb25NZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX0pheFdzV2ViU2VydmljZXNMYWJlbDsNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX0xvYWRpbmdDYW5jZWxlZExhYmVsOw0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfTG9hZGluZ0R1bW15TGFiZWw7DQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9TZWlMYWJlbDsNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX1dlYlNlcnZpY2VzTGFiZWw7DQotDQotCS8qKiBtZXNzYWdlIGNvbnN0YW50ICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5XU1Jlc291cmNlQWN0aW9uX05hbWU7DQotDQotCS8qKiBtZXNzYWdlIGNvbnN0YW50ICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbl9TaG93SW5XZWJTZXJ2aWNlc0FyZWFBY3Rpb247DQotDQotCS8qKiBtZXNzYWdlIGNvbnN0YW50ICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbl9TaG93SW5FSkJBcmVhQWN0aW9uOw0KLQ0KLQkvKiogbWVzc2FnZSBjb25zdGFudCAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RGaWxlc1RvQ2hlY2tvdXREbGdUaXRsZTsNCi0JDQotCS8qKiBtZXNzYWdlIGNvbnN0YW50ICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEZpbGVzVG9DaGVja291dERsZ1RibFRpdGxlOwkNCi0NCi0JLyoqIG1lc3NhZ2UgY29uc3RhbnQgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0RmlsZXNUb0NoZWNrb3V0X0NhbmNlbGVkTWVzc2FnZTsJDQotCQkNCi0JDQotCXN0YXRpYw0KLQl7DQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLmNsYXNzKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vaW50ZXJuYWwvcGx1Z2luL0RvbUludGVncmF0aW9uTWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC9wbHVnaW4vRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwN2Y5NTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC9wbHVnaW4vRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLURPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9KYXhXc1dlYlNlcnZpY2VzTGFiZWwJCT0gSkFYLVdTIFdlYiBTZXJ2aWNlcw0KLURPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9Mb2FkaW5nQ2FuY2VsZWRMYWJlbAkJCT0gTG9hZGluZyBDYW5jZWxlZA0KLURPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9Mb2FkaW5nRHVtbXlMYWJlbAkJCT0gTG9hZGluZy4uLg0KLURPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9TZWlMYWJlbAkJCQkJCT0gU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzDQotRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX1dlYlNlcnZpY2VzTGFiZWwJCQkJPSBXZWIgU2VydmljZXMNCi0NCi1PcGVuV1NSZXNvdXJjZUFjdGlvbl9OYW1lCQkJCQkJCQkJPSBPcGVuDQotDQotTmF2aWdhdGVUb0ltcGxlbWVudGF0aW9uQWN0aW9uX1Nob3dJbldlYlNlcnZpY2VzQXJlYUFjdGlvbgk9IExvY2F0ZSBpbiBXZWIgU2VydmljZXMgTm9kZQ0KLU5hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbl9TaG93SW5FSkJBcmVhQWN0aW9uCQkJPSBMb2NhdGUgaW4gRGVwbG95bWVudCBEZXNjcmlwdG9yIE5vZGUNCi0NCi0NCi1TZWxlY3RGaWxlc1RvQ2hlY2tvdXREbGdUaXRsZQkJCQkJCQkJPSBDb25maXJtIHJlc291cmNlIGNoZWNrb3V0DQotU2VsZWN0RmlsZXNUb0NoZWNrb3V0RGxnVGJsVGl0bGUJCQkJCQkJPSBUaGUgZm9sbG93aW5nIHJlc291cmNlcyBuZWVkIHRvIGJlIGNoZWNrZWQgb3V0IGR1cmluZyB0aGUgb3BlcmF0aW9uDQotU2VsZWN0RmlsZXNUb0NoZWNrb3V0X0NhbmNlbGVkTWVzc2FnZQkJCQkJCT0gT3BlcmF0aW9uIGNhbm5vdCBjb250aW51ZSBhcyByZXNvdXJjZXMgY2hlY2tvdXQgaGFzIGJlZW4gY2FuY2VsZWQNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vaW50ZXJuYWwvcGx1Z2luL0RvbUludGVncmF0aW9uUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vaW50ZXJuYWwvcGx1Z2luL0RvbUludGVncmF0aW9uUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhOWFiMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL2ludGVybmFsL3BsdWdpbi9Eb21JbnRlZ3JhdGlvblBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnBsdWdpbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsNCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7DQotDQotLyoqDQotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlDQotICovDQotcHVibGljIGNsYXNzIERvbUludGVncmF0aW9uUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7DQotDQotCS8vIFRoZSBwbHVnLWluIElEDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uIjsNCi0NCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQ0KLQlwcml2YXRlIHN0YXRpYyBEb21JbnRlZ3JhdGlvblBsdWdpbiBwbHVnaW47DQotCQ0KLQlwcml2YXRlIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOw0KLQkNCi0JLyoqDQotCSAqIFRoZSBjb25zdHJ1Y3Rvcg0KLQkgKi8NCi0JcHVibGljIERvbUludGVncmF0aW9uUGx1Z2luKCkgew0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlzdXBlci5zdGFydChjb250ZXh0KTsNCi0JCXBsdWdpbiA9IHRoaXM7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlwbHVnaW4gPSBudWxsOw0KLQkJc3VwZXIuc3RvcChjb250ZXh0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlDQotCSAqDQotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBEb21JbnRlZ3JhdGlvblBsdWdpbiBnZXREZWZhdWx0KCkgew0KLQkJcmV0dXJuIHBsdWdpbjsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFByb3ZpZGVyKGZpbmFsIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKQ0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0obGFiZWxQcm92aWRlciwgImxhYmVsUHJvdmlkZXIiKTsgLy8kTk9OLU5MUy0xJA0KLQkJdGhpcy5sYWJlbFByb3ZpZGVyID0gbGFiZWxQcm92aWRlcjsNCi0JfQ0KLQkNCi0JcHVibGljIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkNCi0Jew0KLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXI7DQotCX0NCi0JDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC91dGlsL1Byb2plY3RFeHBsb3JlclV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC91dGlsL1Byb2plY3RFeHBsb3JlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODJmNjhmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vaW50ZXJuYWwvdXRpbC9Qcm9qZWN0RXhwbG9yZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24uaW50ZXJuYWwudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KLQ0KLS8qKg0KLSAqIFV0aWxpdHkgY2xhc3MgdGhhdCBob2xkcyBtZXRob2RzIHRvIG1hbmlwdWxhdGUgUHJvamVjdEV4cGxvcmVyIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUHJvamVjdEV4cGxvcmVyVXRpbCANCi17DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJvamVjdEV4cGxvcmVyVXRpbCBJTlNUQU5DRSA9IG5ldyBQcm9qZWN0RXhwbG9yZXJVdGlsKCk7DQotCQ0KLQkvKioNCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGZyb20gVUkgdGhyZWFkIG90aGVyd2lzZSA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHJldHVybmVkDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IGV4cGxvcmVyIHtAbGluayBJVmlld1BhcnR9IGluIGNhc2UgaXQgaXMgYXZhaWxhYmxlIG90aGVyd2lzZSA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JcHVibGljIElWaWV3UGFydCBmaW5kUHJvamVjdEV4cGxvcmVyKCkNCi0Jew0KLQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW4gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOw0KLQkJaWYgKHdvcmtiZW5jaFdpbj09bnVsbCB8fCB3b3JrYmVuY2hXaW4uZ2V0QWN0aXZlUGFnZSgpPT1udWxsKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotCQkNCi0JCXJldHVybiB3b3JrYmVuY2hXaW4uZ2V0QWN0aXZlUGFnZSgpLmZpbmRWaWV3KCJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJvamVjdEV4cGxvcmVyIik7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0N1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0N1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1ZjI1MjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9DdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBGYWN0b3J5IHRoYXQgYWRhcHRzIERPTSBvYmplY3RzIHdpdGggSXRlbSBwcm92aWRlciBhZGFwdGVycy4gRm9yIHtAbGluayBJU0VJQ2hpbGRMaXN0fSBhbmQgDQotICoge0BsaW5rIElXZWJTZXJ2aWNlQ2hpbGRMaXN0fSBpdCBjcmVhdGVzIHNwZWNpZmljIGFkYXB0ZXIgZm9yIG90aGVyIERPTSBvYmplY3RzIGRlbGVnYXRlcyB0bw0KLSAqIHtAbGluayBEb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeX0uDQotICogDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IA0KLXsNCi0JLyoqDQotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsNCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKi8NCi0JcHJpdmF0ZSBDdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIA0KLQl7DQotCQlzdXBlcigpOw0KLQkJDQotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVdlYlNlcnZpY2VDaGlsZExpc3QuY2xhc3MpOw0KLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElTRUlDaGlsZExpc3QuY2xhc3MpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgQWRhcHRlciBjcmVhdGVJV2ViU2VydmljZUNoaWxkTGlzdEFkYXB0ZXIoZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvaikgDQotCXsNCi0JCXJldHVybiBuZXcgSVdlYlNlcnZpY2VDaGlsZExpc3QoKQ0KLQkJCXsNCi0JCQkJcHVibGljIEVMaXN0PElXZWJTZXJ2aWNlPiBnZXRXU0NoaWxkTGlzdCgpDQotCQkJCXsNCi0JCQkJCXJldHVybiB3c1Byb2ouZ2V0V2ViU2VydmljZXMoKTsNCi0JCQkJfQ0KLQ0KLQkJCQlwdWJsaWMgTm90aWZpZXIgZ2V0VGFyZ2V0KCkgDQotCQkJCXsNCi0JCQkJCXJldHVybiB3c1Byb2o7DQotCQkJCX0NCi0NCi0JCQkJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgDQotCQkJCXsNCi0JCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJfQ0KLQ0KLQkJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIA0KLQkJCQl7DQotCQkJCQkvLyBubyBwcm9jZXNzaW5nIG5lZWRlZCBjdXJyZW50bHkNCi0JCQkJfQ0KLQ0KLQkJCQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSANCi0JCQkJew0KLQkJCQkJLy8gbm8gcHJvY2Vzc2luZyBuZWVkZWQgY3VycmVudGx5DQotCQkJCX0NCi0JCQl9Ow0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgQWRhcHRlciBjcmVhdGVJU0VJQ2hpbGRMaXN0QWRhcHRlcihmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qKSANCi0Jew0KLQkJcmV0dXJuIG5ldyBJU0VJQ2hpbGRMaXN0KCkNCi0JCQl7DQotCQkJCXB1YmxpYyBFTGlzdDxJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPiBnZXRTRUlDaGlsZExpc3QoKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gd3NQcm9qLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKTsNCi0JCQkJfQ0KLQ0KLQkJCQlwdWJsaWMgTm90aWZpZXIgZ2V0VGFyZ2V0KCkgDQotCQkJCXsNCi0JCQkJCXJldHVybiB3c1Byb2o7DQotCQkJCX0NCi0NCi0JCQkJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgDQotCQkJCXsNCi0JCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJfQ0KLQ0KLQkJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIA0KLQkJCQl7DQotCQkJCQkvLyBubyBwcm9jZXNzaW5nIG5lZWRlZCBjdXJyZW50bHkNCi0JCQkJfQ0KLQ0KLQkJCQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSANCi0JCQkJew0KLQkJCQkJLy8gbm8gcHJvY2Vzc2luZyBuZWVkZWQgY3VycmVudGx5DQotCQkJCX0NCi0JCQl9Ow0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKQ0KLQl7DQotCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBJV2ViU2VydmljZVByb2plY3QgJiYgdHlwZSBpbnN0YW5jZW9mIENsYXNzKQ0KLQkJew0KLQkJCWlmKHR5cGUuZXF1YWxzKElXZWJTZXJ2aWNlQ2hpbGRMaXN0LmNsYXNzKSkNCi0JCQl7DQotCQkJCXJldHVybiBhZGFwdElXZWJTZXJ2aWNlQ2hpbGRMaXN0KChJV2ViU2VydmljZVByb2plY3Qpbm90aWZpZXIpOw0KLQkJCX0NCi0JCQllbHNlIGlmKHR5cGUuZXF1YWxzKElTRUlDaGlsZExpc3QuY2xhc3MpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGFkYXB0SVNFSUNoaWxkTGlzdCgoSVdlYlNlcnZpY2VQcm9qZWN0KW5vdGlmaWVyKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdHlwZSk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBBZGFwdGVyIGFkYXB0SVNFSUNoaWxkTGlzdChmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0KQ0KLQl7DQotCQlmb3IoQWRhcHRlciBhZGFwdGVyIDogd3NQcm9qZWN0LmVBZGFwdGVycygpKQ0KLQkJew0KLQkJCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KSB7DQotCQkJCXJldHVybiBhZGFwdGVyOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJZmluYWwgQWRhcHRlciBhZGFwdGVyID0gY3JlYXRlSVNFSUNoaWxkTGlzdEFkYXB0ZXIod3NQcm9qZWN0KTsNCi0JCWFzc29jaWF0ZShhZGFwdGVyLCB3c1Byb2plY3QpOw0KLQkJDQotCQlyZXR1cm4gYWRhcHRlcjsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIEFkYXB0ZXIgYWRhcHRJV2ViU2VydmljZUNoaWxkTGlzdChmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0KQ0KLQl7DQotCQlmb3IoQWRhcHRlciBhZGFwdGVyIDogd3NQcm9qZWN0LmVBZGFwdGVycygpKQ0KLQkJew0KLQkJCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkgew0KLQkJCQlyZXR1cm4gYWRhcHRlcjsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWZpbmFsIEFkYXB0ZXIgYWRhcHRlciA9IGNyZWF0ZUlXZWJTZXJ2aWNlQ2hpbGRMaXN0QWRhcHRlcih3c1Byb2plY3QpOw0KLQkJYXNzb2NpYXRlKGFkYXB0ZXIsIHdzUHJvamVjdCk7DQotCQkNCi0JCXJldHVybiBhZGFwdGVyOwkJDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YzBlM2RkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5pbnRlcm5hbC51dGlsLlByb2plY3RFeHBsb3JlclV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklMb2FkaW5nV3NQcm9qZWN0LklMb2FkaW5nQ2FuY2VsZWQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklMb2FkaW5nV3NQcm9qZWN0LklMb2FkaW5nRHVtbXk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NET01SdW50aW1lRXh0ZW5zaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RvbUxvYWRMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTVJ1bnRpbWVNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucmVnaXN0cnkuSVdzRE9NUnVudGltZUluZm87DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeS5Xc0RPTVJ1bnRpbWVSZWdpc3RyeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmZhY2V0cy5GYWNldFV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5Mb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25OYXZpZ2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25WaWV3ZXI7DQotDQotLyoqIA0KLSAqIENvbnRlbnQgcHJvdmlkZXIgZm9yIERPTSByZWxhdGVkIG9iamVjdHMNCi0gKiANCi0gKiBAYXV0aG9yIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyDQotew0KLQlwcml2YXRlIE1hcDxJV3NET01SdW50aW1lRXh0ZW5zaW9uLCBJV3NEb21Mb2FkTGlzdGVuZXI+IGxvYWRMaXN0ZW5lcnMgPSBuZXcgSGFzaE1hcDxJV3NET01SdW50aW1lRXh0ZW5zaW9uLCBJV3NEb21Mb2FkTGlzdGVuZXI+KCk7IA0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoKQ0KLQl7DQotCQl0aGlzKEN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQ0KLQkgKi8NCi0JcHVibGljIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KQ0KLQl7DQotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oZmluYWwgT2JqZWN0IGNvbnRleHQpDQotCXsNCi0JCWlmIChjb250ZXh0IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkNCi0JCXsNCi0JCQlyZXR1cm4gZ2V0V3NQcm9qZWN0KChJUHJvamVjdCkoKElBZGFwdGFibGUpIGNvbnRleHQpLmdldEFkYXB0ZXIoSVByb2plY3QuY2xhc3MpKTsNCi0JCX0NCi0JCWVsc2UgaWYoY29udGV4dCBpbnN0YW5jZW9mIElMb2FkaW5nV3NQcm9qZWN0KSANCi0JCXsNCi0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgKChJTG9hZGluZ1dzUHJvamVjdCljb250ZXh0KS5pc0xvYWRDYW5jZWxlZCgpID8gbmV3IElMb2FkaW5nQ2FuY2VsZWQoKXt9IDogbmV3IElMb2FkaW5nRHVtbXkoKXt9IH07DQotCQl9DQotCQllbHNlIGlmKGNvbnRleHQgaW5zdGFuY2VvZiBJV2ViU2VydmljZVByb2plY3QpDQotCQl7DQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXXsgYWRhcHRlckZhY3RvcnkuYWRhcHQoY29udGV4dCwgSVNFSUNoaWxkTGlzdC5jbGFzcyksDQotCQkJCQlhZGFwdGVyRmFjdG9yeS5hZGFwdChjb250ZXh0LCBJV2ViU2VydmljZUNoaWxkTGlzdC5jbGFzcykgfTsNCi0JCX0NCi0JCWVsc2UgaWYoY29udGV4dCBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJew0KLQkJCU9iamVjdFtdIHdlYlNlcnZpY2VzID0gKChJV2ViU2VydmljZUNoaWxkTGlzdCljb250ZXh0KS5nZXRXU0NoaWxkTGlzdCgpLnRvQXJyYXkoKTsNCi0JCQkNCi0JCQlmb3IoaW50IGlpPTA7IGlpPHdlYlNlcnZpY2VzLmxlbmd0aDsgaWkrKykNCi0JCQl7DQotCQkJCWFkYXB0ZXJGYWN0b3J5LmFkYXB0KHdlYlNlcnZpY2VzW2lpXSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsNCi0JCQl9DQotCQkJDQotCQkJcmV0dXJuIHdlYlNlcnZpY2VzOw0KLQkJfQ0KLQkJZWxzZSBpZihjb250ZXh0IGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCXsNCi0JCQlPYmplY3RbXSBzRUlzID0gKChJU0VJQ2hpbGRMaXN0KWNvbnRleHQpLmdldFNFSUNoaWxkTGlzdCgpLnRvQXJyYXkoKTsNCi0JCQkNCi0JCQlmb3IoaW50IGlpPTA7IGlpPHNFSXMubGVuZ3RoOyBpaSsrKQ0KLQkJCXsNCi0JCQkJYWRhcHRlckZhY3RvcnkuYWRhcHQoc0VJc1tpaV0sIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7DQotCQkJfQ0KLQkJCQ0KLQkJCXJldHVybiBzRUlzOw0KLQkJfQ0KLQkJZWxzZSBpZihjb250ZXh0IGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpDQotCQl7DQotCQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSAoKElXZWJTZXJ2aWNlKWNvbnRleHQpLmdldFNlcnZpY2VFbmRwb2ludCgpOw0KLQkJCWlmIChzZWkgPT0gbnVsbCkgew0KLQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsNCi0JCQl9DQotCQkJDQotCQkJYWRhcHRlckZhY3RvcnkuYWRhcHQoc2VpLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOw0KLQkJCXJldHVybiBuZXcgT2JqZWN0W117IHNlaSB9Ow0KLQkJfQ0KLQkJZWxzZSBpZihjb250ZXh0IGluc3RhbmNlb2YgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkgew0KLQkJCXJldHVybiBleHRyYWN0TWV0aG9kcygoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkgY29udGV4dCk7DQotCQl9DQotCQllbHNlIGlmIChjb250ZXh0IGluc3RhbmNlb2YgSVdlYk1ldGhvZCkgew0KLQkJCXJldHVybiBleHRyYWN0UGFyYW1zKChJV2ViTWV0aG9kKWNvbnRleHQpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIE9iamVjdFtdIGdldFdzUHJvamVjdChmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSANCi0Jew0KLQkJdHJ5IHsNCi0JCQlmaW5hbCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIHJ1bnRpbWUgPSBnZXRTdXBwb3J0aW5nUnVudGltZShwcm9qZWN0KTsNCi0JCQlpZiAocnVudGltZSA9PSBudWxsKSB7DQotCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOw0KLQkJCX0NCi0JCQkNCi0JCQkvLyBXUyBwcm9qZWN0IGlzIGxvYWRlZCBhbHJlYWR5DQotCQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCA9IGdldFdzUHJvamVjdChydW50aW1lLmdldERPTSgpLCBwcm9qZWN0KTsgDQotCQkJaWYgKHdzUHJvamVjdCAhPSBudWxsKQ0KLQkJCXsNCi0JCQkJYWRhcHRlckZhY3RvcnkuYWRhcHQod3NQcm9qZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOw0KLQkJCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgd3NQcm9qZWN0IH07DQotCQkJfQ0KLQkJCQ0KLQkJCWFkZFJ1bnRpbWVMb2FkTGlzdGVuZXIocnVudGltZSk7DQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IG5ldyBMb2FkaW5nV3NQcm9qZWN0KHByb2plY3QsIGZhbHNlKSB9Ow0KLQkJfSANCi0JCWNhdGNoIChXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiBlKSB7IC8vICRKTC1FWEMkDQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IG5ldyBMb2FkaW5nV3NQcm9qZWN0KHByb2plY3QsIHRydWUpIH07IA0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdzRG9tTG9hZExpc3RlbmVyIGFkZFJ1bnRpbWVMb2FkTGlzdGVuZXIoZmluYWwgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBydW50aW1lKSANCi0Jew0KLQkJSVdzRG9tTG9hZExpc3RlbmVyIGxvYWRMaXN0ZW5lciA9IGxvYWRMaXN0ZW5lcnMuZ2V0KHJ1bnRpbWUpOyANCi0JCWlmIChsb2FkTGlzdGVuZXIhPW51bGwpIHsNCi0JCQlyZXR1cm4gbG9hZExpc3RlbmVyOw0KLQkJfQ0KLQkJDQotCQlsb2FkTGlzdGVuZXIgPSBuZXcgTG9hZExpc3RlbmVyKHJ1bnRpbWUpOwkJDQotCQlsb2FkTGlzdGVuZXJzLnB1dChydW50aW1lLCBsb2FkTGlzdGVuZXIpOwkJDQotCQlydW50aW1lLmFkZExvYWRMaXN0ZW5lcihsb2FkTGlzdGVuZXIpOw0KLQkJDQotCQlyZXR1cm4gbG9hZExpc3RlbmVyOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZXh0cmFjdE1ldGhvZHMoZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkpIA0KLQl7DQotCQlmaW5hbCBMaXN0PElXZWJNZXRob2Q+IHdlYk1ldGhvZHMgPSBzZWkuZ2V0V2ViTWV0aG9kcygpOw0KLQkJZm9yIChJV2ViTWV0aG9kIHdlYk1ldGhvZCA6IHdlYk1ldGhvZHMpIHsNCi0JCQlhZGFwdGVyRmFjdG9yeS5hZGFwdCh3ZWJNZXRob2QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7DQotCQl9DQotCQkNCi0JCXJldHVybiB3ZWJNZXRob2RzLnRvQXJyYXkoKTsJCQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZXh0cmFjdFBhcmFtcyhmaW5hbCBJV2ViTWV0aG9kIG1ldGhvZCkgDQotCXsNCi0JCWZpbmFsIExpc3Q8SVdlYlBhcmFtPiBwYXJhbXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpOw0KLQkJZm9yIChJV2ViUGFyYW0gd2ViUGFyYW0gOiBwYXJhbXMpIHsNCi0JCQlhZGFwdGVyRmFjdG9yeS5hZGFwdCh3ZWJQYXJhbSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHBhcmFtcy50b0FycmF5KCk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkNCi0Jew0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJV2ViU2VydmljZVByb2plY3QpDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9hZGluZ1dzUHJvamVjdCkgDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCXsNCi0JCQlyZXR1cm4gISgoSVdlYlNlcnZpY2VDaGlsZExpc3QpZWxlbWVudCkuZ2V0V1NDaGlsZExpc3QoKS5pc0VtcHR5KCk7DQotCQl9DQotCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJew0KLQkJCXJldHVybiAhKChJU0VJQ2hpbGRMaXN0KWVsZW1lbnQpLmdldFNFSUNoaWxkTGlzdCgpLmlzRW1wdHkoKTsNCi0JCX0NCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJV2ViU2VydmljZSkNCi0JCXsNCi0JCQlyZXR1cm4gKChJV2ViU2VydmljZSkgZWxlbWVudCkuZ2V0U2VydmljZUVuZHBvaW50KCkgIT0gbnVsbDsgDQotCQl9DQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkNCi0JCXsNCi0JCQlyZXR1cm4gISgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSllbGVtZW50KS5nZXRXZWJNZXRob2RzKCkuaXNFbXB0eSgpOw0KLQkJfQ0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXZWJNZXRob2QpDQotCQl7DQotCQkJcmV0dXJuICEoKElXZWJNZXRob2QpZWxlbWVudCkuZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKTsNCi0JCX0NCi0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlUHJvamVjdCBnZXRXc1Byb2plY3QoZmluYWwgSURPTSBkb20sIGZpbmFsIElQcm9qZWN0IHByb2plY3QpDQotCXsNCi0JCWlmIChkb20gPT0gbnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQlmb3IgKElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgOiBkb20uZ2V0V2ViU2VydmljZVByb2plY3RzKCkpIHsNCi0JCQlpZih3c1Byb2plY3QuZ2V0TmFtZSgpLmVxdWFscyhwcm9qZWN0LmdldE5hbWUoKSkpIHsNCi0JCQkJcmV0dXJuIHdzUHJvamVjdDsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBnZXRTdXBwb3J0aW5nUnVudGltZShmaW5hbCBJUHJvamVjdCBwcm9qZWN0KQ0KLQl7DQotCQlmaW5hbCBDb2xsZWN0aW9uPElXc0RPTVJ1bnRpbWVJbmZvPiBkb21SdW50aW1lSW5mb3MgPSBXc0RPTVJ1bnRpbWVSZWdpc3RyeS5nZXRSZWdpc3RlcmVkUnVudGltZXNJbmZvKCk7DQotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGZhY2V0czsNCi0JCWZvciAoSVdzRE9NUnVudGltZUluZm8gZG9tUnVudGltZUluZm8gOiBkb21SdW50aW1lSW5mb3MpIA0KLQkJew0KLQkJCWZhY2V0cyA9IGRvbVJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKTsNCi0JCQlpZiAoaGFzRmFjZXQoZmFjZXRzLCBwcm9qZWN0KSkgew0KLQkJCQlyZXR1cm4gZ2V0RG9tUnVudGltZShkb21SdW50aW1lSW5mby5nZXRJZCgpKTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzRmFjZXQoZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBmYWNldHMsIGZpbmFsIElQcm9qZWN0IHByb2plY3QpDQotCXsNCi0JCWZvciAoU3RyaW5nIGZhY2V0SWQgOiBmYWNldHMua2V5U2V0KCkpIA0KLQkJew0KLQkJCWlmIChmYWNldElkID09IG51bGwgfHwgZmFjZXRzLmdldChmYWNldElkKSA9PSBudWxsKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQl0cnkgew0KLQkJCQlpZiAoKG5ldyBGYWNldFV0aWxzKCkpLmhhc0ZhY2V0V2l0aFZlcnNpb24ocHJvamVjdCwgZmFjZXRzLmdldChmYWNldElkKSwgZmFjZXRJZCwgdHJ1ZSkpew0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCX0NCi0JCQl9IA0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkJKG5ldyBMb2dnZXIoKSkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBnZXREb21SdW50aW1lKFN0cmluZyBydW50aW1lSWQpIHsNCi0JCXJldHVybiBXc0RPTVJ1bnRpbWVNYW5hZ2VyLmluc3RhbmNlKCkuZ2V0RE9NUnVudGltZShydW50aW1lSWQpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ2xhc3MgdGhhdCBpcyB1c2VkIHRvIGxpc3RlbiB3aGVuIHRoZSBET00gbG9hZCB3aWxsIGJlIGZpbmlzaGVkLiBBZnRlciB0aGUgbG9hZCBoYXMgZmluaXNoZWQNCi0JICogdGhpcyBjbGFzcyB0cmF2ZXJzZXMgdGhlIHByb2plY3QgZXhwbG9yZXJzIHRyZWUgaW4gb3JkZXIgdG8gZmluZCBhbGwgaW5zdGFuY2VzIG9mDQotCSAqIHtAbGluayBJTG9hZGluZ1dzUHJvamVjdH0gYW5kIHN1YnN0aXR1dGUgdGhlbSB3aXRoIGxvYWRlZCB7QGxpbmsgSVdlYlNlcnZpY2VQcm9qZWN0fQ0KLQkgKiANCi0JICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLQkgKi8NCi0JcHJvdGVjdGVkIGNsYXNzIExvYWRMaXN0ZW5lciBpbXBsZW1lbnRzIElXc0RvbUxvYWRMaXN0ZW5lcg0KLQl7DQotCQlwcml2YXRlIGZpbmFsIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gcnVudGltZTsNCi0JCQ0KLQkJcHVibGljIExvYWRMaXN0ZW5lcihmaW5hbCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIHJ1bnRpbWUpIA0KLQkJew0KLQkJCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShydW50aW1lLCAicnVudGltZSIpOyAvLyROT04tTkxTLTEkDQotCQkJdGhpcy5ydW50aW1lID0gcnVudGltZTsNCi0JCX0NCi0JCQkNCi0JCXB1YmxpYyB2b2lkIGZpbmlzaGVkKCkgDQotCQl7DQotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpDQotCQkJew0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSANCi0JCQkJew0KLQkJCQkJZmluYWwgSVZpZXdQYXJ0IHZpZXdQYXJ0ID0gUHJvamVjdEV4cGxvcmVyVXRpbC5JTlNUQU5DRS5maW5kUHJvamVjdEV4cGxvcmVyKCk7DQotCQkJCQlpZiAodmlld1BhcnQgaW5zdGFuY2VvZiBDb21tb25OYXZpZ2F0b3IpIA0KLQkJCQkJew0KLQkJCQkJCWZpbmFsIENvbW1vblZpZXdlciBjb21tb25WaWV3ZXIgPSAoKENvbW1vbk5hdmlnYXRvcil2aWV3UGFydCkuZ2V0Q29tbW9uVmlld2VyKCk7DQotCQkJCQkJZm9yIChUcmVlSXRlbSBpdGVtIDogY29tbW9uVmlld2VyLmdldFRyZWUoKS5nZXRJdGVtcygpKSB7DQotCQkJCQkJCWV4Y2hhbmdlRHVtbXkoaXRlbSwgY29tbW9uVmlld2VyKTsNCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9KTsNCi0JCX0JCQ0KLQ0KLQkJcHJvdGVjdGVkIHZvaWQgZXhjaGFuZ2VEdW1teShmaW5hbCBUcmVlSXRlbSB0cmVlSXRlbSwgZmluYWwgQ29tbW9uVmlld2VyIGNvbW1vblZpZXdlcikgDQotCQl7DQotCQkJaWYgKHRyZWVJdGVtID09IG51bGwgfHwgdHJlZUl0ZW0uZ2V0RGF0YSgpIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VQcm9qZWN0KSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQkJDQotCQkJaWYgKHRyZWVJdGVtLmdldERhdGEoKSBpbnN0YW5jZW9mIElMb2FkaW5nV3NQcm9qZWN0KSB7DQotCQkJCWV4Y2hhbmdlVHJlZUl0ZW1EYXRhKHRyZWVJdGVtLCBjb21tb25WaWV3ZXIpOw0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJZm9yIChUcmVlSXRlbSBjaGlsZCA6IHRyZWVJdGVtLmdldEl0ZW1zKCkpIHsNCi0JCQkJCWV4Y2hhbmdlRHVtbXkoY2hpbGQsIGNvbW1vblZpZXdlcik7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlwcml2YXRlIHZvaWQgZXhjaGFuZ2VUcmVlSXRlbURhdGEoZmluYWwgVHJlZUl0ZW0gdHJlZUl0ZW0sIGZpbmFsIENvbW1vblZpZXdlciBjb21tb25WaWV3ZXIpIA0KLQkJew0KLQkJCWZpbmFsIElMb2FkaW5nV3NQcm9qZWN0IGxvYWRpbmdQcm9qZWN0ID0gKElMb2FkaW5nV3NQcm9qZWN0KXRyZWVJdGVtLmdldERhdGEoKTsNCi0JCQl0cnkgew0KLQkJCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gZ2V0V3NQcm9qZWN0KHJ1bnRpbWUuZ2V0RE9NKCksIGxvYWRpbmdQcm9qZWN0LmdldFByb2plY3QoKSk7DQotCQkJCWFkYXB0ZXJGYWN0b3J5LmFkYXB0KHdzUHJvamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsNCi0JCQkJdHJlZUl0ZW0uc2V0RGF0YSh3c1Byb2plY3QpOw0KLQ0KLQkJCX0gY2F0Y2ggKFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIGUpIHsgLy8gJEpMLUVYQyQNCi0JCQkJdHJlZUl0ZW0uc2V0RGF0YShuZXcgTG9hZGluZ1dzUHJvamVjdChsb2FkaW5nUHJvamVjdC5nZXRQcm9qZWN0KCksIHRydWUpKTsNCi0JCQl9DQotCQkJDQotCQkJY29tbW9uVmlld2VyLnJlZnJlc2gobG9hZGluZ1Byb2plY3QuZ2V0UHJvamVjdCgpKTsNCi0JCX0NCi0JCQ0KLQkJcHVibGljIHZvaWQgc3RhcnRlZCgpIHsNCi0JCQkvLyBub3RoaW5nIHRvIGRvIGhlcmUNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBjbGFzcyBMb2FkaW5nV3NQcm9qZWN0IGltcGxlbWVudHMgSUxvYWRpbmdXc1Byb2plY3QNCi0Jew0KLQkJZmluYWwgSVByb2plY3QgcHJvamVjdDsNCi0JCWZpbmFsIGJvb2xlYW4gaXNDYW5jZWxlZDsNCi0JCQ0KLQkJcHVibGljIExvYWRpbmdXc1Byb2plY3QoZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgYm9vbGVhbiBpc0NhbmNlbGVkKSB7DQotCQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKHByb2plY3QsICJwcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQNCi0JCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0Ow0KLQkJCXRoaXMuaXNDYW5jZWxlZCA9IGlzQ2FuY2VsZWQ7DQotCQl9DQotCQkNCi0JCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgew0KLQkJCXJldHVybiBwcm9qZWN0Ow0KLQkJfQ0KLQ0KLQkJcHVibGljIGJvb2xlYW4gaXNMb2FkQ2FuY2VsZWQoKSB7DQotCQkJcmV0dXJuIGlzQ2FuY2VsZWQ7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0ODRlOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnBsdWdpbi5Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnBsdWdpbi5Eb21JbnRlZ3JhdGlvblBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSUxvYWRpbmdXc1Byb2plY3QuSUxvYWRpbmdDYW5jZWxlZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSUxvYWRpbmdXc1Byb2plY3QuSUxvYWRpbmdEdW1teTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLkltYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSURlc2NyaXB0aW9uUHJvdmlkZXI7DQotDQotLyoqDQotICogRE9NIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGV4dGVuZHMge0BsaW5rIEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcn0gYnkgcHJvdmlkaW5nDQotICogaWNvbnMgYW5kIGxhYmVscyBmb3Igc29tZSBvYmplY3RzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIERPTSBhbmQgYWxzbyBvdmVycmlkZXMgc29tZQ0KLSAqIGxhYmVscw0KLSAqIA0KLSAqIEBhdXRob3IgDQotICovDQotcHVibGljIGNsYXNzIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElEZXNjcmlwdGlvblByb3ZpZGVyDQotew0KLQkvKioNCi0JICogRGVmYXVsdCBDb25zdHJ1Y3RvciB1c2VzIHtAbGluayBDdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeX0gYXMgZGVmYXVsdA0KLQkgKiBhZGFwdGVyIGZhY3RvcnkgcHJvdmlkZWQgdG8gdGhlIGJhc2UgY2xhc3MuDQotCSAqLw0KLQlwdWJsaWMgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKCkNCi0Jew0KLQkJc3VwZXIoQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UpOw0KLQkJDQotCQlEb21JbnRlZ3JhdGlvblBsdWdpbi5nZXREZWZhdWx0KCkuc2V0TGFiZWxQcm92aWRlcih0aGlzKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KQ0KLQl7DQotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQl7DQotCQkJcmV0dXJuIEltYWdlcy5JTlNUQU5DRS5nZXRJbWFnZShJbWFnZXMuSU1HX1dFQl9TRVJWSUNFX0dST1VQKTsNCi0JCX0NCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElTRUlDaGlsZExpc3QpDQotCQl7DQotCQkJcmV0dXJuIEltYWdlcy5JTlNUQU5DRS5nZXRJbWFnZShJbWFnZXMuSU1HX1NFSV9HUk9VUCk7DQotCQl9DQotCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9hZGluZ1dzUHJvamVjdCkgDQotCQl7DQotCQkJcmV0dXJuIEltYWdlcy5JTlNUQU5DRS5nZXRJbWFnZShJbWFnZXMuSU1HX0RPTV9XU19QUk9WSURFUik7DQotCQl9DQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUxvYWRpbmdEdW1teSB8fCBlbGVtZW50IGluc3RhbmNlb2YgSUxvYWRpbmdDYW5jZWxlZCkgDQotCQl7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotCQkNCi0JCXJldHVybiBzdXBlci5nZXRJbWFnZShlbGVtZW50KTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KQ0KLQl7DQotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSVdlYlNlcnZpY2VQcm9qZWN0IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9hZGluZ1dzUHJvamVjdCkNCi0JCXsNCi0JCQlyZXR1cm4gRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfSmF4V3NXZWJTZXJ2aWNlc0xhYmVsOyANCi0JCX0NCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUxvYWRpbmdEdW1teSkgDQotCQl7DQotCQkJcmV0dXJuIERvbUludGVncmF0aW9uTWVzc2FnZXMuRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX0xvYWRpbmdEdW1teUxhYmVsOw0KLQkJfQ0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9hZGluZ0NhbmNlbGVkKSANCi0JCXsNCi0JCQlyZXR1cm4gRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfTG9hZGluZ0NhbmNlbGVkTGFiZWw7DQotCQl9CQkNCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJew0KLQkJCXJldHVybiBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9XZWJTZXJ2aWNlc0xhYmVsOw0KLQkJfQ0KLQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCXsNCi0JCQlyZXR1cm4gRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfU2VpTGFiZWw7DQotCQl9DQotCQkNCi0JCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOw0KLQl9DQotCQ0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKE9iamVjdCBlbGVtZW50KQ0KLQl7DQotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpDQotCQl7DQotCQkJcmV0dXJuICgoSVdlYlNlcnZpY2UpZWxlbWVudCkuZ2V0TmFtZSgpOw0KLQkJfQ0KLQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkNCi0JCXsNCi0JCQlyZXR1cm4gKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKWVsZW1lbnQpLmdldE5hbWUoKTsNCi0JCX0NCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlUHJvamVjdCB8fCBlbGVtZW50IGluc3RhbmNlb2YgSUxvYWRpbmdXc1Byb2plY3QpDQotCQl7DQotCQkJcmV0dXJuIERvbUludGVncmF0aW9uTWVzc2FnZXMuRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX0pheFdzV2ViU2VydmljZXNMYWJlbDsNCi0JCX0NCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJew0KLQkJCXJldHVybiBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9XZWJTZXJ2aWNlc0xhYmVsOw0KLQkJfQ0KLQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCXsNCi0JCQlyZXR1cm4gRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfU2VpTGFiZWw7DQotCQl9DQotCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJV2ViTWV0aG9kKQ0KLQkJew0KLQkJCXJldHVybiAoKElXZWJNZXRob2QpZWxlbWVudCkuZ2V0TmFtZSgpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKE9iamVjdCBlbGVtZW50KSANCi0Jew0KLQkJZm9yIChJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxhYmVsUHJvdmlkZXJMaXN0ZW5lciA6IGxhYmVsUHJvdmlkZXJMaXN0ZW5lcnMpIHsNCi0JCQlsYWJlbFByb3ZpZGVyTGlzdGVuZXIubGFiZWxQcm92aWRlckNoYW5nZWQobmV3IExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQodGhpcywgZWxlbWVudCkpOw0KLQkJfQ0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEltYWdlIGdldERlZmF1bHRJbWFnZShPYmplY3Qgb2JqZWN0KQ0KLQl7DQotCQkvLyBObyBkZmF1bHQgaW1hZ2VzIA0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01JdGVtVmFsdWVQcm9wZXJ0eVNvdXJjZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvRE9NSXRlbVZhbHVlUHJvcGVydHlTb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZkNGY2MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01JdGVtVmFsdWVQcm9wZXJ0eVNvdXJjZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLlByb3BlcnR5U291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLklET01Qcm9wZXJ0eVZhbHVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIGZhY3RvcnkgZm9yIHRoYXQgY3JlYXRlcyBhZGFwdGVyIGZyb20ge0BsaW5rIElET01Qcm9wZXJ0eVZhbHVlfSB0bw0KLSAqIHtAbGluayBJUHJvcGVydHlTb3VyY2V9IGludGVyZmFjZS4gVGhpcyBmYWN0b3J5IGlzIHJlZ2lzdGVyZWQgaW4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIGV4dGVuc2lvbg0KLSAqIHBvaW50IGFuZCBpcyBjYWxsZWQgd2hlbiBvYmplY3Qgb2YgdHlwZSB7QGxpbmsgSURPTVByb3BlcnR5VmFsdWV9IG5lZWRzIHRvIGJlDQotICogZGlzcGxheWVkIG9yIGVkaXRlZCBpbiBwcm9wZXJ0eSBzaGVldC4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotcHVibGljIGNsYXNzIERPTUl0ZW1WYWx1ZVByb3BlcnR5U291cmNlRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSANCi17DQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQ0KLQkgKi8NCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSANCi0Jew0KLQkJYXNzZXJ0IGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIElET01Qcm9wZXJ0eVZhbHVlOw0KLQkJDQotCQlmaW5hbCBJRE9NUHJvcGVydHlWYWx1ZSB3cmFwcGVyID0gKElET01Qcm9wZXJ0eVZhbHVlKWFkYXB0YWJsZU9iamVjdDsNCi0JCQ0KLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eVNvdXJjZSh3cmFwcGVyLmdldEVkaXRhYmxlVmFsdWUoKSwgd3JhcHBlcik7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlckxpc3QoKQ0KLQkgKi8NCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7DQotCQlyZXR1cm4gbmV3IENsYXNzW10ge1Byb3BlcnR5U291cmNlLmNsYXNzfTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdhMzM0M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgDQotew0KLQlwcml2YXRlIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5Ow0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgDQotCXsNCi0gICAgICAgIGlmIChhZGFwdGVyVHlwZS5pc0luc3RhbmNlKGFkYXB0YWJsZU9iamVjdCkpIA0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGFwdGFibGVPYmplY3Q7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGlmIChhZGFwdGVyVHlwZSA9PSBJUHJvcGVydHlTb3VyY2VQcm92aWRlci5jbGFzcykgDQotICAgICAgICB7DQotICAgICAgICAJcmV0dXJuIGdldEFkYXB0ZXJGYWN0b3J5KCk7DQotICAgICAgICB9DQotICAgICAgICANCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIA0KLQl7DQotICAgICAgICByZXR1cm4gbmV3IENsYXNzW10gew0KLSAgICAgICAgCQlET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5jbGFzcywNCi0gICAgICAgIH07DQotCX0NCi0JDQotCXByb3RlY3RlZCBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBnZXRBZGFwdGVyRmFjdG9yeSgpDQotCXsNCi0JCWlmIChhZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7DQotCQkJYWRhcHRlckZhY3RvcnkgPSBuZXcgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5Ow0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvSUxvYWRpbmdXc1Byb2plY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvSUxvYWRpbmdXc1Byb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjYyZWFhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0lMb2FkaW5nV3NQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi0NCi0NCi0vKioNCi0gKiBBbiBpbnRlcmZhY2UgcHJlc2VudGluZyBub3QgbG9hZGVkIHdlYiBzZXJ2aWNlIHByb2plY3QuIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgDQotICogdG8gYmUgYWRkZWQgdG8gdGhlIHByb2plY3QgZXhwbG9yZXIgV1MgdHJlZSBpbiBjYXNlcyB3aGVuIHRoZSBwcm9qZWN0IGlzIHJlbGV2YW50IA0KLSAqIGJ1dCBpdCBpcyBub3QgeWV0IGxvYWRlZCBieSBET00gbG9hZGVyLiANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGludGVyZmFjZSBJTG9hZGluZ1dzUHJvamVjdCANCi17DQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSByZWxldmFudCBwcm9qZWN0DQotCSAqLw0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpOw0KLQkNCi0JLyoqDQotCSAqIEByZXR1cm4gaWYgdGhlIERPTSBsb2FkaW5nIGhhcyBiZWVuIGNhbmNlbGVkDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRDYW5jZWxlZCgpOw0KLQkNCi0JLyoqDQotCSAqIEludGVyZmFjZSB1c2VkIHRvIGJlIGFkZGVkIHRvIHRoZSB0cmVlIGFzIGEgc3ViIG5vZGUgb2YgSU5vdExvYWRlZFdzUHJvamVjdCBub2RlDQotCSAqIGFuZCBkaXNwbGF5ZWQgd2l0aCB0ZXh0ICJMb2FkaW5nLi4uIi4NCi0JICogDQotCSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0JICovDQotCXB1YmxpYyBpbnRlcmZhY2UgSUxvYWRpbmdEdW1teSB7fTsNCi0JDQotCXB1YmxpYyBpbnRlcmZhY2UgSUxvYWRpbmdDYW5jZWxlZCB7fTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9JU0VJQ2hpbGRMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0lTRUlDaGlsZExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRmNmI0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0lTRUlDaGlsZExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSVNFSUNoaWxkTGlzdCBleHRlbmRzIEFkYXB0ZXINCi17DQotCXB1YmxpYyBFTGlzdDxJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPiBnZXRTRUlDaGlsZExpc3QoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9JV2ViU2VydmljZUNoaWxkTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9JV2ViU2VydmljZUNoaWxkTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NjM4MWQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvSVdlYlNlcnZpY2VDaGlsZExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJTZXJ2aWNlQ2hpbGRMaXN0IGV4dGVuZHMgQWRhcHRlcg0KLXsNCi0JcHVibGljIEVMaXN0PElXZWJTZXJ2aWNlPiBnZXRXU0NoaWxkTGlzdCgpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL1dlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9XZWJTZXJ2aWNlUHJvYmxlbXNEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWE5ZDJiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL1dlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuUHJvYmxlbXNMYWJlbERlY29yYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5Eb20yUmVzb3VyY2VNYXBwZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5kb20udmFsaWRhdGlvbi5Eb21WYWxpZGF0aW9uQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5Mb2dnZXI7DQotDQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvciBleHRlbmRzIFByb2JsZW1zTGFiZWxEZWNvcmF0b3INCi17DQotCS8qKiBFbnVtIHRvIHJlcHJlc2VudCBkaWZmZXJlbnQgbWFya2VyIHR5cGVzICovDQotCXB1YmxpYyBlbnVtIFNldmVyaXR5IHtPSywgRVJST1IsIFdBUk5JTkd9Ow0KLQkNCi0JcHJpdmF0ZSBEb21VdGlsIGRvbVV0aWwgPSBEb21VdGlsLklOU1RBTkNFOw0KLQkNCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBpbnQgY29tcHV0ZUFkb3JubWVudEZsYWdzKE9iamVjdCBvYmopIA0KLQl7DQotCQlmaW5hbCBTZXZlcml0eSBzZXZlcml0eSA9IGRlZmluZVNldmVyaXR5KG9iaik7CQkNCi0JCWlmIChzZXZlcml0eSA9PSBTZXZlcml0eS5FUlJPUikgew0KLQkJCXJldHVybiBKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUjsNCi0JCX0gDQotCQkNCi0JCWlmIChzZXZlcml0eSA9PSBTZXZlcml0eS5XQVJOSU5HKSB7DQotCQkJcmV0dXJuIEphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLldBUk5JTkc7DQotCQl9DQotCQkNCi0JCXJldHVybiAwOw0KLQl9CQ0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIHRoZSBvYmplY3QncyByZXNvdXJjZSBmb3IgbWFya2VycyBhbmQgZGVmaW5lcyB0aGUgc2V2ZXJpdHkgb2YgdGhlDQotCSAqIHByb2JsZW0gaWYgYW55LiANCi0JICogQHBhcmFtIG9iag0KLQkgKiBAcmV0dXJuIHRoZSBzZXZlcml0eSBjYWxjdWxhdGVkLg0KLQkgKi8NCi0JcHJvdGVjdGVkIFNldmVyaXR5IGRlZmluZVNldmVyaXR5KGZpbmFsIE9iamVjdCBvYmopIA0KLQl7DQotCQl0cnkgDQotCQl7DQotCQkJLy8gcHJvY2VzcyBhZGRpdGlvbmFsIERPTSBvYmplY3RzIG5lZWRlZCBmb3IgVUkgLSBJV2ViU2VydmljZUNoaWxkTGlzdCBhbmQgSVNFSUNoaWxkTGlzdA0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkgew0KLQkJCQlyZXR1cm4gZGVmaW5lU2V2ZXJpdHlGb3JFTGlzdCgoKElXZWJTZXJ2aWNlQ2hpbGRMaXN0KW9iaikuZ2V0V1NDaGlsZExpc3QoKSk7DQotCQkJfQ0KLQkJCQ0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KSB7DQotCQkJCXJldHVybiBkZWZpbmVTZXZlcml0eUZvckVMaXN0KCgoSVNFSUNoaWxkTGlzdClvYmopLmdldFNFSUNoaWxkTGlzdCgpKTsNCi0JCQl9DQotCQkJDQotCQkJLy8gZG8gbm90IHByb2Nlc3Mgbm9uIERPTSBvYmplY3RzDQotCQkJaWYoICEob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgKSB7DQotCQkJCXJldHVybiBTZXZlcml0eS5PSzsNCi0JCQl9DQotCQkJDQotCQkJcmV0dXJuIGRlZmluZVNldmVyaXR5KChFT2JqZWN0KSBvYmopOw0KLQkJfSANCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkobmV3IExvZ2dlcigpKS5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9DQotDQotCQlyZXR1cm4gU2V2ZXJpdHkuT0s7DQotCX0NCi0JDQotCXByb3RlY3RlZCBTZXZlcml0eSBkZWZpbmVTZXZlcml0eUZvckVMaXN0KGZpbmFsIExpc3Q8PyBleHRlbmRzIEVPYmplY3Q+IGxpc3QpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCVNldmVyaXR5IHNldmVyaXR5ID0gU2V2ZXJpdHkuT0s7CQkNCi0JCWZvciAoRU9iamVjdCBlT2JqZWN0IDogbGlzdCkgDQotCQl7DQotCQkJU2V2ZXJpdHkgdGVtcFNldmVyaXR5ID0gZGVmaW5lU2V2ZXJpdHkoZU9iamVjdCk7DQotCQkJaWYgKHRlbXBTZXZlcml0eSA9PSBTZXZlcml0eS5FUlJPUikgew0KLQkJCQlyZXR1cm4gU2V2ZXJpdHkuRVJST1I7DQotCQkJfQ0KLQkJCQ0KLQkJCWlmICh0ZW1wU2V2ZXJpdHk9PVNldmVyaXR5LldBUk5JTkcpIHsNCi0JCQkJc2V2ZXJpdHkgPSBTZXZlcml0eS5XQVJOSU5HOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHNldmVyaXR5Ow0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgU2V2ZXJpdHkgZGVmaW5lU2V2ZXJpdHkoZmluYWwgRU9iamVjdCBlT2JqZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0JeyAJCQ0KLQkJZmluYWwgSVJlc291cmNlIHJlc291cmNlID0gRG9tMlJlc291cmNlTWFwcGVyLklOU1RBTkNFLmZpbmRSZXNvdXJjZShlT2JqZWN0KTsNCi0JCWlmIChyZXNvdXJjZSE9bnVsbCkgew0KLQkJCXJldHVybiBkZWZpbmVTZXZlcml0eShlT2JqZWN0LCByZXNvdXJjZSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBTZXZlcml0eS5PSzsNCi0JfQ0KLQkJDQotCXByb3RlY3RlZCBTZXZlcml0eSBkZWZpbmVTZXZlcml0eShmaW5hbCBFT2JqZWN0IGVPYmplY3QsIGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJaWYgKCFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgew0KLQkJCXJldHVybiBTZXZlcml0eS5PSzsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgaW50IGRlcHRoID0gKHJlc291cmNlLmdldFR5cGUoKT09SVJlc291cmNlLlBST0pFQ1QpID8gSVJlc291cmNlLkRFUFRIX0lORklOSVRFIDogSVJlc291cmNlLkRFUFRIX1pFUk87DQotCQlmaW5hbCBJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKERvbVZhbGlkYXRpb25Db25zdGFudHMuTUFSS0VSX0lELCBmYWxzZSwgZGVwdGgpOw0KLQkJU2V2ZXJpdHkgc2V2ZXJpdHkgPSBTZXZlcml0eS5PSzsNCi0JCWZvciAoSU1hcmtlciBtYXJrZXIgOiBtYXJrZXJzKSANCi0JCXsNCi0JCQlpZiAoIWlzUmVsZXZhbnRGb3IoZU9iamVjdCwgbWFya2VyKSkgew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJDQotCQkJaW50IHRlbXBTZXZlcml0eSA9IChJbnRlZ2VyKW1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSk7DQotCQkJaWYgKHRlbXBTZXZlcml0eT09SU1hcmtlci5TRVZFUklUWV9FUlJPUikgew0KLQkJCQlyZXR1cm4gU2V2ZXJpdHkuRVJST1I7DQotCQkJfSANCi0NCi0JCQlpZih0ZW1wU2V2ZXJpdHk9PUlNYXJrZXIuU0VWRVJJVFlfV0FSTklORykgew0KLQkJCQlzZXZlcml0eSA9IFNldmVyaXR5LldBUk5JTkc7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlpZiAoc2V2ZXJpdHkgPT0gU2V2ZXJpdHkuT0sgJiYgKGVPYmplY3QgaW5zdGFuY2VvZiBJV2ViU2VydmljZSkpIA0KLQkJew0KLQkJCS8vIGZvciBiZWFuIHdpdGggZXhwbGljaXQgaW50ZXJmYWNlIHdlIG5lZWQgdG8gY2hlY2sgdGhlIGludGVyZmFjZSBhcyB3ZWxsIA0KLQkJCS8vIGJlY2F1c2UgaXQgcmVzaWRlcyBpbiBhbm90aGVyIHJlc291cmNlDQotCQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSAoKElXZWJTZXJ2aWNlKWVPYmplY3QpLmdldFNlcnZpY2VFbmRwb2ludCgpOw0KLQkJCWlmIChzZWkgIT0gbnVsbCAmJiAhc2VpLmlzSW1wbGljaXQoKSkgew0KLQkJCQlzZXZlcml0eSA9IGRlZmluZVNldmVyaXR5KHNlaSk7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gc2V2ZXJpdHk7DQotCX0NCi0NCi0JLyoqDQotCSAqIERlZmluZXMgaWYgPGNvZGU+bWFya2VyPC9jb2RlPiBpcyByZWxldmFudCBmb3IgPGNvZGU+ZU9iamVjdDwvY29kZT4uDQotCSAqIE9ubHkgZm9yIHdlYiBtZXRob2QgYW5kIHdlYiBwYXJhbWV0ZXIgd2UgbmVlZCB0byBkZWZpbmUgaWYgdGhlIG1hcmtlciBpcyByZWxldmFudA0KLQkgKiBiZWNhdXNlIHRoZXkgYXJlIG5vdCB1bmlxdWUgaW4gdGhlIHNjb3BlIG9mIHRoZSByZXNvdXJjZS4gRm9yIGV4YW1wbGUgaWYgdGhlcmUgaXMgYQ0KLQkgKiBtYXJrZXIgc2V0IG9uIHRoZSByZXNvdXJjZSBjb250YWluaW5nIFNFSSwgdGhlIFNFSSBzaG91bGQgYmUgbWFya2VkIGluIGFueSBjYXNlIA0KLQkgKiB3aGlsZSB0aGUgbWV0aG9kIG9ubHkgaW4gY2FzZSB3aGVuIHRoZSBlcnJvciBpcyBzcGVjaWZpY2FsbHkgZm9yIHRoaXMgbWV0aG9kIG9yIA0KLQkgKiBtZXRob2QgcGFyYW1ldGVyLiANCi0JICogQHBhcmFtIGVPYmplY3QgdGhlIG9iamVjdCB0byBiZSB2YWxpZGF0ZWQNCi0JICogQHBhcmFtIG1hcmtlciB0aGUgcmVzb3VyY2UgbWFya2VyIA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgdGhlIG1hcmtlciBpcyByZWxldmFudCBmb3IgPGNvZGU+ZU9iamVjdDwvY29kZT4gDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWxldmFudEZvcihmaW5hbCBFT2JqZWN0IGVPYmplY3QsIGZpbmFsIElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlzd2l0Y2ggKGVPYmplY3QuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkpDQotCQl7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0Q6DQotCQkJcmV0dXJuIGlzUmVsZXZhbnRGb3JNZXRob2QoKElXZWJNZXRob2QpZU9iamVjdCwgbWFya2VyKTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNOg0KLQkJCXJldHVybiBpc1JlbGV2YW50KGRvbVV0aWwuY2FsY1VuaXF1ZUltcGwoZU9iamVjdCksIG1hcmtlcik7DQotCQl9DQotCQkNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCQ0KLQkvKioNCi0JICogRGVmaW5lcyBpZiA8Y29kZT5tYXJrZXI8L2NvZGU+IGlzIHJlbGV2YW50IGZvciA8Y29kZT53ZWJNZXRob2Q8L2NvZGU+Lg0KLQkgKiBDaGVja3MgaWYgdGhlIG1hcmtlciBpcyBzcGVjaWZpY2FsbHkgZm9yIHRoaXMgbWV0aG9kIG9yIHNvbWUgb2YgaXQncyBwYXJhbWV0ZXJzLg0KLQkgKiBAcGFyYW0gd2ViTWV0aG9kIHRoZSBtZXRob2QgdG8gYmUgY2hlY2tlZA0KLQkgKiBAcGFyYW0gbWFya2VyIHRoZSBtYXJrZXIgdG8gYmUgY2hlY2tlZA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgbWFya2VyIGlzIHJlbGV2YW50DQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkgKi8JDQotCXByb3RlY3RlZCBib29sZWFuIGlzUmVsZXZhbnRGb3JNZXRob2QoZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QsIGZpbmFsIElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0Jew0KLQkJaWYgKGlzUmVsZXZhbnQoZG9tVXRpbC5jYWxjVW5pcXVlSW1wbCh3ZWJNZXRob2QpLCBtYXJrZXIpKSB7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQkNCi0JCWZvciAoSVdlYlBhcmFtIHdlYlBhcmFtIDogd2ViTWV0aG9kLmdldFBhcmFtZXRlcnMoKSkgDQotCQl7DQotCQkJaWYgKGlzUmVsZXZhbnQoZG9tVXRpbC5jYWxjVW5pcXVlSW1wbCh3ZWJQYXJhbSksIG1hcmtlcikpIHsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDaGVja3MgaWYgbWFya2VyJ3Mge0BsaW5rIERvbVZhbGlkYXRpb25Db25zdGFudHMjSU1QTEVNRU5UQVRJT059IGF0dHJpYnV0ZSBoYXMgc2FtZQ0KLQkgKiB2YWx1ZSBhcyA8Y29kZT5pbXBsZW1lbnRhdGlvbjwvY29kZT4uDQotCSAqIEBwYXJhbSBpbXBsZW1lbnRhdGlvbiB0aGUgaW1wbGVtZW50YXRpb24gc2lnbmF0dXJlDQotCSAqIEBwYXJhbSBtYXJrZXIgdGhlIG1hcmtlciB0byBiZSBjaGVja2VkDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW4gY2FzZSBtYXJrZXIgaXMgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24NCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uDQotCSAqLw0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlbGV2YW50KGZpbmFsIFN0cmluZyBpbXBsZW1lbnRhdGlvbiwgZmluYWwgSU1hcmtlciBtYXJrZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIE9iamVjdCBmb3VuZCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5JTVBMRU1FTlRBVElPTik7DQotCQlpZiAoZm91bmQgIT0gbnVsbCAmJiBmb3VuZC5lcXVhbHMoaW1wbGVtZW50YXRpb24pKSB7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvTmF2aWdhdGVUb0ltcGxlbWVudGF0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvTmF2aWdhdGVUb0ltcGxlbWVudGF0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiZjEzNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9hY3Rpb25zL05hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9uczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5Hcm91cEVKQlByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuR3JvdXBFamJTZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnBsdWdpbi5Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JU0VJQ2hpbGRMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRE9NUnVudGltZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTVJ1bnRpbWVNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLlByb2plY3RNYW5hZ2VtZW50VXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbg0KLQkJaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUyIHsNCi0JcHJvdGVjdGVkIE9iamVjdCBzcmNPYmplY3Q7DQotDQotCXByaXZhdGUgSUphdmFQcm9qZWN0IHByb2plY3Q7DQotDQotCXByaXZhdGUgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXI7DQotDQotCXByb3RlY3RlZCBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb24oU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsNCi0JCXRoaXMoRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5PcGVuV1NSZXNvdXJjZUFjdGlvbl9OYW1lKTsNCi0NCi0JCXRoaXMudmlld2VyID0gdmlld2VyOw0KLQl9DQotDQotCXByb3RlY3RlZCBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb24oU3RyaW5nIHRleHQpIHsNCi0JCXN1cGVyKHRleHQpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKQ0KLQl7DQotCQlpZihzcmNPYmplY3QgaW5zdGFuY2VvZiBTZXNzaW9uQmVhbikNCi0JCXsNCi0JCQlyZXR1cm4gRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5OYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb25fU2hvd0luV2ViU2VydmljZXNBcmVhQWN0aW9uOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCXJldHVybiBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLk5hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbl9TaG93SW5FSkJBcmVhQWN0aW9uOw0KLQkJfQ0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgew0KLQkJYm9vbGVhbiBpc0VuYWJsZWQgPSBzdXBlci5pc0VuYWJsZWQoKSANCi0JCSYmIHRoaXMudmlld2VyIGluc3RhbmNlb2YgVHJlZVZpZXdlcg0KLQkJJiYgdGhpcy5wcm9qZWN0ICE9bnVsbA0KLQkJJiYgUHJvamVjdE1hbmFnZW1lbnRVdGlscy5pc0VqYjNQcm9qZWN0KHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsNCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpDQotCQl7DQotCQkJcmV0dXJuIGlzRW5hYmxlZDsNCi0JCX0NCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4pDQotCQl7DQotCQkJU2Vzc2lvbkJlYW4gc2Vzc2lvbkJlYW4gPSAoKFNlc3Npb25CZWFuKXNyY09iamVjdCk7DQotCQkJSVdlYlNlcnZpY2Ugd2ViU2VydmljZSA9IGdldFdlYlNlcnZpY2Uoc2Vzc2lvbkJlYW4pOw0KLQkJCWlmICh3ZWJTZXJ2aWNlID09IG51bGwpDQotCQkJew0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJCXJldHVybiBpc0VuYWJsZWQ7DQotCQl9DQotCQkNCi0JCWlmKHNyY09iamVjdCBpbnN0YW5jZW9mIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UNCi0JCQkJJiYgKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNyY09iamVjdCkuaXNJbXBsaWNpdCgpKQ0KLQkJew0KLQkJCXJldHVybiBpc0VuYWJsZWQ7DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0JCXJ1bigpOw0KLQ0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGUgdXNlciBoYXMgaW52b2tlZCB0aGlzIGFjdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgcnVuKCkgew0KLQkJaWYgKCFpc0VuYWJsZWQoKSkNCi0JCQlyZXR1cm47DQotDQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gbnVsbDsNCi0NCi0JCWlmKHNyY09iamVjdCBpbnN0YW5jZW9mIFNlc3Npb25CZWFuKQ0KLQkJew0KLQkJCVNlc3Npb25CZWFuIHNlc3Npb25CZWFuID0gKChTZXNzaW9uQmVhbilzcmNPYmplY3QpOw0KLQkJCVN0cmluZyBlamJDbGFzcyA9IHNlc3Npb25CZWFuLmdldEVqYkNsYXNzKCk7DQotCQkJSVdlYlNlcnZpY2Ugd2ViU2VydmljZSA9IGdldFdlYlNlcnZpY2Uoc2Vzc2lvbkJlYW4pOw0KLQkJCWlmICh3ZWJTZXJ2aWNlID09IG51bGwpDQotCQkJew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQ0KLQkJCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc0VJID0gd2ViU2VydmljZS5nZXRTZXJ2aWNlRW5kcG9pbnQoKTsNCi0JCQlib29sZWFuIGlzSW1wbGljaXQgPSBzRUkuaXNJbXBsaWNpdCgpOw0KLQkJCVN0cmluZyBzRUlDbGFzczsNCi0JCQlpZiAoIWlzSW1wbGljaXQpew0KLQkJCQlTdHJpbmcgaW1wbCA9IHNFSS5nZXRJbXBsZW1lbnRhdGlvbigpOw0KLQkJCQlzRUlDbGFzcyA9IGltcGw7DQotCQkJfSBlbHNlIHsNCi0JCQkJc0VJQ2xhc3MgPSBlamJDbGFzczsNCi0JCQl9DQotICAgICAgICAgICAgdHJ5IHsNCi0JCQkJY3UgPSBwcm9qZWN0LmZpbmRUeXBlKHNFSUNsYXNzKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkJSVJlc291cmNlIHJlc291cmNlID0gY3UuZ2V0UmVzb3VyY2UoKTsNCi0JCQkJbW92ZVRvU0VJTm9kZShyZXNvdXJjZSk7DQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgew0KLQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5leHBlY3RlZCBleGNlcHRpb24gb2NjdXJyZWQiLCBqbWUpOyAvLyROT04tTkxTLTEkDQotCQkJCXJldHVybjsNCi0JCQl9DQotICAgICAgICAgICAgDQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJdHJ5IHsNCi0JCQkJY3UgPSBwcm9qZWN0LmZpbmRUeXBlKA0KLQkJCQkJCSgoSUphdmFXZWJTZXJ2aWNlRWxlbWVudCkgc3JjT2JqZWN0KQ0KLQkJCQkJCQkJLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsNCi0JCQkJbG9nZ2VyKCkubG9nRXJyb3IoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9jY3VycmVkIiwgam1lKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJCQ0KLQkJCW1vdmVUb0VqYk5vZGUoY3UuZ2V0UmVzb3VyY2UoKSk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgSVdlYlNlcnZpY2UgaWYgc2Vzc2lvbkJlYW4gaGFzIGJlZW4gZXhwb3NlZCBhcyB3ZWIgc2VydmljZS4NCi0JICogQHBhcmFtIHNlc3Npb25CZWFuIGEgc2Vzc2lvbiBiZWFuLg0KLQkgKiBAcmV0dXJuIElXZWJTZXJ2aWNlIGlmIHNlc3Npb25CZWFuIGhhcyBiZWVuIGV4cG9zZWQgYXMgd2ViIHNlcnZpY2UuIElmIHRoZSBzZXNzaW9uIGJlYW4gaGFzIG5vdCBiZWVuDQotCSAqIGV4cG9zZWQgYXMgd2ViIHNlcnZpY2UgLSByZXR1cm5zIG51bGwuDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgc2Vzc2lvbkJlYW4gaXMgbnVsbC4NCi0JICovDQotCXByb3RlY3RlZCBJV2ViU2VydmljZSBnZXRXZWJTZXJ2aWNlKGZpbmFsIFNlc3Npb25CZWFuIHNlc3Npb25CZWFuKSANCi0Jew0KLQkJZmluYWwgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBkb21SdW50aW1lID0gZ2V0RG9tUnVudGltZSgpOw0KLQkJaWYgKGRvbVJ1bnRpbWUgPT0gbnVsbCkgew0KLQkJICAgICAgcmV0dXJuIG51bGw7DQotCQl9DQotDQotCQl0cnkgew0KLQkJCWZpbmFsIElET00gZG9tID0gZG9tUnVudGltZS5nZXRET00oKTsNCi0JCQlpZiAoZG9tID09IG51bGwpIHsNCi0JCQkJcmV0dXJuIG51bGw7DQotCQkJfQ0KLQ0KLQkJCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3ZWJTZXJ2aWNlUHJvamVjdCA9IERvbVV0aWwuSU5TVEFOQ0UuZmluZFByb2plY3RCeU5hbWUoZG9tLCB0aGlzLnByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7CQkNCi0JCQlyZXR1cm4gRG9tVXRpbC5JTlNUQU5DRS5maW5kV3NCeUltcGxOYW1lKHdlYlNlcnZpY2VQcm9qZWN0LCBzZXNzaW9uQmVhbi5nZXRFamJDbGFzcygpKTsNCi0JCX0gDQotCQljYXRjaCAoV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gZSkgeyAvLyAkSkwtRVhDJA0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQl9DQotDQotCXByb3RlY3RlZCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldERvbVJ1bnRpbWUoKSB7DQotCQlyZXR1cm4gV3NET01SdW50aW1lTWFuYWdlci5pbnN0YW5jZSgpLmdldERPTVJ1bnRpbWUoSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbi5JRCk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIG1vdmVUb1NFSU5vZGUoSVJlc291cmNlIHJlc291cmNlKQ0KLQl7DQotCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSAoVHJlZVZpZXdlcil0aGlzLnZpZXdlcjsNCi0JCUlTZWxlY3Rpb24gc2VsID0gbnVsbDsNCi0NCi0JCU9iamVjdFtdIGV4cGFuZGVkT2JqZWN0cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOw0KLQ0KLQkJT2JqZWN0W10gcHJvamVjdEVsZW1lbnRzID0gKChJVHJlZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlcg0KLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldENoaWxkcmVuKHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCA9IG51bGw7DQotDQotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgcHJvamVjdEVsZW1lbnRzLmxlbmd0aDsgaWkrKykgew0KLQkJCWlmIChwcm9qZWN0RWxlbWVudHNbaWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VQcm9qZWN0KSB7DQotCQkJCXdzUHJvamVjdCA9IChJV2ViU2VydmljZVByb2plY3QpIHByb2plY3RFbGVtZW50c1tpaV07DQotCQkJCXRyZWVWaWV3ZXIuZXhwYW5kVG9MZXZlbCh3c1Byb2plY3QsIDIpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotDQotCQlpZiAod3NQcm9qZWN0ID09IG51bGwpDQotCQkJcmV0dXJuOw0KLQ0KLQkJZm9yKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc0VJIDogd3NQcm9qZWN0LmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSkNCi0JCXsNCi0JCQl0cnkgew0KLQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gcHJvamVjdC5maW5kVHlwZSgNCi0JCQkJCQkoKElKYXZhV2ViU2VydmljZUVsZW1lbnQpIHNFSSkNCi0JCQkJCQkJCS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkJDQotCQkJCWlmKGN1LmdldFJlc291cmNlKCkuZXF1YWxzKHJlc291cmNlKSkNCi0JCQkJew0KLQkJCQkJc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc0VJKTsNCi0JCQkJCVRyZWVQYXRoIHRyZWVQYXRoID0gZ2V0VHJlZVBhdGhGb3JTRUkodHJlZVZpZXdlciwNCi0JCQkJCQkJd3NQcm9qZWN0KTsNCi0JCQkJCU9iamVjdFtdIGVsZW1lbnRzVG9FeHBhbmQgPSBuZXcgT2JqZWN0W3RyZWVQYXRoDQotCQkJCQkJCS5nZXRTZWdtZW50Q291bnQoKV07DQotDQotCQkJCQlmb3IgKGludCBqaiA9IDA7IGpqIDwgZWxlbWVudHNUb0V4cGFuZC5sZW5ndGg7IGpqKyspIHsNCi0JCQkJCQlpZiAobm90QWxyZWFkeUV4cGFuZGVkKHRyZWVQYXRoLmdldFNlZ21lbnQoamopLA0KLQkJCQkJCQkJZXhwYW5kZWRPYmplY3RzKSkgew0KLQkJCQkJCQllbGVtZW50c1RvRXhwYW5kW2pqXSA9IHRyZWVQYXRoLmdldFNlZ21lbnQoamopOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0NCi0JCQkJCWZvciAoaW50IGpqID0gMDsgamogPCBlbGVtZW50c1RvRXhwYW5kLmxlbmd0aDsgamorKykgew0KLQkJCQkJCWlmIChlbGVtZW50c1RvRXhwYW5kW2pqXSAhPSBudWxsKSB7DQotCQkJCQkJCU9iamVjdFtdIHRtcCA9IGV4cGFuZGVkT2JqZWN0czsNCi0JCQkJCQkJZXhwYW5kZWRPYmplY3RzID0gbmV3IE9iamVjdFtleHBhbmRlZE9iamVjdHMubGVuZ3RoICsgMV07DQotDQotCQkJCQkJCWZvciAoaW50IGtrID0gMDsga2sgPCB0bXAubGVuZ3RoOyBraysrKSB7DQotCQkJCQkJCQlleHBhbmRlZE9iamVjdHNba2tdID0gdG1wW2trXTsNCi0JCQkJCQkJfQ0KLQ0KLQkJCQkJCQlleHBhbmRlZE9iamVjdHNbZXhwYW5kZWRPYmplY3RzLmxlbmd0aCAtIDFdID0gZWxlbWVudHNUb0V4cGFuZFtqal07DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQ0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7DQotCQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBvY2N1cnJlZCIsIGptZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCQkNCi0JCX0NCi0JCSBzZXRFeHBhbmRlZEVsZW1lbnRzQW5kU2VsZWN0aW9uKHRyZWVWaWV3ZXIsIGV4cGFuZGVkT2JqZWN0cywgc2VsKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIG1vdmVUb0VqYk5vZGUoSVJlc291cmNlIHJlc291cmNlKSB7DQotCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSAoVHJlZVZpZXdlcil0aGlzLnZpZXdlcjsNCi0JCUlTZWxlY3Rpb24gc2VsID0gbnVsbDsNCi0NCi0JCU9iamVjdFtdIGV4cGFuZGVkT2JqZWN0cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOw0KLQ0KLQkJT2JqZWN0W10gcHJvamVjdEVsZW1lbnRzID0gKChJVHJlZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlcg0KLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldENoaWxkcmVuKHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJR3JvdXBFSkJQcm92aWRlciBlamJQcm92aWRlciA9IG51bGw7DQotCQlHcm91cEVqYlNlc3Npb24gZWpiU2Vzc2lvbiA9IG51bGw7DQotDQotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgcHJvamVjdEVsZW1lbnRzLmxlbmd0aDsgaWkrKykgew0KLQkJCWlmIChwcm9qZWN0RWxlbWVudHNbaWldIGluc3RhbmNlb2YgR3JvdXBFSkJQcm92aWRlcikgew0KLQkJCQllamJQcm92aWRlciA9IChHcm91cEVKQlByb3ZpZGVyKSBwcm9qZWN0RWxlbWVudHNbaWldOw0KLQkJCQl0cmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoZWpiUHJvdmlkZXIsIDEpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotDQotCQlpZiAoZWpiUHJvdmlkZXIgPT0gbnVsbCkNCi0JCQlyZXR1cm47DQotDQotCQlmb3IgKE9iamVjdCBlamJQcm92aWRlckNoaWxkIDogZWpiUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oKSkgew0KLQkJCWlmIChlamJQcm92aWRlckNoaWxkIGluc3RhbmNlb2YgR3JvdXBFamJTZXNzaW9uKSB7DQotCQkJCWVqYlNlc3Npb24gPSAoR3JvdXBFamJTZXNzaW9uKSBlamJQcm92aWRlckNoaWxkOw0KLQkJCQl0cmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoZWpiU2Vzc2lvbiwgMik7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaWYgKGVqYlNlc3Npb24gPT0gbnVsbCkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0NCi0JCU9iamVjdFtdIGVqYnMgPSB0cmVlVmlld2VyLmdldEV4cGFuZGVkRWxlbWVudHMoKTsNCi0NCi0JCWZvciAoaW50IGlpID0gMDsgaWkgPCBlamJzLmxlbmd0aDsgaWkrKykgew0KLQkJCWlmICgoZWpic1tpaV0gaW5zdGFuY2VvZiBTZXNzaW9uQmVhbil8fChlamJzW2lpXSBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW5CZWFuKSkgew0KLQkJCQ0KLQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBmaW5kSmF2YVByb2plY3QoZWpic1tpaV0pOw0KLQkJCQlJVHlwZSB0ID0gbnVsbDsNCi0JCQkJdHJ5IHsNCi0JCQkJCWlmKChlamJzW2lpXSBpbnN0YW5jZW9mIFNlc3Npb25CZWFuKSkNCi0JCQkJCQl0ID0gamF2YVByb2plY3QuZmluZFR5cGUoKChTZXNzaW9uQmVhbillamJzW2lpXSkuZ2V0RWpiQ2xhc3MoKSk7DQotCQkJCQllbHNlDQotCQkJCQkJdCA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKCgoTWVzc2FnZURyaXZlbkJlYW4pZWpic1tpaV0pLmdldEVqYkNsYXNzKCkpOw0KLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgew0KLQkJCQkJcmV0dXJuOw0KLQkJCQl9DQotCQkJCUlSZXNvdXJjZSByID0gdC5nZXRSZXNvdXJjZSgpOw0KLQkJCQkNCi0JCQkJaWYgKHIuZXF1YWxzKHJlc291cmNlKSkgew0KLQkJCQkJc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWpic1tpaV0pOw0KLQkJCQkJVHJlZVBhdGggdHJlZVBhdGggPSBnZXRUcmVlUGF0aEZvck9iamVjdCh0cmVlVmlld2VyLA0KLQkJCQkJCQllamJzW2lpXSk7DQotCQkJCQlleHBhbmRFbGVtZW50cyhleHBhbmRlZE9iamVjdHMsIHRyZWVQYXRoKTsNCi0NCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJIHNldEV4cGFuZGVkRWxlbWVudHNBbmRTZWxlY3Rpb24odHJlZVZpZXdlciwgZXhwYW5kZWRPYmplY3RzLCBzZWwpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGZpbmRKYXZhUHJvamVjdChPYmplY3QgZWpiKQ0KLQl7DQotCQlJUHJvamVjdCBwcm9qID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGVqYik7DQotCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKHByb2opOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBzZXRFeHBhbmRlZEVsZW1lbnRzQW5kU2VsZWN0aW9uKFRyZWVWaWV3ZXIgdHJlZVZpZXdlciwgT2JqZWN0W10gZXhwYW5kZWRPYmplY3RzLCBJU2VsZWN0aW9uIHNlbCkNCi0Jew0KLQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZEVsZW1lbnRzKGV4cGFuZGVkT2JqZWN0cyk7DQotDQotCQlpZiAoc2VsICE9IG51bGwpIHsNCi0JCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWwsIHRydWUpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgZXhwYW5kRWxlbWVudHMoT2JqZWN0W10gZXhwYW5kZWRPYmplY3RzLCBUcmVlUGF0aCB0cmVlUGF0aCkNCi0Jew0KLQkJDQotCQlPYmplY3RbXSBlbGVtZW50c1RvRXhwYW5kID0gbmV3IE9iamVjdFt0cmVlUGF0aC5nZXRTZWdtZW50Q291bnQoKV07DQotDQotCQlmb3IgKGludCBqaiA9IDA7IGpqIDwgZWxlbWVudHNUb0V4cGFuZC5sZW5ndGg7IGpqKyspIA0KLQkJew0KLQkJCWlmIChub3RBbHJlYWR5RXhwYW5kZWQodHJlZVBhdGguZ2V0U2VnbWVudChqaiksIGV4cGFuZGVkT2JqZWN0cykpIA0KLQkJCXsNCi0JCQkJZWxlbWVudHNUb0V4cGFuZFtqal0gPSB0cmVlUGF0aC5nZXRTZWdtZW50KGpqKTsNCi0JCQl9DQotCQl9DQotDQotCQlmb3IgKGludCBqaiA9IDA7IGpqIDwgZWxlbWVudHNUb0V4cGFuZC5sZW5ndGg7IGpqKyspIHsNCi0JCSAgICBpZiAoZWxlbWVudHNUb0V4cGFuZFtqal0gIT0gbnVsbCkgew0KLQkJICAgIAlPYmplY3RbXSB0bXAgPSBleHBhbmRlZE9iamVjdHM7DQotCQkgICAgICAgIGV4cGFuZGVkT2JqZWN0cyA9IG5ldyBPYmplY3RbZXhwYW5kZWRPYmplY3RzLmxlbmd0aCArIDFdOw0KLQ0KLQkJCQlmb3IgKGludCBrayA9IDA7IGtrIDwgdG1wLmxlbmd0aDsga2srKykgew0KLQkJCQkJZXhwYW5kZWRPYmplY3RzW2trXSA9IHRtcFtra107DQotCQkJCX0NCi0NCi0JCQkJZXhwYW5kZWRPYmplY3RzW2V4cGFuZGVkT2JqZWN0cy5sZW5ndGggLSAxXSA9IGVsZW1lbnRzVG9FeHBhbmRbampdOw0KLQkJICAgIH0NCi0JCX0NCi0JfQ0KLQ0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gbm90QWxyZWFkeUV4cGFuZGVkKE9iamVjdCBvYmosIE9iamVjdFtdIGV4cE9ianMpIHsNCi0JCWZvciAoaW50IGlpID0gMDsgaWkgPCBleHBPYmpzLmxlbmd0aDsgaWkrKykgew0KLQkJCWlmIChleHBPYmpzW2lpXS5lcXVhbHMob2JqKSkgew0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0NCi0JcHJpdmF0ZSBUcmVlUGF0aCBnZXRUcmVlUGF0aEZvclNFSShUcmVlVmlld2VyIHRyZWVWaWV3ZXIsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QpDQotCXsNCi0JCVRyZWVQYXRoW10gdHJlZVBhdGhzID0gdHJlZVZpZXdlci5nZXRFeHBhbmRlZFRyZWVQYXRocygpOw0KLQ0KLQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IHRyZWVQYXRocy5sZW5ndGg7IGlpKyspIHsNCi0JCQlpZiAodHJlZVBhdGhzW2lpXS5nZXRMYXN0U2VnbWVudCgpIGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdA0KLQkJCQkJJiYgY29udGFpbnModHJlZVBhdGhzW2lpXSwgd3NQcm9qZWN0KSkgew0KLQkJCQlyZXR1cm4gdHJlZVBhdGhzW2lpXTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zKFRyZWVQYXRoIHRyZWVQYXRoLCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0KQ0KLQl7DQotCQlmb3IoaW50IGlpPTA7IGlpPHRyZWVQYXRoLmdldFNlZ21lbnRDb3VudCgpOyBpaSsrKQ0KLQkJew0KLQkJCWlmKHRyZWVQYXRoLmdldFNlZ21lbnQoaWkpLmVxdWFscyh3c1Byb2plY3QpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JcHJpdmF0ZSBUcmVlUGF0aCBnZXRUcmVlUGF0aEZvck9iamVjdChUcmVlVmlld2VyIHRyZWVWaWV3ZXIsIE9iamVjdCBvYmopIHsNCi0JCVRyZWVQYXRoW10gdHJlZVBhdGhzID0gdHJlZVZpZXdlci5nZXRFeHBhbmRlZFRyZWVQYXRocygpOw0KLQ0KLQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IHRyZWVQYXRocy5sZW5ndGg7IGlpKyspIHsNCi0JCQlpZiAodHJlZVBhdGhzW2lpXS5nZXRMYXN0U2VnbWVudCgpLmVxdWFscyhvYmopKSB7DQotCQkJCXJldHVybiB0cmVlUGF0aHNbaWldOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sDQotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCi0JCS8vIFRPRE8gSEFDSyENCi0JCXVwZGF0ZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwNCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwNCi0JCQlJSmF2YVByb2plY3QgcHJvamVjdCkgew0KLQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOw0KLQ0KLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhlIHN0cnVjdHVyZWQgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkIGluIHRoZSB3b3JrYmVuY2guIFN1YmNsYXNzZXMgc2hvdWxkDQotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJlYWN0IHRvIHRoZSBjaGFuZ2UuIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWN0aW9uDQotCSAqIHNob3VsZCBiZSBlbmFibGVkIGZvciB0aGlzIHNlbGVjdGlvbiwgYW5kIGZhbHNlIG90aGVyd2lzZS4NCi0JICogDQotCSAqIFdoZW4gdGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiwgdGhlIHN1cGVyIG1ldGhvZCBtdXN0IGFsd2F5cyBiZSBpbnZva2VkLg0KLQkgKiBJZiB0aGUgc3VwZXIgbWV0aG9kIHJldHVybnMgZmFsc2UsIHRoaXMgbWV0aG9kIG11c3QgYWxzbyByZXR1cm4gZmFsc2UuDQotCSAqIA0KLQkgKiBAcGFyYW0gc2VsDQotCSAqICAgICAgICAgICAgdGhlIG5ldyBzdHJ1Y3R1cmVkIHNlbGVjdGlvbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMpIHsNCi0JCWlmICghc3VwZXIudXBkYXRlU2VsZWN0aW9uKHMpKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0NCi0JCXNyY09iamVjdCA9IHMuZ2V0Rmlyc3RFbGVtZW50KCk7DQotDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJTG9nZ2VyIGxvZ2dlcigpIHsNCi0JCXJldHVybiBuZXcgTG9nZ2VyKCk7DQotCX0NCi0JDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNkaXNwb3NlKCkNCi0JICovDQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotCQkvLyBEaXNwb3NlDQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI2luaXQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7DQotCQkvLyBpbml0DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI3J1bldpdGhFdmVudChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwNCi0JICogICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsNCi0JCXJ1bldpdGhFdmVudChldmVudCk7DQotDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9hY3Rpb25zL09wZW5XU1Jlc291cmNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvT3BlbldTUmVzb3VyY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjJmODZkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvT3BlbldTUmVzb3VyY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLmFjdGlvbnM7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnBsdWdpbi5Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsNCi0NCi1wdWJsaWMgY2xhc3MgT3BlbldTUmVzb3VyY2VBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb25EZWxlZ2F0ZTIgDQotew0KLQlwcm90ZWN0ZWQgT2JqZWN0IHNyY09iamVjdDsNCi0NCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgcHJvamVjdDsNCi0JDQotCXByaXZhdGUgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWk7DQotCXByaXZhdGUgRG9tVXRpbCB1dGlsID0gRG9tVXRpbC5JTlNUQU5DRTsNCi0NCi0JcHJvdGVjdGVkIE9wZW5XU1Jlc291cmNlQWN0aW9uKCkgew0KLQkJdGhpcyhEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLk9wZW5XU1Jlc291cmNlQWN0aW9uX05hbWUpOw0KLQl9DQotDQotCXByb3RlY3RlZCBPcGVuV1NSZXNvdXJjZUFjdGlvbihTdHJpbmcgdGV4dCkgew0KLQkJc3VwZXIodGV4dCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsNCi0JCWJvb2xlYW4gaXNFbmFibGVkID0gc3VwZXIuaXNFbmFibGVkKCkNCi0JCSYmIHRoaXMucHJvamVjdCE9bnVsbDsNCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpDQotCQl7DQotCQkJcmV0dXJuIGlzRW5hYmxlZDsNCi0JCX0NCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkNCi0JCXsNCi0JCQlyZXR1cm4gaXNFbmFibGVkOw0KLQkJfQ0KLQkJDQotCQlpZihzcmNPYmplY3QgaW5zdGFuY2VvZiBJV2ViTWV0aG9kKQ0KLQkJew0KLQkJCXJldHVybiBpc0VuYWJsZWQ7DQotCQl9DQotCQkNCi0JCWlmKHNyY09iamVjdCBpbnN0YW5jZW9mIElXZWJQYXJhbSkNCi0JCXsNCi0JCQlyZXR1cm4gaXNFbmFibGVkOw0KLQkJfQkJDQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsNCi0JCXJ1bigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGUgdXNlciBoYXMgaW52b2tlZCB0aGlzIGFjdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgcnVuKCkgew0KLQkJaWYgKCFpc0VuYWJsZWQoKSkNCi0JCQlyZXR1cm47DQotDQotCQlJQ29tcGlsYXRpb25Vbml0IGN1Ow0KLQkJSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSBudWxsOw0KLQkJSVdlYlBhcmFtIHdlYlBhcmFtID0gbnVsbDsNCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVdlYk1ldGhvZCkNCi0JCXsNCi0JCQl3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZClzcmNPYmplY3Q7DQotCQkJc3JjT2JqZWN0ID0gc2VpOw0KLQkJfQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVdlYlBhcmFtKQ0KLQkJew0KLQkJCXdlYlBhcmFtID0gKElXZWJQYXJhbSlzcmNPYmplY3Q7DQotCQkJd2ViTWV0aG9kID0gKElXZWJNZXRob2Qpd2ViUGFyYW0uZUNvbnRhaW5lcigpOw0KLQkJCXNyY09iamVjdCA9IHNlaTsNCi0JCX0NCi0JCQ0KLQkJdHJ5IHsNCi0NCi0JCQljdSA9IHByb2plY3QuZmluZFR5cGUoKChJSmF2YVdlYlNlcnZpY2VFbGVtZW50KSBzcmNPYmplY3QpLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQ0KLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBnZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7DQotDQotCQkJSUVkaXRvckRlc2NyaXB0b3IgZGVzYyA9IGdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCkuZ2V0RGVmYXVsdEVkaXRvcihjdS5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKSk7DQotCQkNCi0JCQljdSA9IGdldENVVG9PcGVuKGN1LCB3ZWJNZXRob2QpOwkJDQotCQkJaWYgKGN1ID09IG51bGwpDQotCQkJew0KLQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5hYmxlIHRvIGxvY2F0ZSBjb250YWluaW5nIENVIHRvIG9wZW4iKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJDQotCQkJSUZpbGUgZmlsZSA9IGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihjdS5nZXRSZXNvdXJjZSgpLmdldExvY2F0aW9uKCkpWzBdOyANCi0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSwgZGVzYy5nZXRJZCgpKTsNCi0JCQkNCi0JCQlJTWFya2VyIG1hcmtlciA9IGZpbGUuY3JlYXRlTWFya2VyKElNYXJrZXIuVEVYVCk7DQotCQkJSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsNCi0JCQkNCi0JCQltYXAucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgZ2V0TWFya2VyUG9zaXRpb24oY3UsIHdlYk1ldGhvZCwgZmFsc2UpKTsNCi0JCQltYXAucHV0KElNYXJrZXIuQ0hBUl9FTkQsIGdldE1hcmtlclBvc2l0aW9uKGN1LCB3ZWJNZXRob2QsIHRydWUpKTsNCi0JCQkNCi0JCQltYXJrZXIuc2V0QXR0cmlidXRlcyhtYXApOw0KLQkJCQ0KLQkJCUlERS5nb3RvTWFya2VyKGVkaXRvciwgbWFya2VyKTsNCi0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkgew0KLQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmFibGUgdG8gb3BlbiBwYXJ0IGVkaXRvciIsIHBpZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBjZSkgew0KLQkJCWxvZ2dlcigpLmxvZ0Vycm9yKGNlLmdldE1lc3NhZ2UoKSwgY2UpOyANCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIGludCBnZXRNYXJrZXJQb3NpdGlvbihJQ29tcGlsYXRpb25Vbml0IGN1LCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgYm9vbGVhbiBlbmRQb3MpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVR5cGVbXSB0eXBlcyA9IGN1LmdldFR5cGVzKCk7DQotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgdHlwZXMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmICh3ZWJNZXRob2QgPT0gbnVsbCkNCi0JCQl7DQotCQkJCXJldHVybiBnZXRQb3NpdGlvbih0eXBlc1tpaV0sIGVuZFBvcyk7DQotCQkJfQ0KLQ0KLQkJCWZpbmFsIElNZXRob2QgbWV0aG9kID0gdXRpbC5maW5kTWV0aG9kKHR5cGVzW2lpXSwgd2ViTWV0aG9kKTsNCi0JCQlpZiAobWV0aG9kPT1udWxsKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlyZXR1cm4gZ2V0UG9zaXRpb24obWV0aG9kLCBlbmRQb3MpOw0KLQkJfQ0KLQkJCQkNCi0JCXJldHVybiAwOw0KLQl9DQotCQ0KLQlwcml2YXRlIGludCBnZXRQb3NpdGlvbihJTWVtYmVyIG1lbWJlciwgYm9vbGVhbiBlbmRQb3MpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCXJldHVybiBtZW1iZXIuZ2V0TmFtZVJhbmdlKCkuZ2V0T2Zmc2V0KCkgKyAoKGVuZFBvcykgPyBtZW1iZXIuZ2V0TmFtZVJhbmdlKCkuZ2V0TGVuZ3RoKCkgOiAwKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGdldENVVG9PcGVuKElDb21waWxhdGlvblVuaXQgY3UsIElXZWJNZXRob2Qgd2ViTWV0aG9kKQ0KLQl7DQotCQlpZiAod2ViTWV0aG9kID09IG51bGwpIA0KLQkJew0KLQkJCXJldHVybiBjdTsNCi0JCX0NCi0JCQ0KLQkJdHJ5DQotCQl7DQotCQkJZmluYWwgSVR5cGVbXSB0eXBlcyA9IGN1LmdldFR5cGVzKCk7CQkJDQotCQkJZm9yKGludCBpaT0wOyBpaTx0eXBlcy5sZW5ndGg7IGlpKyspDQotCQkJew0KLQkJCQlJTWV0aG9kIG1ldGhvZCA9IHV0aWwuZmluZE1ldGhvZCh0eXBlc1tpaV0sIHdlYk1ldGhvZCk7DQotCQkJCWlmIChtZXRob2QgIT0gbnVsbCkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIHR5cGVzW2lpXS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQkNCi0JCQlmb3IoaW50IGlpPTA7IGlpPHR5cGVzLmxlbmd0aDsgaWkrKykNCi0JCQl7DQotCQkJCUlUeXBlW10gc3VwZXJJbnRmVHlwZXMgPSB0eXBlc1tpaV0ubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpLmdldFN1cGVySW50ZXJmYWNlcyh0eXBlc1tpaV0pOw0KLQkJCQkNCi0JCQkJZm9yKGludCBqaj0wOyBqajxzdXBlckludGZUeXBlcy5sZW5ndGg7IGpqKyspDQotCQkJCXsNCi0JCQkJCUlDb21waWxhdGlvblVuaXQgY3VUb09wZW4gPSBnZXRDVVRvT3BlbihzdXBlckludGZUeXBlc1tqal0uZ2V0Q29tcGlsYXRpb25Vbml0KCksIHdlYk1ldGhvZCk7DQotCQkJCQkNCi0JCQkJCWlmKGN1VG9PcGVuIT1udWxsKQ0KLQkJCQkJew0KLQkJCQkJCXJldHVybiBjdVRvT3BlbjsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQkNCi0JCQkJSVR5cGUgc3VwZXJDbGFzc1R5cGUgPSB0eXBlc1tpaV0ubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpLmdldFN1cGVyY2xhc3ModHlwZXNbaWldKTsNCi0JCQkJDQotCQkJCUlDb21waWxhdGlvblVuaXQgY3VUb09wZW4gPSBnZXRDVVRvT3BlbihzdXBlckNsYXNzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgd2ViTWV0aG9kKTsNCi0JCQkJCQ0KLQkJCQlpZihjdVRvT3BlbiE9bnVsbCkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIGN1VG9PcGVuOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkNCi0JCXsNCi0JCQlsb2dnZXIoKS5sb2dFcnJvcihqbWUuZ2V0TWVzc2FnZSgpLCBqbWUpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwNCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KLQkJdXBkYXRlU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgSUphdmFQcm9qZWN0IHByb2plY3QsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpKSB7DQotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7DQotDQotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0Ow0KLQkJdGhpcy5zZWkgPSBzZWk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoZSBzdHJ1Y3R1cmVkIHNlbGVjdGlvbiBoYXMgY2hhbmdlZCBpbiB0aGUgd29ya2JlbmNoLiBTdWJjbGFzc2VzIHNob3VsZA0KLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZWFjdCB0byB0aGUgY2hhbmdlLiBSZXR1cm5zIHRydWUgaWYgdGhlIGFjdGlvbg0KLQkgKiBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhpcyBzZWxlY3Rpb24sIGFuZCBmYWxzZSBvdGhlcndpc2UuDQotCSAqIA0KLQkgKiBXaGVuIHRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4sIHRoZSBzdXBlciBtZXRob2QgbXVzdCBhbHdheXMgYmUgaW52b2tlZC4NCi0JICogSWYgdGhlIHN1cGVyIG1ldGhvZCByZXR1cm5zIGZhbHNlLCB0aGlzIG1ldGhvZCBtdXN0IGFsc28gcmV0dXJuIGZhbHNlLg0KLQkgKiANCi0JICogQHBhcmFtIHNlbA0KLQkgKiAgICAgICAgICAgIHRoZSBuZXcgc3RydWN0dXJlZCBzZWxlY3Rpb24NCi0JICovDQotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzKSB7DQotCQlpZiAoIXN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzKSkNCi0JCQlyZXR1cm4gZmFsc2U7DQotDQotCQlzcmNPYmplY3QgPSBzLmdldEZpcnN0RWxlbWVudCgpOw0KLQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNkaXNwb3NlKCkNCi0JICovDQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotCQkvLyBEaXNwb3NlDQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI2luaXQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7DQotCQkvLyBpbml0DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI3J1bldpdGhFdmVudChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwNCi0JICogICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsNCi0JCXJ1bldpdGhFdmVudChldmVudCk7DQotDQotCX0NCi0JDQotCXByaXZhdGUgSUxvZ2dlciBsb2dnZXIoKSB7DQotCQlyZXR1cm4gbmV3IExvZ2dlcigpOw0KLQl9DQotDQotCXByaXZhdGUgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7DQotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgew0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvV1NBY3Rpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9hY3Rpb25zL1dTQWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmRmOGRkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvV1NBY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9uczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uQWN0aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQWN0aW9uQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uTWVudUNvbnN0YW50czsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgV1NBY3Rpb25Qcm92aWRlciBleHRlbmRzIENvbW1vbkFjdGlvblByb3ZpZGVyIA0KLXsNCi0JcHJpdmF0ZSBPcGVuV1NSZXNvdXJjZUFjdGlvbiBvcGVuQWN0aW9uOw0KLQ0KLQlwcml2YXRlIE5hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbiBuYXZpZ2F0ZUFjdGlvbjsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSANCi0Jew0KLQkJaWYob3BlbkFjdGlvbi5pc0VuYWJsZWQoKSkgDQotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElDb21tb25BY3Rpb25Db25zdGFudHMuT1BFTiwgb3BlbkFjdGlvbik7DQotCQkNCi0JCWlmKG5hdmlnYXRlQWN0aW9uLmlzRW5hYmxlZCgpKQ0KLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkZJTkQuZ2V0SWQoKSwgbmF2aWdhdGVBY3Rpb24pOwkNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSANCi0Jew0KLQkJaWYgKGdldENvbnRleHQoKT09bnVsbCB8fCBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQ0KLQkJCXJldHVybjsNCi0JCQ0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCk7DQotCQlvcGVuQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsNCi0JCW5hdmlnYXRlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsNCi0JCW5hdmlnYXRlQWN0aW9uLnNldFRleHQobmF2aWdhdGVBY3Rpb24uZ2V0VGV4dCgpKTsNCi0JCQ0KLQkJaWYgKG9wZW5BY3Rpb24uaXNFbmFibGVkKCkpDQotCQkJbWVudS5pbnNlcnRBZnRlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBvcGVuQWN0aW9uKTsNCi0JCQ0KLQkJaWYobmF2aWdhdGVBY3Rpb24uaXNFbmFibGVkKCkpDQotCQkJbWVudS5pbnNlcnRBZnRlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOX1dJVEgsIG5hdmlnYXRlQWN0aW9uKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgaW5pdChJQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZSBzaXRlKSB7DQotCQlzdXBlci5pbml0KHNpdGUpOw0KLQkJDQotCQlvcGVuQWN0aW9uID0gbmV3IE9wZW5XU1Jlc291cmNlQWN0aW9uKCk7DQotCQluYXZpZ2F0ZUFjdGlvbiA9IGluaXROYXZpZ2F0ZUFjdGlvbihzaXRlKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIE5hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbiBpbml0TmF2aWdhdGVBY3Rpb24oSUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGUgc2l0ZSkNCi0Jew0KLQkJcmV0dXJuIG5ldyBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb24oc2l0ZS5nZXRTdHJ1Y3R1cmVkVmlld2VyKCkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0KEFjdGlvbkNvbnRleHQgY29udGV4dCkgew0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiBjb250ZXh0LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIA0KLQkJew0KLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29udGV4dC5nZXRTZWxlY3Rpb24oKTsNCi0JCQkNCi0JCQlpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVHJlZVNlbGVjdGlvbikNCi0JCQl7DQotCQkJCVRyZWVQYXRoW10gcGF0aHMgPSAoKElUcmVlU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0UGF0aHNGb3Ioc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsNCi0JCQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7DQotCQkJCQ0KLQkJCQlmb3IoaW50IGlpPTA7IGlpPHBhdGhzLmxlbmd0aDsgaWkrKykNCi0JCQkJew0KLQkJCQkJVHJlZVBhdGggcGF0aCA9IHBhdGhzW2lpXTsNCi0JCQkJCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gbnVsbDsNCi0JCQkJCQ0KLQkJCQkJZm9yKGludCBqaj0wOyBqajxwYXRoLmdldFNlZ21lbnRDb3VudCgpOyBqaisrKQ0KLQkJCQkJew0KLQkJCQkJCWlmKHBhdGguZ2V0U2VnbWVudChqaikgaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKQ0KLQkJCQkJCXsNCi0JCQkJCQkJc2VpID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpcGF0aC5nZXRTZWdtZW50KGpqKTsNCi0JCQkJCQkJYnJlYWs7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJDQotCQkJCQlmb3IoaW50IGpqPTA7IGpqPHBhdGguZ2V0U2VnbWVudENvdW50KCk7IGpqKyspDQotCQkJCQl7DQotCQkJCQkJaWYocGF0aC5nZXRTZWdtZW50KGpqKSBpbnN0YW5jZW9mIElQcm9qZWN0KQ0KLQkJCQkJCXsNCi0JCQkJCQkJcHJvamVjdCA9IChJUHJvamVjdClwYXRoLmdldFNlZ21lbnQoamopOw0KLQkJCQkJCQlvcGVuQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uLCBnZXRKYXZhUHJvamVjdChwcm9qZWN0KSwgc2VpKTsNCi0JCQkJCQkJbmF2aWdhdGVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24sIGdldEphdmFQcm9qZWN0KHByb2plY3QpKTsNCi0JCQkJCQkJc3VwZXIuc2V0Q29udGV4dChjb250ZXh0KTsNCi0JCQkJCQkJcmV0dXJuOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCQkNCi0JCQlvcGVuQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsNCi0JCQluYXZpZ2F0ZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7DQotCQl9DQotCQkNCi0JCXN1cGVyLnNldENvbnRleHQoY29udGV4dCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSVByb2plY3QgcHJvamVjdCkNCi0Jew0KLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdmFsaWRhdGlvbi9Eb21WYWxpZGF0aW9uSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdmFsaWRhdGlvbi9Eb21WYWxpZGF0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI1ZWMzYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3ZhbGlkYXRpb24vRG9tVmFsaWRhdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Eb21VdGlsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RPTVJ1bnRpbWVFeHRlbnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01SdW50aW1lTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hDb250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsNCi0NCi0vKioNCi0gKiB7QGxpbmsgSVZhbGlkYXRpb25Db250ZXh0fSBpbXBsZW1lbnRvci4gQWN0cyBhcyBoZWxwZXIgY2xhc3MgZm9yIHZhbGlkYXRpb24uIFVzZWQNCi0gKiBieSB7QGxpbmsgRG9tVmFsaWRhdGlvbk1hbmFnZXJ9IHRvIHJldHJpZXZlIERPTSBtb2RlbC4NCi0gKiAgDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpDQotcHVibGljIGNsYXNzIERvbVZhbGlkYXRpb25IZWxwZXIgZXh0ZW5kcyBXb3JrYmVuY2hDb250ZXh0DQotewkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIC0gcmVnaXN0ZXJzIG1vZGVscyB0aGF0IHRoaXMgaGVscGVyIHdpbGwgc3VwcG9ydC4gUmVnaXN0cmF0aW9uIGlzIGRvbmUgDQotCSAqIGJ5IHNldHRpbmcgbW9kZWwgJ3N5bWJvbGljTmFtZScgYW5kIG1ldGhvZCB0byBiZSBjYWxsZWQgZm9yIHRoaXMgbWV0aG9kIHRvIGJlIHJldHJpZXZlZA0KLQkgKi8NCi0JcHVibGljIERvbVZhbGlkYXRpb25IZWxwZXIoKQ0KLQl7DQotCQlyZWdpc3Rlck1vZGVsKCJ3ZWJTZXJ2aWNlUHJvamVjdCIsICJnZXRXZWJTZXJ2aWNlUHJvamVjdCIsIG5ldyBDbGFzc1tdIHtTdHJpbmcuY2xhc3N9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCX0NCi0JDQotCS8qKg0KLQkgKiBFeGVjdXRlZCBieSB7QGxpbmsgV29ya2JlbmNoQ29udGV4dH0gd2hlbiB7QGxpbmsgV29ya2JlbmNoQ29udGV4dCNsb2FkTW9kZWwoU3RyaW5nLCBPYmplY3RbXSl9IGlzIGNhbGxlZA0KLQkgKiBhbmQgZmluZHMgdGhlIGNvcnJlc3BvbmRpbmcgdG8ge0BsaW5rICNnZXRQcm9qZWN0KCl9IHtAbGluayBJV2ViU2VydmljZVByb2plY3R9DQotCSAqIA0KLQkgKiBAcGFyYW0gZG9tSWQNCi0JICogQHJldHVybiBmb3VuZCB7QGxpbmsgSVdlYlNlcnZpY2VQcm9qZWN0fSBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JcHVibGljIElXZWJTZXJ2aWNlUHJvamVjdCBnZXRXZWJTZXJ2aWNlUHJvamVjdChmaW5hbCBTdHJpbmcgZG9tSWQpIA0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZG9tSWQsICJkb21JZCIpOyAvLyROT04tTkxTLTEkDQotCQkNCi0JCWZpbmFsIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZG9tUnVudGltZSA9IGdldERvbVJ1bnRpbWUoZG9tSWQpOw0KLQkJaWYgKGRvbVJ1bnRpbWUgPT0gbnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQl0cnkgew0KLQkJCWZpbmFsIElET00gZG9tID0gZG9tUnVudGltZS5nZXRET00oKTsNCi0JCQlpZiAoZG9tPT1udWxsKSB7DQotCQkJCXJldHVybiBudWxsOw0KLQkJCX0NCi0JCQkNCi0JCQlyZXR1cm4gRG9tVXRpbC5JTlNUQU5DRS5maW5kUHJvamVjdEJ5TmFtZShkb20sIGdldFByb2plY3QoKS5nZXROYW1lKCkpOw0KLQkJfSANCi0JCWNhdGNoIChXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiBlKSB7IC8vICRKTC1FWEMkDQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotCX0NCi0NCi0JcHJvdGVjdGVkIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZ2V0RG9tUnVudGltZShmaW5hbCBTdHJpbmcgZG9tSWQpIHsNCi0JCXJldHVybiBXc0RPTVJ1bnRpbWVNYW5hZ2VyLmluc3RhbmNlKCkuZ2V0RE9NUnVudGltZShkb21JZCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3ZhbGlkYXRpb24vRG9tVmFsaWRhdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi92YWxpZGF0aW9uL0RvbVZhbGlkYXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyMmYyNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3ZhbGlkYXRpb24vRG9tVmFsaWRhdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVHJlZUl0ZXJhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5pbnRlcm5hbC5wbHVnaW4uRG9tSW50ZWdyYXRpb25QbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklTRUlDaGlsZExpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklXZWJTZXJ2aWNlQ2hpbGRMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uRG9tVmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uSURvbVZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmRvbS52YWxpZGF0aW9uLkRvbVZhbGlkYXRpb25Db25zdGFudHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsNCi0NCi0vKioNCi0gKiBSZWdpc3RlcmVkIHRvIFdTVCB2YWxpZGF0aW9uIGZyYW1ld29yayBJVmFsaWRhdG9yLiBSZWNlaXZlcyBub3RpZmljYXRpb25zIGZvciANCi0gKiB2YWxpZGF0aW9uIHRvIGJlIHBlcmZvcm1lZCBhbmQgY2FsbHMgcmVnaXN0ZXJlZCBET00gdmFsaWRhdG9ycyB0byBwZXJmb3JtIHRoZQ0KLSAqIHJlYWwgdmFsaWRhdGlvbi4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIERvbVZhbGlkYXRpb25NYW5hZ2VyIGltcGxlbWVudHMgSVZhbGlkYXRvckpvYg0KLXsNCi0JcHVibGljIHZvaWQgY2xlYW51cChmaW5hbCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsJDQotCQkvLyBubyByZXNvdXJjZXMgZm9yIGNsZWFuIHVwDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0LCBmaW5hbCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsNCi0JCXZhbGlkYXRlSW5Kb2IoY29udGV4dCwgcmVwb3J0ZXIpOw0KLQl9CQ0KLQ0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0LCBmaW5hbCBJUmVwb3J0ZXIgcmVwb3J0ZXIpDQotCXsNCi0JCWNsZWFuTWFya2VycygoSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dCkgY29udGV4dCk7DQotCQkNCi0JCUlXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3Q7DQotCQlmb3IgKElEb21WYWxpZGF0b3IgdmFsaWRhdG9yIDogZ2V0VmFsaWRhdG9ycygpKSANCi0JCXsNCi0JCQl3c1Byb2plY3QgPSAoSVdlYlNlcnZpY2VQcm9qZWN0KWNvbnRleHQubG9hZE1vZGVsKCJ3ZWJTZXJ2aWNlUHJvamVjdCIsIG5ldyBTdHJpbmcgW117dmFsaWRhdG9yLmdldFN1cHBvcnRlZERvbVJ1bnRpbWUoKX0pOyAvLyROT04tTkxTLTEkDQotCQkJaWYgKHdzUHJvamVjdCA9PSBudWxsKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQl2YWxpZGF0b3IudmFsaWRhdGUod3NQcm9qZWN0KTsJCQkNCi0JCQlyZWZyZXNoVHJlZSh3c1Byb2plY3QpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gSVZhbGlkYXRvckpvYi5PS19TVEFUVVM7DQotCX0NCi0JDQotCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoZmluYWwgSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlcikgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFRyZWUoZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCkgDQotCXsNCi0JCWZpbmFsIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbGFiZWxQcm92aWRlcigpOw0KLQkJaWYgKGxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCQ0KLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSZWZyZXNoUnVubmFibGUobGFiZWxQcm92aWRlciwgd3NQcm9qZWN0KSk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcigpDQotCXsNCi0JCXJldHVybiBEb21JbnRlZ3JhdGlvblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhbk1hcmtlcnMoSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQ0KLQl7DQotCQl0cnkgew0KLQkJCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBjb250ZXh0LmdldFByb2plY3QoKTsNCi0JCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsNCi0JCQkJcHJvamVjdC5kZWxldGVNYXJrZXJzKERvbVZhbGlkYXRpb25Db25zdGFudHMuTUFSS0VSX0lELCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOw0KLQkJCX0NCi0JCX0gDQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJKG5ldyBMb2dnZXIoKSkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfQkJDQotCX0NCi0NCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248SURvbVZhbGlkYXRvcj4gZ2V0VmFsaWRhdG9ycygpDQotCXsNCi0JCXJldHVybiBEb21WYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmdldFJlZ2lzdGVyZWRWYWxpZGF0b3JzKCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDbGFzcyB0aGF0IGZpcmVzIGxhYmVsIGNoYW5nZWQgZXZlbnQgdG8gdGhlIGxhYmVsIHByb3ZpZGVyIHRvIGFwcGx5IHZhbGlkYXRpb24NCi0JICogcmVzdWx0cyBpbiB0aGUgZGlzcGxheWVkIHRyZWUgLSBpLmUuIGRlY29yYXRlIGltYWdlcw0KLQkgKiANCi0JICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLQkgKi8NCi0JcHJvdGVjdGVkIGNsYXNzIFJlZnJlc2hSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIA0KLQl7DQotCQlwcml2YXRlIGZpbmFsIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOw0KLQkJcHJpdmF0ZSBmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0Ow0KLQkJDQotCQlwdWJsaWMgUmVmcmVzaFJ1bm5hYmxlKGZpbmFsIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLCBmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0KSB7DQotCQkJdGhpcy5sYWJlbFByb3ZpZGVyID0gbGFiZWxQcm92aWRlcjsNCi0JCQl0aGlzLndzUHJvamVjdCA9IHdzUHJvamVjdDsNCi0JCX0NCi0JCQ0KLQkJcHVibGljIHZvaWQgcnVuKCkgDQotCQl7DQotCQkJbGFiZWxQcm92aWRlci5maXJlTGFiZWxQcm92aWRlckNoYW5nZWQod3NQcm9qZWN0KTsNCi0JCQkNCi0JCQlmaXJlTGFiZWxQcm92aWRlckNoYW5nZWQoSVNFSUNoaWxkTGlzdC5jbGFzcyk7DQotCQkJZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKElXZWJTZXJ2aWNlQ2hpbGRMaXN0LmNsYXNzKTsNCi0JCQkNCi0JCQlmaW5hbCBUcmVlSXRlcmF0b3I8RU9iamVjdD4gYWxsQ2hpbGRzID0gd3NQcm9qZWN0LmVBbGxDb250ZW50cygpOw0KLQkJCXdoaWxlIChhbGxDaGlsZHMuaGFzTmV4dCgpKSB7DQotCQkJCWxhYmVsUHJvdmlkZXIuZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKGFsbENoaWxkcy5uZXh0KCkpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcHJpdmF0ZSB2b2lkIGZpcmVMYWJlbFByb3ZpZGVyQ2hhbmdlZChmaW5hbCBDbGFzczw/PiBhZGFwdGVyQ2xhc3MpDQotCQl7DQotCQkJZmluYWwgQWRhcHRlciBhZGFwdGVyID0gQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQod3NQcm9qZWN0LCBhZGFwdGVyQ2xhc3MpOw0KLQkJCWlmIChhZGFwdGVyID09IG51bGwpIHsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCQkNCi0JCQlsYWJlbFByb3ZpZGVyLmZpcmVMYWJlbFByb3ZpZGVyQ2hhbmdlZChhZGFwdGVyKTsJDQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMWE0MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzkzODc2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlMDQ4NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jTW9uIEp1bCAyMCAxNToyNTozMSBFRVNUIDIwMDkNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJjYTY4ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wDQotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMA0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTtzaW5nbGV0b246PXRydWUNCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyDQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVQbHVnaW4NCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLA0KLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLA0KLSBvcmcuZWNsaXBzZS51aSwNCi0gb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24sDQotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsDQotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLA0KLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLA0KLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZQ0KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQ0KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGksDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cyIsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW47eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzIiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzIiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnZhbGlkYXRpb24ucHJvdmlkZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzIiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uaW1wbCwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmRlZmF1bHRzLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplciwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnByb3ZpZGVyLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucmVnaXN0cnksDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uaW1wbCwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ubWVzc2FnZXMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5zZWksDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLndlYm1ldGhvZCwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ud2VicGFyYW0sDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLndlYnNlcnZpY2UNCi1JbXBvcnQtUGFja2FnZTogamF2YXguandzDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MTBhZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5BdWd1c3QgMTUsIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2FhZTI0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcDQotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcDQotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MDAyMzY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIExhbmd1YWdlIEZpbGUgZm9yIHRoaXMgUGx1Z2luDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgR2VuZXJpYyBMYWJlbCBhbmQgRGVzY3JpcHRpb24NCi1CdW5kbGUtTmFtZS4wPUpBWC1XUyBET00gcnVudGltZSBwbHVnLWluIChJbmN1YmF0aW9uKQ0KLUJ1bmRsZS1WZW5kb3IuMD1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQ0KLQ0KLURvbVZhbGlkYXRvcnNFeHRlbnNpb25fTmFtZSA9IERPTSBWYWxpZGF0b3INCi1Eb21SdW50aW1lc0V4dGVuc2lvbl9OYW1lID0gRE9NIFJ1bnRpbWVzDQotRXh0ZW5zaW9uUG9pbnQtTmFtZS4zID0gSkVFNSBET00gY29udHJpYnV0aW9uDQotRXh0ZW5zaW9uUG9pbnQtTmFtZS41ID0gSkVFNSBET00gdmFsaWRhdGlvbiBjb250cmlidXRpb24NCi1jYXRlZ29yeS5uYW1lLjAgPSBKRUU1IERPTSBjb25zdHJhaW50IHByb3ZpZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiZmExOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/Pg0KLTwhLS0NCi0gICAgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAgIA0KLSAgICBDb250cmlidXRvcnM6DQotICAgICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gLS0+DQotDQotPHBsdWdpbj4NCi0NCi0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkb21ydW50aW1lcyIgbmFtZT0iJURvbVJ1bnRpbWVzRXh0ZW5zaW9uX05hbWUiIHNjaGVtYT0ic2NoZW1hL3J1bnRpbWVzLmV4c2QiLz4NCi0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkb21WYWxpZGF0b3IiIG5hbWU9IiVEb21WYWxpZGF0b3JzRXh0ZW5zaW9uX05hbWUiIHNjaGVtYT0ic2NoZW1hL2RvbVZhbGlkYXRvci5leHNkIi8+DQotICAgICAgDQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuc3RhcnR1cCI+DQotICAgICAgPHN0YXJ0dXAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Xc0RvbVN0YXJ0dXBQYXJ0aWNpcGFudCIvPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIA0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+DQotICAgCTxwYWNrYWdlIA0KLSAgICAgICB1cmkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlIiANCi0gICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlIiAvPg0KLSAgCTwvZXh0ZW5zaW9uPg0KLQ0KLQ0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5qZWU1IiANCi0gICAgICAgICBuYW1lPSIlRXh0ZW5zaW9uUG9pbnQtTmFtZS4zIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuZG9tcnVudGltZXMiPg0KLSAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb24iLz4NCi0gICAgICA8cHJvamVjdF9mYWNldCBpZD0ianN0LmVqYiIgdmVyc2lvbj0iMy4wIi8+DQotICAgICAgPHByb2plY3RfZmFjZXQgaWQ9ImpzdC53ZWIiIHZlcnNpb249IjIuNSIvPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBpZD0iZG9tIg0KLSAgICAgICAgIG5hbWU9IiVFeHRlbnNpb25Qb2ludC1OYW1lLjUiDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5kb21WYWxpZGF0b3IiPg0KLSAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uSmF4V3NEb21WYWxpZGF0b3IiLz4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICANCi0gICA8IS0tIHt7eyBFTUYgdmFsaWRhdGlvbiBjb250cmlidXRpb24gLS0+DQotDQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5jb25zdHJhaW50UHJvdmlkZXJzIj4NCi0gICAgICA8Y2F0ZWdvcnkNCi0gICAgICAgICAgICBuYW1lPSIlY2F0ZWdvcnkubmFtZS4wIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmplZTUiLz4NCi0gICAgICA8Y29uc3RyYWludFByb3ZpZGVyIA0KLSAgICAgIAkJY2FjaGU9InRydWUiIA0KLSAgICAgIAkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLldzRHluYW1pY01vZGVsQ29uc3RyYWludFByb3ZpZGVyIj4NCi0gICAgICAJPHBhY2thZ2UgbmFtZXNwYWNlVXJpPSJodHRwOi8vL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9kb20uZWNvcmUiLz4NCi0gICAgICA8L2NvbnN0cmFpbnRQcm92aWRlcj4gDQotICAgPC9leHRlbnNpb24+DQotCTxleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uY29uc3RyYWludEJpbmRpbmdzIj4NCi0gICAgICA8Y2xpZW50Q29udGV4dA0KLSAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmplZTUuZG9tQ29udGV4dCI+DQotICAgICAgICAgPGVuYWJsZW1lbnQ+DQotICAgICAgICAgICAgPG9yPg0KLSAgICAgICAgICAgICAgIDxpbnN0YW5jZW9mDQotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSI+DQotICAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPg0KLSAgICAgICAgICAgICAgIDxpbnN0YW5jZW9mDQotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UiPg0KLSAgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4NCi0gICAgICAgICAgICAgICA8aW5zdGFuY2VvZg0KLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QiPg0KLSAgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4NCi0gICAgICAgICAgICAgICA8aW5zdGFuY2VvZg0KLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSI+DQotICAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPiAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIDwvb3I+DQotICAgICAgICAgPC9lbmFibGVtZW50Pg0KLSAgICAgIDwvY2xpZW50Q29udGV4dD4NCi0gICAgICA8YmluZGluZw0KLSAgICAgICAgICAgIGNvbnRleHQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uamVlNS5kb21Db250ZXh0Ig0KLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmplZTUiLz4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi52YWxpZGF0aW9uTGlzdGVuZXJzIj4NCi0gICAgICAgPGxpc3RlbmVyIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5Xc1Byb2JsZW1zUmVwb3J0ZXIiPg0KLSAgICAgICAgICAgPGNsaWVudENvbnRleHQgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uamVlNS5kb21Db250ZXh0Ii8+DQotICAgICAgIDwvbGlzdGVuZXI+DQotICAgPC9leHRlbnNpb24+DQotICAgPCEtLSB9fX0gRU1GIHZhbGlkYXRpb24gY29udHJpYnV0aW9uIC0tPiAgDQotICAgDQotPC9wbHVnaW4+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc2NoZW1hL2RvbVZhbGlkYXRvci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc2NoZW1hL2RvbVZhbGlkYXRvci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzU0MzgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NjaGVtYS9kb21WYWxpZGF0b3IuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiIGlkPSJjb25zdW1lcnR5cGUiIG5hbWU9IkNvbnN1bWVyIFR5cGUgUHJvdmlkZXIiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgRXh0ZW5zaW9uIHBvaW50IGZvciByZWdpc3RlcmluZyBET00gdmFsaWRhdG9yIGZhY3RvcnkgdGhhdCB3aWxsIGluc3RhbnRpYXRlLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJpbXBsZW1lbnRhdGlvbiI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgRGVzY3JpYmVzIGEgY29uc3VtZXJ0eXBlDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5JRG9tVmFsaWRhdG9yIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zY2hlbWEvcnVudGltZXMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NjaGVtYS9ydW50aW1lcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OTNlYjI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NjaGVtYS9ydW50aW1lcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSIgaWQ9InN1cHBvcnRlZHJ1bnRpbWVzIiBuYW1lPSJTdXBwb3J0ZWQgUnVudGltZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVXNlIHRoaXMgZXh0ZW5zaW9uIHBvaW50IHRvIGFkZCBzdXBwb3J0IGZvciBhIHJ1bnRpbWUgaW4gdGhlIFdTIERPTSBUcmVlLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb2plY3RfZmFjZXQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJpbXBsZW1lbnRhdGlvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NET01SdW50aW1lRXh0ZW5zaW9uIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJwcm9qZWN0X2ZhY2V0Ij4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvRG9tVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9Eb21VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3ZDE4Y2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9Eb21VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuRG9tU3dpdGNoOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBEb21VdGlsDQotew0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERvbVV0aWwgSU5TVEFOQ0UgPSBuZXcgRG9tVXRpbCgpOw0KLQkNCi0JcHJpdmF0ZSBmaW5hbCBEb21Td2l0Y2g8U3RyaW5nPiBpbXBsU3dpdGNoOw0KLQkNCi0JcHVibGljIERvbVV0aWwoKSB7DQotCQlpbXBsU3dpdGNoID0gY3JlYXRlSW1wbEZpbmRlclN3aXRjaCgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlVmFsdWUoZmluYWwgRU9iamVjdCBvYmplY3QsIGZpbmFsIGludCBmZWF0dXJlSWQsIGZpbmFsIE9iamVjdCB2YWx1ZSkNCi0Jew0KLQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBvYmplY3QuZUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKGZlYXR1cmVJZCk7DQotCQlvYmplY3QuZVNldChmZWF0dXJlLCB2YWx1ZSk7DQotCX0NCi0NCi0JcHVibGljIE9iamVjdCBnZXRGZWF0dXJlVmFsdWUoZmluYWwgRU9iamVjdCBvYmplY3QsIGZpbmFsIGludCBmZWF0dXJlSWQpDQotCXsNCi0JCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gb2JqZWN0LmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlSWQpOw0KLQkJcmV0dXJuIG9iamVjdC5lR2V0KGZlYXR1cmUpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGFkZFRvQ29sbGVjdGlvbkZlYXR1cmUoZmluYWwgRU9iamVjdCBvYmplY3QsIGZpbmFsIGludCBmZWF0dXJlSWQsIGZpbmFsIE9iamVjdCB2YWx1ZSkNCi0Jew0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCQlmaW5hbCBDb2xsZWN0aW9uPE9iamVjdD4gb2xkVmFsdWUgPSAoQ29sbGVjdGlvbjxPYmplY3Q+KSBnZXRGZWF0dXJlVmFsdWUob2JqZWN0LCBmZWF0dXJlSWQpOw0KLQkJb2xkVmFsdWUuYWRkKHZhbHVlKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSVdlYlNlcnZpY2VQcm9qZWN0IGZpbmRQcm9qZWN0QnlOYW1lKElET00gZG9tLCBTdHJpbmcgbmFtZSkNCi0Jew0KLQkJZm9yIChJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0IDogZG9tLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpKQ0KLQkJew0KLQkJCWlmICh3c1Byb2plY3QuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiB3c1Byb2plY3Q7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHVibGljIElXZWJTZXJ2aWNlIGZpbmRXc0J5SW1wbE5hbWUoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCwgU3RyaW5nIG5hbWUpDQotCXsNCi0JCWZvciAoSVdlYlNlcnZpY2Ugd3MgOiB3c1Byb2plY3QuZ2V0V2ViU2VydmljZXMoKSkNCi0JCXsNCi0JCQlpZiAod3MuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMobmFtZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gd3M7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHVibGljIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZmluZFNlaUJ5SW1wbE5hbWUoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCwgU3RyaW5nIG5hbWUpDQotCXsNCi0JCWZvciAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgOiB3c1Byb2plY3QuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpKQ0KLQkJew0KLQkJCWlmIChzZWkuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMobmFtZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gc2VpOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQkNCi0JcHVibGljIElXZWJNZXRob2QgZmluZFdlYk1ldGhvZEJ5SW1wbChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSwgU3RyaW5nIGltcGwpDQotCXsNCi0JCWZvciAoSVdlYk1ldGhvZCB3bSA6IHNlaS5nZXRXZWJNZXRob2RzKCkpDQotCQl7DQotCQkJaWYgKHdtLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKGltcGwpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHdtOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwdWJsaWMgSU1ldGhvZCBmaW5kTWV0aG9kKGZpbmFsIElUeXBlIHNlaVR5cGUsIGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZvciAoSU1ldGhvZCBtZXRob2QgOiBzZWlUeXBlLmdldE1ldGhvZHMoKSkgDQotCQl7DQotCQkJaWYgKHdlYk1ldGhvZC5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhjYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSkpIHsNCi0JCQkJcmV0dXJuIG1ldGhvZDsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9CQ0KLQ0KLQlwdWJsaWMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudCBmaW5kSmF2YVdlYlNlcnZpY2VFbGVtQnlJbXBsTmFtZShJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBTdHJpbmcgbmFtZSkNCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSBmaW5kV3NCeUltcGxOYW1lKHdzUHJvamVjdCwgbmFtZSk7DQotCQlyZXR1cm4gd3MgPT0gbnVsbCA/IGZpbmRTZWlCeUltcGxOYW1lKHdzUHJvamVjdCwgbmFtZSkgOiB3czsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENhbGN1bGF0ZXMgdGhlIG1ldGhvZCBzaWduYXR1cmUgdG8gYmUgdXNlZCBhcyBpbXBsZW1lbnRhdGlvbiBpbiB7QGxpbmsgSVdlYk1ldGhvZH0NCi0JICogQHBhcmFtIG1ldGhvZA0KLQkgKiBAcmV0dXJuIGNhbGN1bGF0ZWQgc3RyaW5nDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNhbGNJbXBsZW1lbnRhdGlvbihmaW5hbCBJTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7CQkNCi0JCXJldHVybiBtZXRob2QuZ2V0RWxlbWVudE5hbWUoKSArIG1ldGhvZC5nZXRTaWduYXR1cmUoKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEV4dHJhY3Qge0BsaW5rIElXZWJTZXJ2aWNlUHJvamVjdH0gb3V0IG9mIERPTSBvYmplY3QgYnkgcmVjdXJzaXZlbHkNCi0JICogaXRlcmF0aW5nIHBhcmVudCBvYmplY3RzLg0KLQkgKiBAcGFyYW0gZU9iamVjdA0KLQkgKiBAcmV0dXJuIHRoZSBmb3VuZCBwcm9qZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGluIGNhc2Ugbm90IGZvdW5kDQotCSAqLw0KLQlwdWJsaWMgSVdlYlNlcnZpY2VQcm9qZWN0IGZpbmRXc1Byb2plY3QoRU9iamVjdCBlT2JqZWN0KQ0KLQl7DQotCQlFT2JqZWN0IHBhcmVudCA9IGVPYmplY3Q7DQotCQl3aGlsZSAocGFyZW50IT1udWxsKSANCi0JCXsNCi0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSVdlYlNlcnZpY2VQcm9qZWN0KSB7DQotCQkJCXJldHVybiAoSVdlYlNlcnZpY2VQcm9qZWN0KXBhcmVudDsNCi0JCQl9DQotCQkJDQotCQkJcGFyZW50ID0gcGFyZW50LmVDb250YWluZXIoKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0JCQ0KLQkNCi0JLyoqDQotCSAqIERlZmluZXMgaWYgdGhpcyBTRUkgaXMgcGFydCBvZiBvdXRzaWRlLWluIHdlYiBzZXJ2aWNlDQotCSAqIEBwYXJhbSBzZWkNCi0JICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGEgd2ViIHNlcnZpY2Ugd2l0aCB3c2RsTG9jYXRpb24gc2V0IHRvIHNvbWV0aGluZyBkaWZmZXJlbnQgdGhhbiA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNPdXRzaWRlSW5XZWJTZXJ2aWNlKGZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpKQ0KLQl7DQotCQlpZiAoc2VpID09IG51bGwpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCWZvciAoSVdlYlNlcnZpY2Ugd2ViU2VydmljZSA6IHNlaS5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpKSB7DQotCQkJaWYgKHdlYlNlcnZpY2UuZ2V0V3NkbExvY2F0aW9uKCkhPW51bGwpIHsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0JDQotCQ0KLQkvKioNCi0JICogQ2FsY3VsYXRlcyB1bmlxdWUgaW1wbGVtZW50YXRpb24gZm9yIERPTSBvYmplY3QgaW4gdGhlIHNjb3BlIG9mIHRoZSByZXNvdXJjZSBpbiB3aGljaA0KLQkgKiB0aGV5IGV4aXN0LiBVc2VmdWwgd2hlbiB5b3UgbmVlZCB0byB1bmlxdWVseSBpZGVudGlmeSBET00gb2JqZWN0LiANCi0JICogDQotCSAqIEBwYXJhbSBlT2JqZWN0DQotCSAqIEByZXR1cm4gY2FsY3VsYXRlZCBpbXBsZW1lbnRhdGlvbg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBjYWxjVW5pcXVlSW1wbChmaW5hbCBFT2JqZWN0IGVPYmplY3QpDQotCXsNCi0JCWlmIChlT2JqZWN0LmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpID09IERvbVBhY2thZ2UuSVdFQl9QQVJBTSkgDQotCQl7DQotCQkJZmluYWwgSVdlYlBhcmFtIHdwID0gKElXZWJQYXJhbSkgZU9iamVjdDsNCi0JCQlyZXR1cm4gKChJV2ViTWV0aG9kKXdwLmVDb250YWluZXIoKSkuZ2V0SW1wbGVtZW50YXRpb24oKSArICJbIiArIHdwLmdldEltcGxlbWVudGF0aW9uKCkgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZXh0cmFjdEltcGxlbWVudGF0aW9uKGVPYmplY3QpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogRXh0cmFjdHMgdGhlIGltcGxlbWVudGF0aW9uIHByb3BlcnR5IGZvciBET00gb2JqZWN0IHdpdGhvdXQgY2FzdGluZyA6LUQuDQotCSAqDQotCSAqIEBwYXJhbSBlT2JqZWN0DQotCSAqIEByZXR1cm4gdGhlIGltcGxlbWVudGF0aW9uIA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBleHRyYWN0SW1wbGVtZW50YXRpb24oZmluYWwgRU9iamVjdCBlT2JqZWN0KSB7DQotCQlyZXR1cm4gaW1wbFN3aXRjaC5kb1N3aXRjaChlT2JqZWN0KTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBEb21Td2l0Y2g8U3RyaW5nPiBjcmVhdGVJbXBsRmluZGVyU3dpdGNoKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBEb21Td2l0Y2g8U3RyaW5nPigpDQotCQl7DQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIFN0cmluZyBjYXNlSVdlYlNlcnZpY2UoSVdlYlNlcnZpY2Ugd3MpIHsNCi0JCQkJcmV0dXJuIHdzLmdldEltcGxlbWVudGF0aW9uKCk7DQotCQkJfQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBTdHJpbmcgY2FzZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkpIHsNCi0JCQkJcmV0dXJuIHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpOw0KLQkJCX0NCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgU3RyaW5nIGNhc2VJV2ViTWV0aG9kKElXZWJNZXRob2Qgd20pIHsNCi0JCQkJcmV0dXJuIHdtLmdldEltcGxlbWVudGF0aW9uKCk7DQotCQkJfQkNCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgU3RyaW5nIGNhc2VJV2ViUGFyYW0oSVdlYlBhcmFtIHdwKSB7DQotCQkJCXJldHVybiB3cC5nZXRJbXBsZW1lbnRhdGlvbigpOw0KLQkJCX0NCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgU3RyaW5nIGNhc2VJV2ViU2VydmljZVByb2plY3QoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCkgew0KLQkJCQlyZXR1cm4gd3NQcm9qZWN0LmdldE5hbWUoKTsNCi0JCQl9DQotCQl9Ow0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvR2VuZXJhbFR5cGVzTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvR2VuZXJhbFR5cGVzTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGM0YmRiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0dlbmVyYWxUeXBlc05hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTsNCi0NCi0vKioNCi0gKiBDbGFzcyBjb250YWluaW5nIGNvbnN0YXRucyB3aXRoIG5hbWVzIG9mIHNvbWUgZ2VuZXJhbCB0eXBlcyB1c2VkIG9mdGVuIGluIHZhbGlkYXRpb24uDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqIA0KLSAqLw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgR2VuZXJhbFR5cGVzTmFtZXMNCi17DQotCS8qKiBqYXZhLmxhbmcuT2JqZWN0ICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTEFOR19PQkpFQ1QgPSAiamF2YS5sYW5nLk9iamVjdCI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqIGphdmEuaW8uU2VyaWFsaXphYmxlICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfSU9fU0VSSUFMSVpBQkxFID0gImphdmEuaW8uU2VyaWFsaXphYmxlIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKiogamF2YS5ybWkuUmVtb3RlICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfUk1JX1JFTU9URSA9ICJqYXZhLnJtaS5SZW1vdGUiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKiBqYXZhLmxhbmcuVGhyb3dhYmxlICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTEFOR19USFJPV0FCTEUgPSAiamF2YS5sYW5nLlRocm93YWJsZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqIGphdmEubGFuZy5FeGNlcHRpb24gKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9MQU5HX0VYQ0VQVElPTiA9ICJqYXZhLmxhbmcuRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKiogamF2YS5sYW5nLkNsb25lYWJsZSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0xBTkdfQ0xPTkVBQkxFID0gImphdmEubGFuZy5DbG9uZWFibGUiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKiBqYXZhLmxhbmcuQ29tcGFyYWJsZSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0xBTkdfQ09NUEFSQUJMRSA9ICJqYXZhLmxhbmcuQ29tcGFyYWJsZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqIGphdmEudXRpbC5NYXAgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9VVElMX01BUCA9ICJqYXZhLnV0aWwuTWFwIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKiogamF2YS51dGlsLkNvbGxlY3Rpb24gKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9VVElMX0NPTExFQ1RJT04gPSAiamF2YS51dGlsLkNvbGxlY3Rpb24iOyAvLyROT04tTkxTLTEkDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSU5hbWVkRXh0ZW5zaW9uSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JTmFtZWRFeHRlbnNpb25JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlNTA5YWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JTmFtZWRFeHRlbnNpb25JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgcmVwcmVzZW50aWcgYW5kIGV4dGVudGlvbi4NCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElOYW1lZEV4dGVuc2lvbkluZm8NCi17DQotDQotCS8qKg0KLQkgKiBUaGUgdW5pcXVlIElEIHRvIGlkZW50aWZ5IHRoaXMgY29uc3VtZXIgdHlwZSB3aGVuIGNhbGxpbmcgdGhlIDxjb2RlPlByb3h5R2VuZXJhdG9yRmFjdG9yeTwvY29kZT4sIGUuZy4gPGNvZGU+amVlL2pheHdzPC9jb2RlPg0KLQkgKiANCi0JICogQHJldHVybiBub24tZW1wdHkgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIElEDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldElkKCk7DQotDQotCS8qKg0KLQkgKiBBIHZlcmJvc2UgbmFtZSBmb3IgdGhlIHR5cGUgb2YgY29uc3VtZXIsIGUuZy4gPGNvZGU+SkFYLVdTPC9jb2RlPg0KLQkgKiANCi0JICogQHJldHVybiBsb2NhbGl6ZWQgc3RyaW5nIHVzZWQgZm9yIHRoZSBVSQ0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROYW1lKCk7DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5RGVmYXVsdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5RGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmNiY2QxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lQcm9wZXJ0eURlZmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgdGhhdCBwcm92aWRlcyBkZWZhdWx0IHZhbHVlcyBmb3IgRE9NIG9iamVjdCdzIHByb3BlcnRpZXMuDQotICogVXN1YWxseSB0aGlzIGludGVyZmFjZSBzaG91bGQgYmUgdXNlZCBieSBjbGllbnRzIHRoYXQgbmVlZCB0byByZXZlcnQgc29tZQ0KLSAqIHByb3BlcnR5IHZhbHVlIHRvIHRoZSBkZWZhdWx0IG9uZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGludGVyZmFjZSBJUHJvcGVydHlEZWZhdWx0cyANCi17DQotCS8qKg0KLQkgKiBEZWZpbmVzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIDxjb2RlPmZlYXR1cmU8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIGZlYXR1cmUgdGhlIGZlYXR1cmUgcmVwcmVzZW50aW5nIHRoZSBvYmplY3RzIHByb3BlcnR5IHR5cGUNCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4gSW4gY2FzZSA8Y29kZT5udWxsPC9jb2RlPiBpcyBwb3NzaWJsZSBwcm9wZXJ0eSB2YWx1ZQ0KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBtaWdodCBiZSByZXR1cm5lZA0KLQkgKi8NCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlTdGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOGM0ZTliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5U3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSBmb3IgY2hlY2tpbmcgdGhlIHN0YXRlIG9mIHNvbWUgcHJvcGVydHkgZm9yIGNvbmNyZXRlIERPTSBvYmplY3QuDQotICogVGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGJlIHVzZWQgYnkgRE9NIGNsaWVudHMgdGhhdCBuZWVkIHRvIGtub3cgaWYgc29tZSBwcm9wZXJ0eSANCi0gKiBjYW4gYmUgY2hhbmdlZCAtIGZvciBleGFtcGxlIFVJIGVkaXRvciB0aGF0IG5lZWRzIHRvIGtub3cgaWYgdGhlIHByb3BlcnR5IHNob3VsZA0KLSAqIGJlIGVuYWJsZWQgZm9yIGVkaXQgb3IgZGlzYWJsZWQuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3BlcnR5U3RhdGUgDQotew0KLQkvKioNCi0JICogRGVmaW5lcyBpZiBwcm9wZXJ0eSBpcyBjaGFuZ2VhYmxlLg0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgcHJvcGVydHkgY2FuIGJlIGNoYW5nZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzQ2hhbmdlYWJsZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvUHJpbWl0aXZlVHlwZUhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvUHJpbWl0aXZlVHlwZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTUxMjdiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL1ByaW1pdGl2ZVR5cGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIFV0aWxpdHkgY2xhc3MgdXNlZCBmb3Igc29tZSBnZW5lcmFsIHByaW1pdGl2ZSB0eXBlIGNoZWNrcy9vcGVyYXRpb25zLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKiANCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgUHJpbWl0aXZlVHlwZUhhbmRsZXINCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUlJBWV9NQVJLID0gIltdIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRCA9ICJ2b2lkIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHByaW1pdGl2ZVR5cGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotDQotCXN0YXRpYw0KLQl7DQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImJvb2xlYW4iLCAiamF2YS5sYW5nLkJvb2xlYW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImphdmEubGFuZy5Cb29sZWFuIiwgImphdmEubGFuZy5Cb29sZWFuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJieXRlIiwgImphdmEubGFuZy5CeXRlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJqYXZhLmxhbmcuQnl0ZSIsICJqYXZhLmxhbmcuQnl0ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCXByaW1pdGl2ZVR5cGVzLnB1dCgiY2hhciIsICJqYXZhLmxhbmcuQ2hhcmFjdGVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJqYXZhLmxhbmcuQ2hhcmFjdGVyIiwgImphdmEubGFuZy5DaGFyYWN0ZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImRvdWJsZSIsICJqYXZhLmxhbmcuRG91YmxlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJqYXZhLmxhbmcuRG91YmxlIiwgImphdmEubGFuZy5Eb3VibGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImZsb2F0IiwgImphdmEubGFuZy5GbG9hdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCXByaW1pdGl2ZVR5cGVzLnB1dCgiamF2YS5sYW5nLkZsb2F0IiwgImphdmEubGFuZy5GbG9hdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCXByaW1pdGl2ZVR5cGVzLnB1dCgiaW50IiwgImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJqYXZhLmxhbmcuSW50ZWdlciIsICJqYXZhLmxhbmcuSW50ZWdlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCXByaW1pdGl2ZVR5cGVzLnB1dCgiamF2YS5sYW5nLlN0cmluZyIsICJqYXZhLmxhbmcuU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJsb25nIiwgImphdmEubGFuZy5Mb25nIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJqYXZhLmxhbmcuTG9uZyIsICJqYXZhLmxhbmcuTG9uZyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCXByaW1pdGl2ZVR5cGVzLnB1dCgic2hvcnQiLCAiamF2YS5sYW5nLlNob3J0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJqYXZhLmxhbmcuU2hvcnQiLCAiamF2YS5sYW5nLlNob3J0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgdHlwZSBmb3IgcHJpbWl0aXZlIHR5cGUuIE1hcHBpbmcgYmV0d2VlbiB0eXBlczoNCi0JICogDQotCSAqIDxwcmU+DQotCSAqICAmcXVvdDtib29sZWFuLCAgICAgICAgICAgICAgJnF1b3Q7amF2YS5sYW5nLkJvb2xlYW4mcXVvdDsNCi0JICogICZxdW90O2phdmEubGFuZy5Cb29sZWFuJnF1b3Q7LCAgICZxdW90O2phdmEubGFuZy5Cb29sZWFuJnF1b3Q7DQotCSAqICAmcXVvdDtieXRlJnF1b3Q7LCAgICAgICAgICAgICAgICAmcXVvdDtqYXZhLmxhbmcuQnl0ZSZxdW90Ow0KLQkgKiAgJnF1b3Q7amF2YS5sYW5nLkJ5dGUmcXVvdDssICAgICAgJnF1b3Q7amF2YS5sYW5nLkJ5dGUmcXVvdDsNCi0JICogICZxdW90O2NoYXImcXVvdDssICAgICAgICAgICAgICAgICZxdW90O2phdmEubGFuZy5DaGFyYWN0ZXImcXVvdDsNCi0JICogICZxdW90O2phdmEubGFuZy5DaGFyYWN0ZXImcXVvdDssICZxdW90O2phdmEubGFuZy5DaGFyYWN0ZXImcXVvdDsNCi0JICogICZxdW90O2RvdWJsZSZxdW90OywgICAgICAgICAgICAgICZxdW90O2phdmEubGFuZy5Eb3VibGUmcXVvdDsNCi0JICogICZxdW90O2phdmEubGFuZy5Eb3VibGUmcXVvdDssICAgICZxdW90O2phdmEubGFuZy5Eb3VibGUmcXVvdDsNCi0JICogICZxdW90O2Zsb2F0JnF1b3Q7LCAgICAgICAgICAgICAgICZxdW90O2phdmEubGFuZy5GbG9hdCZxdW90Ow0KLQkgKiAgJnF1b3Q7amF2YS5sYW5nLkZsb2F0JnF1b3Q7LCAgICAgJnF1b3Q7amF2YS5sYW5nLkZsb2F0JnF1b3Q7DQotCSAqICAmcXVvdDtpbnQmcXVvdDssICAgICAgICAgICAgICAgICAmcXVvdDtqYXZhLmxhbmcuSW50ZWdlciZxdW90Ow0KLQkgKiAgJnF1b3Q7amF2YS5sYW5nLkludGVnZXImcXVvdDssICAgJnF1b3Q7amF2YS5sYW5nLkludGVnZXImcXVvdDsNCi0JICogICZxdW90O2phdmEubGFuZy5TdHJpbmcmcXVvdDssICAgICZxdW90O2phdmEubGFuZy5TdHJpbmcmcXVvdDsNCi0JICogICZxdW90O2xvbmcmcXVvdDssICAgICAgICAgICAgICAgICZxdW90O2phdmEubGFuZy5Mb25nJnF1b3Q7DQotCSAqICAmcXVvdDtqYXZhLmxhbmcuTG9uZyZxdW90OywgICAgICAmcXVvdDtqYXZhLmxhbmcuTG9uZyZxdW90Ow0KLQkgKiAgJnF1b3Q7c2hvcnQmcXVvdDssICAgICAgICAgICAgICAgJnF1b3Q7amF2YS5sYW5nLlNob3J0JnF1b3Q7DQotCSAqICAmcXVvdDtqYXZhLmxhbmcuU2hvcnQmcXVvdDssICAgICAmcXVvdDtqYXZhLmxhbmcuU2hvcnQmcXVvdDsNCi0JICogPC9wcmU+DQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZU5hbWUNCi0JICogQHJldHVybiB3cmFwcGVyIGNsYXNzIG5hbWUgZm9yIDx0dD50eXBlTmFtZTwvdHQ+Lg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T2JqZWN0VHlwZUZvclByaW1pdGl2ZVR5cGUoU3RyaW5nIHR5cGVOYW1lKQ0KLQl7DQotCQlyZXR1cm4gcHJpbWl0aXZlVHlwZXMuZ2V0KHR5cGVOYW1lKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHBhcmFtIHR5cGVOYW1lDQotCSAqIEByZXR1cm4gdHJ1ZSBpZiA8dHQ+dHlwZU5hbWU8L3R0PiBpcyBqYXZhIHByaW1pdGl2ZSB0eXBlLg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YVByaW1pdGl2ZVR5cGUoU3RyaW5nIHR5cGVOYW1lKQ0KLQl7DQotCQlyZXR1cm4gKHByaW1pdGl2ZVR5cGVzLmdldCh0eXBlTmFtZSkgIT0gbnVsbCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENoZWNrcyBpZiB0aGUgPHR0PnR5cGVOYW1lPC90dD4gcmVwcmVzZW50cyBhbiBhcnJheSB0eXBlLg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGVOYW1lDQotCSAqIEByZXR1cm4gdHJ1ZSBpZiA8dHQ+dHlwZU5hbWU8L3R0PiBpcyBhcnJheSB0eXBlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcnJheVR5cGUoU3RyaW5nIHR5cGVOYW1lKQ0KLQl7DQotCQlyZXR1cm4gdHlwZU5hbWUudHJpbSgpLmVuZHNXaXRoKEFSUkFZX01BUkspOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVja3MgaWYgPHR0PnR5cGVOYW1lPC90dD4gaXMgdm9pZC4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlTmFtZQ0KLQkgKiBAcmV0dXJuIHRydWUgaWYgPHR0PnR5cGVOYW1lPC90dD4gaXMgdm9pZC4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZvaWRUeXBlKFN0cmluZyB0eXBlTmFtZSkNCi0Jew0KLQkJcmV0dXJuIHR5cGVOYW1lLnRyaW0oKS5lcXVhbHMoVk9JRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlcyB0aGUgcmVhbCB0eXBlIG5hbWUgZnJvbSBhcnJheSB0eXBlLiBFeGFtcGxlOg0KLQkgKiANCi0JICogPHByZT4NCi0JICogICBGb3IgdHlwZSAnaW50W10nIHJldHVybnMgJ2ludCcNCi0JICogICBGb3IgdHlwZSAnU3RyaW5nW11bXScgcmV0dXJucyAnU3RyaW5nJw0KLQkgKiA8L3ByZT4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlTmFtZQ0KLQkgKiBAcmV0dXJuIHJlYWwgdHlwZSBuYW1lDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlRnJvbUFycmF5VHlwZShTdHJpbmcgdHlwZU5hbWUpDQotCXsNCi0JCVN0cmluZyBuYW1lID0gdHlwZU5hbWUudHJpbSgpLnJlcGxhY2VBbGwoIiAiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJd2hpbGUgKG5hbWUuZW5kc1dpdGgoQVJSQVlfTUFSSykpDQotCQl7DQotCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSBBUlJBWV9NQVJLLmxlbmd0aCgpKTsNCi0JCX0NCi0NCi0JCXJldHVybiBuYW1lOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvVHlwZVJlc29sdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL1R5cGVSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MjQxOGU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvVHlwZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7DQotDQotLyoqDQotICogVXRpbGl0eSBjbGFzcyBjb250YWluaW5nIGxvZ2ljIGZvciByZXNvbHZpbmcgdHlwZSBuYW1lcyBmcm9tIElUeXBlIG9iamVjdC4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFR5cGVSZXNvbHZlcg0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVCA9ICIuIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVPVEUgPSAiPyI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIFJlc29sdmVzIDx0dD50eXBlTmFtZTwvdHQ+IHVzaW5nIDx0dD50eXBlPC90dD4uIEluIGNhc2Ugd2hlbiA8dHQ+dHlwZU5hbWU8L3R0PiBjb250YWlucyBnZW5lcmljcyBkZWNsYXJhdGlvbiBhbGwgdHlwZXMgdXNlZCBpbg0KLQkgKiBkZWNsYXJhaW9uIGFyZSByZXR1cm5lZC4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlTmFtZQ0KLQkgKiBAcGFyYW0gdHlwZQ0KLQkgKiBAcmV0dXJuIGxpc3Qgb2YgcmVzb2x2ZWQgdHlwZXMNCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IHJlc29sdmVUeXBlcyhTdHJpbmcgdHlwZU5hbWUsIElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJTGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDEpOw0KLQkJU3RyaW5nIHJlYWxUeXBlTmFtZSA9IFNpZ25hdHVyZS50b1N0cmluZyh0eXBlTmFtZSk7DQotDQotCQlpZiAoaGFzR2VuZXJpY3MocmVhbFR5cGVOYW1lKSkNCi0JCXsNCi0JCQluYW1lcyA9IGdldFR5cGVzRnJvbUdlbmVyaWNzKHJlYWxUeXBlTmFtZSwgdHlwZSk7DQotCQl9IGVsc2UNCi0JCXsNCi0JCQluYW1lcy5hZGQocmVhbFR5cGVOYW1lKTsNCi0JCX0NCi0NCi0JCUxpc3Q8U3RyaW5nPiByZXNvbHZlZE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KG5hbWVzLnNpemUoKSk7DQotCQlmb3IgKFN0cmluZyBuYW1lIDogbmFtZXMpDQotCQl7DQotCQkJU3RyaW5nIHJlc29sdmVkTmFtZSA9IHJlc29sdmVUeXBlKG5hbWUsIHR5cGUpOw0KLQ0KLQkJCWlmICghcmVzb2x2ZWROYW1lLmVxdWFscyhRVU9URSkpDQotCQkJew0KLQkJCQlyZXNvbHZlZE5hbWVzLmFkZChyZXNvbHZlZE5hbWUpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiByZXNvbHZlZE5hbWVzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZXMgcmVhbCB0eXBlIGluIGNhc2UgdHlwZSBpcyBwcmVzZW50IGJ5IGdlbmVyaWNzLg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGVOYW1lDQotCSAqIEBwYXJhbSBkZWNsYXJpbmdUeXBlDQotCSAqIEByZXR1cm4gdGhlIHJlYWwgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbiBpZiA8dHQ+dHlwZU5hbWU8L3R0PiBpcyBhbiBleHByZXNzaW9uIG90aGVyd2lzZSA8dHQ+dHlwZU5hbWU8L3R0Pg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFR5cGUoU3RyaW5nIHR5cGVOYW1lLCBJVHlwZSBkZWNsYXJpbmdUeXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmICh0eXBlTmFtZS5pbmRleE9mKCc/JykgPiAtMSkNCi0JCXsNCi0JCQlpbnQgcG9zID0gdHlwZU5hbWUudHJpbSgpLmxhc3RJbmRleE9mKCcgJyk7DQotCQkJaWYgKHBvcyA+IC0xKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIFR5cGVSZXNvbHZlci5yZXNvbHZlVHlwZSh0eXBlTmFtZS5zdWJzdHJpbmcocG9zICsgMSksIGRlY2xhcmluZ1R5cGUpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiB0eXBlTmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogR2V0cyB0aGUgdHlwZXMgdXNlZCBpbiBnZW5lcmljcyBkZWNsYXJhdGlvbi4NCi0JICogQHBhcmFtIHR5cGVOYW1lDQotCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIGNvbnRhaW5pbmcgcmVzb2x2ZWQgdHlwZQ0KLQkgKiBAcmV0dXJuIGxpc3Qgb2YgdHlwZSBuYW1lcy4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXRUeXBlc0Zyb21HZW5lcmljcyhTdHJpbmcgdHlwZU5hbWUsIElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nIG5hbWUgPSB0eXBlTmFtZTsJCQkNCi0JCUxpc3Q8U3RyaW5nPiBuYW1lcz0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotCQkNCi0JCWludCBsdFBvcyA9IC0xOwkJDQotCQlpbnQgZ3RQb3MgPSAtMTsNCi0JCXdoaWxlICgobHRQb3MgPSBuYW1lLmluZGV4T2YoJzwnKSkgPiAtMSkNCi0JCXsJCQkNCi0JCQlpZiAoKGd0UG9zID0gbmFtZS5sYXN0SW5kZXhPZignPicpKSA9PSAtMSkNCi0JCQl7DQotCQkJCWd0UG9zID0gbmFtZS5sZW5ndGgoKS0yOw0KLQkJCX0NCi0JCQkNCi0JCQlTdHJpbmcgZmlyc3ROYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbHRQb3MpICsgbmFtZS5zdWJzdHJpbmcoZ3RQb3MrMSk7DQotCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGx0UG9zKzEsIGd0UG9zKTsNCi0JCQkNCi0JCQlhZGROYW1lKGZpcnN0TmFtZSwgbmFtZXMsIHR5cGUpOw0KLQkJCWlmIChuYW1lLmluZGV4T2YoJzwnKSA9PSAtMSkgDQotCQkJew0KLQkJCQlhZGROYW1lKG5hbWUsIG5hbWVzLCB0eXBlKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBuYW1lczsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBhZGROYW1lKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gbmFtZXMsIGZpbmFsIElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaW50IGNvbWFQb3MgPSBuYW1lLmluZGV4T2YoJywnKTsNCi0JCWlmKCBjb21hUG9zID4gLTEpDQotCQl7DQotCQkJbmFtZXMuYWRkKG5hbWUuc3Vic3RyaW5nKDAsIGNvbWFQb3MpKTsNCi0JCQluYW1lcy5hZGQobmFtZS5zdWJzdHJpbmcoY29tYVBvcysxKSk7DQotCQl9IA0KLQkJZWxzZSB7DQotCQkJbmFtZXMuYWRkKGdldFR5cGUobmFtZSwgdHlwZSkpOw0KLQkJfQkJDQotCX0NCi0NCi0JLyoqDQotCSAqIFJlc29sdmVzIHR5cGUuDQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZU5hbWUNCi0JICogQHBhcmFtIHR5cGUNCi0JICogQHJldHVybiB0aGUgcmVzb2x2ZWQgdHlwZSBuYW1lLg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVR5cGUoZmluYWwgU3RyaW5nIHR5cGVOYW1lLCBmaW5hbCBJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCVN0cmluZyByZWFsVHlwZU5hbWUgPSB0eXBlTmFtZTsNCi0JCWlmIChQcmltaXRpdmVUeXBlSGFuZGxlci5pc0FycmF5VHlwZSh0eXBlTmFtZSkpDQotCQl7DQotCQkJcmV0dXJuIHJlc29sdmVUeXBlKFByaW1pdGl2ZVR5cGVIYW5kbGVyLmdldFR5cGVGcm9tQXJyYXlUeXBlKHR5cGVOYW1lKSwgdHlwZSk7DQotCQl9DQotDQotCQlpZiAoUHJpbWl0aXZlVHlwZUhhbmRsZXIuaXNKYXZhUHJpbWl0aXZlVHlwZShyZWFsVHlwZU5hbWUpIHx8IFByaW1pdGl2ZVR5cGVIYW5kbGVyLmlzVm9pZFR5cGUocmVhbFR5cGVOYW1lKSkNCi0JCXsNCi0JCQlyZXR1cm4gcmVhbFR5cGVOYW1lOw0KLQkJfQ0KLQ0KLQkJaWYgKHJlYWxUeXBlTmFtZS5pbmRleE9mKERPVCkgPiAtMSkNCi0JCXsNCi0JCQlyZXR1cm4gcmVhbFR5cGVOYW1lOw0KLQkJfQ0KLQ0KLQkJU3RyaW5nW11bXSBzdCA9IHR5cGUucmVzb2x2ZVR5cGUocmVhbFR5cGVOYW1lKTsNCi0JCWlmIChzdCAhPSBudWxsKQ0KLQkJew0KLQkJCWlmIChzdFswXVswXS5sZW5ndGgoKSA9PSAwKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHN0WzBdWzFdOw0KLQkJCX0NCi0NCi0JCQlyZXR1cm4gc3RbMF1bMF0gKyBET1QgKyBzdFswXVsxXTsNCi0JCX0NCi0NCi0JCWlmIChyZWFsVHlwZU5hbWUuc3RhcnRzV2l0aChuZXcgU3RyaW5nKG5ldyBjaGFyW10geyBTaWduYXR1cmUuQ19VTlJFU09MVkVEIH0pKSkNCi0JCXsNCi0JCQlyZXR1cm4gcmVzb2x2ZVR5cGUocmVhbFR5cGVOYW1lLnN1YnN0cmluZygxLCByZWFsVHlwZU5hbWUubGVuZ3RoKCkpLCB0eXBlKTsNCi0JCX0NCi0NCi0JCXJldHVybiByZWFsVHlwZU5hbWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIENoZWNrcyB3aGV0aGVyIDxjb2RlPnR5cGVOYW1lPC9jb2RlPiB1c2VzIGdlbmVyaWNzIGRlY2xhcmF0aW9uLiBFeGFtcGxlOiBmb3IgJ2phdmEudXRpbC5MaXN0PFN0cm5nPicgdGhlIG1ldGhvZCB3aWxsIHJldHVybiB0cnVlLg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGVOYW1lDQotCSAqIEByZXR1cm4gdHJ1ZSBpcyA8dHQ+dHlwZU5hbWU8L3R0PiBjb250YWlucyBnZW5lcmljcyBkZWNsYXJhdGlvbi4NCi0JICovDQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzR2VuZXJpY3MoU3RyaW5nIHR5cGVOYW1lKQ0KLQl7DQotCQlyZXR1cm4gKHR5cGVOYW1lLmluZGV4T2YoJzwnKSA+IC0xKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL1dzRG9tU3RhcnR1cFBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL1dzRG9tU3RhcnR1cFBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJhMjEwMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9Xc0RvbVN0YXJ0dXBQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01SdW50aW1lTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXA7DQotDQotLyoqDQotICogU3RhcnR1cCBwYXJ0aWNpcGFudCByZWdpc3RlcmVkIG9uIElERSBzdGFydHVwIGV4dGVuc2lvbiBwb2ludA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgV3NEb21TdGFydHVwUGFydGljaXBhbnQgaW1wbGVtZW50cyBJU3RhcnR1cCANCi17DQotCQ0KLQkvKioNCi0JICogQ2FsbGVkIGJ5IHRoZSBFY2xpcHNlIG9uIHdvcmtiZW5jaCBzdGFydHVwLg0KLQkgKiBTdGFydHMgbG9hZCBmb3IgcmVnaXN0ZXJlZCB3ZWIgc2VydmljZSBydW50aW1lcyANCi0JICovDQotICAgIHB1YmxpYyB2b2lkIGVhcmx5U3RhcnR1cCgpDQotICAgIHsNCi0JCUpvYiBqb2IgPSBuZXcgSm9iKEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLldzRG9tU3RhcnR1cFBhcnRpY2lwYW50X1N0YXJ0dXBfSm9iX01lc3NhZ2UpDQotCQl7DQotCQkJQE92ZXJyaWRlDQotCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0JCQl7DQotCQkgICAgCVdzRE9NUnVudGltZU1hbmFnZXIuaW5zdGFuY2UoKS5jcmVhdGVET01SdW50aW1lcyhtb25pdG9yKTsNCi0JCSAgICAJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCQkJfQ0KLQkJfTsNCi0JCQ0KLQkJam9iLnNldFVzZXIoZmFsc2UpOw0KLQkJam9iLnNldFByaW9yaXR5KEpvYi5MT05HKTsNCi0JCWpvYi5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOw0KLQkJam9iLnNjaGVkdWxlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YTg3NjEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsNCi0NCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLg0KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgRG9tRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsNCi0JLyoqDQotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlEb21GYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbUZhY3RvcnlJbXBsLmluaXQoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SURPTTwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SURPTTwvZW0+Jy4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JSURPTSBjcmVhdGVJRE9NKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPicuDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUlKYXZhV2ViU2VydmljZUVsZW1lbnQgY3JlYXRlSUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+Jy4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBjcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgTWV0aG9kPC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JV2ViIE1ldGhvZDwvZW0+Jy4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JSVdlYk1ldGhvZCBjcmVhdGVJV2ViTWV0aG9kKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgUGFyYW08L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgUGFyYW08L2VtPicuDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUlXZWJQYXJhbSBjcmVhdGVJV2ViUGFyYW0oKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBTZXJ2aWNlPC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JV2ViIFNlcnZpY2U8L2VtPicuDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUlXZWJTZXJ2aWNlIGNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+Jy4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JSVdlYlNlcnZpY2VQcm9qZWN0IGNyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JV2ViIFR5cGU8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgVHlwZTwvZW0+Jy4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JSVdlYlR5cGUgY3JlYXRlSVdlYlR5cGUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRG9tUGFja2FnZSBnZXREb21QYWNrYWdlKCk7DQotDQotfSAvL0RvbUZhY3RvcnkNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ2YWFiMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7DQotDQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4NCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50DQotICogPHVsPg0KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4NCi0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPg0KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPg0KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+DQotICogPC91bD4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeQ0KLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIERvbVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7DQotCS8qKg0KLQkgKiBUaGUgcGFja2FnZSBuYW1lLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JU3RyaW5nIGVOQU1FID0gImRvbSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9kb20uZWNvcmUiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlEb21QYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsLmluaXQoKTsNCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSURPTUltcGwgPGVtPklET008L2VtPn0nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JRE9NSW1wbA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElET00oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnQgSURPTSA9IDA7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2UgUHJvamVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTID0gMDsNCi0NCi0JLyoqDQotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JRE9NPC9lbT4nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElET01fRkVBVFVSRV9DT1VOVCA9IDE7DQotDQotCS8qKg0KLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIDxlbT5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9lbT59JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JaW50IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlQgPSAxOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04gPSAwOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FID0gMTsNCi0NCi0JLyoqDQotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9lbT4nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IDI7DQotDQotCS8qKg0KLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsIDxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFID0gMjsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5UQVRJT04gPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTjsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19OQU1FID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRTsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsaWNpdDwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTElDSVQgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGluZyBXZWIgU2VydmljZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUyA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2ViIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFMgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0UgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsNCi0NCi0JLyoqDQotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0ZFQVRVUkVfQ09VTlQgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3Ow0KLQ0KLQkvKioNCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViTWV0aG9kSW1wbCA8ZW0+SVdlYiBNZXRob2Q8L2VtPn0nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViTWV0aG9kSW1wbA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJNZXRob2QoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnQgSVdFQl9NRVRIT0QgPSAzOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9NRVRIT0RfX0lNUExFTUVOVEFUSU9OID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT047DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfTUVUSE9EX19OQU1FID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRTsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJhbWV0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX01FVEhPRF9fUEFSQU1FVEVSUyA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX01FVEhPRF9fRVhDTFVERUQgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRSA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsNCi0NCi0JLyoqDQotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JV2ViIE1ldGhvZDwvZW0+JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX01FVEhPRF9GRUFUVVJFX0NPVU5UID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsNCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlBhcmFtSW1wbCA8ZW0+SVdlYiBQYXJhbTwvZW0+fScgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJQYXJhbUltcGwNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRJV2ViUGFyYW0oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnQgSVdFQl9QQVJBTSA9IDQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNX19JTVBMRU1FTlRBVElPTiA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNX19OQU1FID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRTsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9QQVJBTV9fS0lORCA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9QQVJBTV9fVFlQRV9OQU1FID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNX19QQVJUX05BTUUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWFkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNX19IRUFERVIgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0Ow0KLQ0KLQkvKioNCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklXZWIgUGFyYW08L2VtPicgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9QQVJBTV9GRUFUVVJFX0NPVU5UID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsNCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VJbXBsIDxlbT5JV2ViIFNlcnZpY2U8L2VtPn0nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZUltcGwNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRJV2ViU2VydmljZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0UgPSA1Ow0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9TRVJWSUNFX19JTVBMRU1FTlRBVElPTiA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfX05BTUUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0UgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfU0VSVklDRV9fUE9SVF9OQU1FID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsNCi0NCi0JLyoqDQotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JV2ViIFNlcnZpY2U8L2VtPicgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9TRVJWSUNFX0ZFQVRVUkVfQ09VTlQgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0Ow0KLQ0KLQkvKioNCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZVByb2plY3RJbXBsIDxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+fScgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlUHJvamVjdEltcGwNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRJV2ViU2VydmljZVByb2plY3QoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnQgSVdFQl9TRVJWSUNFX1BST0pFQ1QgPSA2Ow0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlYiBTZXJ2aWNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1dFQl9TRVJWSUNFUyA9IDA7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTID0gMTsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUUgPSAyOw0KLQ0KLQkvKioNCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT4nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfU0VSVklDRV9QUk9KRUNUX0ZFQVRVUkVfQ09VTlQgPSAzOw0KLQ0KLQkvKioNCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViVHlwZUltcGwgPGVtPklXZWIgVHlwZTwvZW0+fScgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJUeXBlSW1wbA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJUeXBlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JaW50IElXRUJfVFlQRSA9IDc7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1RZUEVfX0lNUExFTUVOVEFUSU9OID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT047DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfVFlQRV9fTkFNRSA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUU7DQotDQotCS8qKg0KLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SVdlYiBUeXBlPC9lbT4nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfVFlQRV9GRUFUVVJFX0NPVU5UID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsNCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQgPGVtPldlYiBQYXJhbSBLaW5kPC9lbT59JyBlbnVtLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldFdlYlBhcmFtS2luZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBXRUJfUEFSQU1fS0lORCA9IDg7DQotDQotDQotCS8qKg0KLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZSA8ZW0+U09BUCBCaW5kaW5nIFN0eWxlPC9lbT59JyBlbnVtLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRTT0FQQmluZGluZ1N0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JaW50IFNPQVBfQklORElOR19TVFlMRSA9IDk7DQotDQotCS8qKg0KLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2UgPGVtPlNPQVAgQmluZGluZyBVc2U8L2VtPn0nIGVudW0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2UNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRTT0FQQmluZGluZ1VzZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBTT0FQX0JJTkRJTkdfVVNFID0gMTA7DQotDQotCS8qKg0KLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA8ZW0+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+fScgZW51bS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBTT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFID0gMTE7DQotDQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00gPGVtPklET008L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SURPTTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUNsYXNzIGdldElET00oKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00jZ2V0V2ViU2VydmljZVByb2plY3RzIDxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+V2ViIFNlcnZpY2UgUHJvamVjdHM8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NI2dldFdlYlNlcnZpY2VQcm9qZWN0cygpDQotCSAqIEBzZWUgI2dldElET00oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFUmVmZXJlbmNlIGdldElET01fV2ViU2VydmljZVByb2plY3RzKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQgPGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUNsYXNzIGdldElKYXZhV2ViU2VydmljZUVsZW1lbnQoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50I2dldEltcGxlbWVudGF0aW9uIDxlbT5JbXBsZW1lbnRhdGlvbjwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkltcGxlbWVudGF0aW9uPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudCNnZXRJbXBsZW1lbnRhdGlvbigpDQotCSAqIEBzZWUgI2dldElKYXZhV2ViU2VydmljZUVsZW1lbnQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElKYXZhV2ViU2VydmljZUVsZW1lbnRfSW1wbGVtZW50YXRpb24oKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudCNnZXROYW1lKCkNCi0JICogQHNlZSAjZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudF9OYW1lKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVDbGFzcyBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNpc0ltcGxpY2l0IDxlbT5JbXBsaWNpdDwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkltcGxpY2l0PC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNpc0ltcGxpY2l0KCkNCi0JICogQHNlZSAjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9JbXBsaWNpdCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyA8ZW0+SW1wbGVtZW50aW5nIFdlYiBTZXJ2aWNlczwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW1wbGVtZW50aW5nIFdlYiBTZXJ2aWNlczwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKQ0KLQkgKiBAc2VlICNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRVJlZmVyZW5jZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX0ltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2dldFdlYk1ldGhvZHMgPGVtPldlYiBNZXRob2RzPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5XZWIgTWV0aG9kczwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0V2ViTWV0aG9kcygpDQotCSAqIEBzZWUgI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFUmVmZXJlbmNlIGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfV2ViTWV0aG9kcygpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQHNlZSAjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9UYXJnZXROYW1lc3BhY2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2dldFNvYXBCaW5kaW5nU3R5bGUgPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0U29hcEJpbmRpbmdTdHlsZSgpDQotCSAqIEBzZWUgI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdTdHlsZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0U29hcEJpbmRpbmdVc2UgPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRTb2FwQmluZGluZ1VzZSgpDQotCSAqIEBzZWUgI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdVc2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQHNlZSAjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QgPGVtPklXZWIgTWV0aG9kPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklXZWIgTWV0aG9kPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQ2xhc3MgZ2V0SVdlYk1ldGhvZCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNnZXRQYXJhbWV0ZXJzIDxlbT5QYXJhbWV0ZXJzPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QYXJhbWV0ZXJzPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNnZXRQYXJhbWV0ZXJzKCkNCi0JICogQHNlZSAjZ2V0SVdlYk1ldGhvZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVSZWZlcmVuY2UgZ2V0SVdlYk1ldGhvZF9QYXJhbWV0ZXJzKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNpc0V4Y2x1ZGVkIDxlbT5FeGNsdWRlZDwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4Y2x1ZGVkPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNpc0V4Y2x1ZGVkKCkNCi0JICogQHNlZSAjZ2V0SVdlYk1ldGhvZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVdlYk1ldGhvZF9FeGNsdWRlZCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QjZ2V0U29hcEJpbmRpbmdTdHlsZSA8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNnZXRTb2FwQmluZGluZ1N0eWxlKCkNCi0JICogQHNlZSAjZ2V0SVdlYk1ldGhvZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1N0eWxlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNnZXRTb2FwQmluZGluZ1VzZSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFNvYXBCaW5kaW5nVXNlKCkNCi0JICogQHNlZSAjZ2V0SVdlYk1ldGhvZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1VzZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKQ0KLQkgKiBAc2VlICNnZXRJV2ViTWV0aG9kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtIDxlbT5JV2ViIFBhcmFtPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklXZWIgUGFyYW08L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUNsYXNzIGdldElXZWJQYXJhbSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNnZXRLaW5kIDxlbT5LaW5kPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+S2luZDwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNnZXRLaW5kKCkNCi0JICogQHNlZSAjZ2V0SVdlYlBhcmFtKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViUGFyYW1fS2luZCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNnZXRUeXBlTmFtZSA8ZW0+VHlwZSBOYW1lPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZSBOYW1lPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2dldFR5cGVOYW1lKCkNCi0JICogQHNlZSAjZ2V0SVdlYlBhcmFtKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViUGFyYW1fVHlwZU5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jZ2V0UGFydE5hbWUgPGVtPlBhcnQgTmFtZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhcnQgTmFtZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNnZXRQYXJ0TmFtZSgpDQotCSAqIEBzZWUgI2dldElXZWJQYXJhbSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVdlYlBhcmFtX1BhcnROYW1lKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jZ2V0VGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQHNlZSAjZ2V0SVdlYlBhcmFtKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViUGFyYW1fVGFyZ2V0TmFtZXNwYWNlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2lzSGVhZGVyIDxlbT5IZWFkZXI8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IZWFkZXI8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jaXNIZWFkZXIoKQ0KLQkgKiBAc2VlICNnZXRJV2ViUGFyYW0oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJQYXJhbV9IZWFkZXIoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UgPGVtPklXZWIgU2VydmljZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JV2ViIFNlcnZpY2U8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQ2xhc3MgZ2V0SVdlYlNlcnZpY2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSNnZXRTZXJ2aWNlRW5kcG9pbnQgPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UjZ2V0U2VydmljZUVuZHBvaW50KCkNCi0JICogQHNlZSAjZ2V0SVdlYlNlcnZpY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFUmVmZXJlbmNlIGdldElXZWJTZXJ2aWNlX1NlcnZpY2VFbmRwb2ludCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAc2VlICNnZXRJV2ViU2VydmljZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVdlYlNlcnZpY2VfVGFyZ2V0TmFtZXNwYWNlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UjZ2V0UG9ydE5hbWUgPGVtPlBvcnQgTmFtZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvcnQgTmFtZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlI2dldFBvcnROYW1lKCkNCi0JICogQHNlZSAjZ2V0SVdlYlNlcnZpY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJTZXJ2aWNlX1BvcnROYW1lKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UjZ2V0V3NkbExvY2F0aW9uIDxlbT5Xc2RsIExvY2F0aW9uPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3NkbCBMb2NhdGlvbjwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlI2dldFdzZGxMb2NhdGlvbigpDQotCSAqIEBzZWUgI2dldElXZWJTZXJ2aWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViU2VydmljZV9Xc2RsTG9jYXRpb24oKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0IDxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQ2xhc3MgZ2V0SVdlYlNlcnZpY2VQcm9qZWN0KCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3QjZ2V0V2ViU2VydmljZXMgPGVtPldlYiBTZXJ2aWNlczwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+V2ViIFNlcnZpY2VzPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0I2dldFdlYlNlcnZpY2VzKCkNCi0JICogQHNlZSAjZ2V0SVdlYlNlcnZpY2VQcm9qZWN0KCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRVJlZmVyZW5jZSBnZXRJV2ViU2VydmljZVByb2plY3RfV2ViU2VydmljZXMoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXM8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlczwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkNCi0JICogQHNlZSAjZ2V0SVdlYlNlcnZpY2VQcm9qZWN0KCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRVJlZmVyZW5jZSBnZXRJV2ViU2VydmljZVByb2plY3RfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCNnZXROYW1lKCkNCi0JICogQHNlZSAjZ2V0SVdlYlNlcnZpY2VQcm9qZWN0KCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViU2VydmljZVByb2plY3RfTmFtZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViVHlwZSA8ZW0+SVdlYiBUeXBlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklXZWIgVHlwZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVDbGFzcyBnZXRJV2ViVHlwZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZCA8ZW0+V2ViIFBhcmFtIEtpbmQ8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5XZWIgUGFyYW0gS2luZDwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFRW51bSBnZXRXZWJQYXJhbUtpbmQoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlIDxlbT5TT0FQIEJpbmRpbmcgU3R5bGU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5TT0FQIEJpbmRpbmcgU3R5bGU8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVFbnVtIGdldFNPQVBCaW5kaW5nU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZSA8ZW0+U09BUCBCaW5kaW5nIFVzZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlNPQVAgQmluZGluZyBVc2U8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFRW51bSBnZXRTT0FQQmluZGluZ1VzZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPGVtPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFRW51bSBnZXRTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlEb21GYWN0b3J5IGdldERvbUZhY3RvcnkoKTsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQNCi0JICogPHVsPg0KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+DQotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+DQotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPg0KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPg0KLQkgKiA8L3VsPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JaW50ZXJmYWNlIExpdGVyYWxzIHsNCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklET01JbXBsIDxlbT5JRE9NPC9lbT59JyBjbGFzcy4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSURPTUltcGwNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SURPTSgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVDbGFzcyBJRE9NID0gZUlOU1RBTkNFLmdldElET00oKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBTZXJ2aWNlIFByb2plY3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFUmVmZXJlbmNlIElET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTID0gZUlOU1RBTkNFLmdldElET01fV2ViU2VydmljZVByb2plY3RzKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbCA8ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+fScgY2xhc3MuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElKYXZhV2ViU2VydmljZUVsZW1lbnQoKQ0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQ2xhc3MgSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04gPSBlSU5TVEFOQ0UuZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudF9JbXBsZW1lbnRhdGlvbigpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSA9IGVJTlNUQU5DRS5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50X05hbWUoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsIDxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nIGNsYXNzLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbA0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkNCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUNsYXNzIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBsaWNpdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCA9IGVJTlNUQU5DRS5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX0ltcGxpY2l0KCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRpbmcgV2ViIFNlcnZpY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFUmVmZXJlbmNlIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUyA9IGVJTlNUQU5DRS5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX0ltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWIgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRVJlZmVyZW5jZSBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1dFQl9NRVRIT0RTID0gZUlOU1RBTkNFLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfV2ViTWV0aG9kcygpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFID0gZUlOU1RBTkNFLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfVGFyZ2V0TmFtZXNwYWNlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFID0gZUlOU1RBTkNFLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdTdHlsZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFVzZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFID0gZUlOU1RBTkNFLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdVc2UoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSA9IGVJTlNUQU5DRS5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJNZXRob2RJbXBsIDxlbT5JV2ViIE1ldGhvZDwvZW0+fScgY2xhc3MuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJNZXRob2RJbXBsDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJNZXRob2QoKQ0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQ2xhc3MgSVdFQl9NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0SVdlYk1ldGhvZCgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFyYW1ldGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRVJlZmVyZW5jZSBJV0VCX01FVEhPRF9fUEFSQU1FVEVSUyA9IGVJTlNUQU5DRS5nZXRJV2ViTWV0aG9kX1BhcmFtZXRlcnMoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX01FVEhPRF9fRVhDTFVERUQgPSBlSU5TVEFOQ0UuZ2V0SVdlYk1ldGhvZF9FeGNsdWRlZCgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1NUWUxFID0gZUlOU1RBTkNFLmdldElXZWJNZXRob2RfU29hcEJpbmRpbmdTdHlsZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFVzZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0UgPSBlSU5TVEFOQ0UuZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1VzZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUgPSBlSU5TVEFOQ0UuZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViUGFyYW1JbXBsIDxlbT5JV2ViIFBhcmFtPC9lbT59JyBjbGFzcy4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlBhcmFtSW1wbA0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRJV2ViUGFyYW0oKQ0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQ2xhc3MgSVdFQl9QQVJBTSA9IGVJTlNUQU5DRS5nZXRJV2ViUGFyYW0oKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElXRUJfUEFSQU1fX0tJTkQgPSBlSU5TVEFOQ0UuZ2V0SVdlYlBhcmFtX0tpbmQoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVdFQl9QQVJBTV9fVFlQRV9OQU1FID0gZUlOU1RBTkNFLmdldElXZWJQYXJhbV9UeXBlTmFtZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX1BBUkFNX19QQVJUX05BTUUgPSBlSU5TVEFOQ0UuZ2V0SVdlYlBhcmFtX1BhcnROYW1lKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFID0gZUlOU1RBTkNFLmdldElXZWJQYXJhbV9UYXJnZXROYW1lc3BhY2UoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhlYWRlcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVdFQl9QQVJBTV9fSEVBREVSID0gZUlOU1RBTkNFLmdldElXZWJQYXJhbV9IZWFkZXIoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlSW1wbCA8ZW0+SVdlYiBTZXJ2aWNlPC9lbT59JyBjbGFzcy4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VJbXBsDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJTZXJ2aWNlKCkNCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUNsYXNzIElXRUJfU0VSVklDRSA9IGVJTlNUQU5DRS5nZXRJV2ViU2VydmljZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVSZWZlcmVuY2UgSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UID0gZUlOU1RBTkNFLmdldElXZWJTZXJ2aWNlX1NlcnZpY2VFbmRwb2ludCgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFID0gZUlOU1RBTkNFLmdldElXZWJTZXJ2aWNlX1RhcmdldE5hbWVzcGFjZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRSA9IGVJTlNUQU5DRS5nZXRJV2ViU2VydmljZV9Qb3J0TmFtZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OID0gZUlOU1RBTkNFLmdldElXZWJTZXJ2aWNlX1dzZGxMb2NhdGlvbigpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VQcm9qZWN0SW1wbCA8ZW0+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2VtPn0nIGNsYXNzLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZVByb2plY3RJbXBsDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJTZXJ2aWNlUHJvamVjdCgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVDbGFzcyBJV0VCX1NFUlZJQ0VfUFJPSkVDVCA9IGVJTlNUQU5DRS5nZXRJV2ViU2VydmljZVByb2plY3QoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBTZXJ2aWNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRVJlZmVyZW5jZSBJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTID0gZUlOU1RBTkNFLmdldElXZWJTZXJ2aWNlUHJvamVjdF9XZWJTZXJ2aWNlcygpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFUmVmZXJlbmNlIElXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVMgPSBlSU5TVEFOQ0UuZ2V0SVdlYlNlcnZpY2VQcm9qZWN0X1NlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FID0gZUlOU1RBTkNFLmdldElXZWJTZXJ2aWNlUHJvamVjdF9OYW1lKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViVHlwZUltcGwgPGVtPklXZWIgVHlwZTwvZW0+fScgY2xhc3MuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJUeXBlSW1wbA0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRJV2ViVHlwZSgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVDbGFzcyBJV0VCX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0SVdlYlR5cGUoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kIDxlbT5XZWIgUGFyYW0gS2luZDwvZW0+fScgZW51bS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0V2ViUGFyYW1LaW5kKCkNCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUVudW0gV0VCX1BBUkFNX0tJTkQgPSBlSU5TVEFOQ0UuZ2V0V2ViUGFyYW1LaW5kKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUgPGVtPlNPQVAgQmluZGluZyBTdHlsZTwvZW0+fScgZW51bS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldFNPQVBCaW5kaW5nU3R5bGUoKQ0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFRW51bSBTT0FQX0JJTkRJTkdfU1RZTEUgPSBlSU5TVEFOQ0UuZ2V0U09BUEJpbmRpbmdTdHlsZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZSA8ZW0+U09BUCBCaW5kaW5nIFVzZTwvZW0+fScgZW51bS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZQ0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRTT0FQQmluZGluZ1VzZSgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVFbnVtIFNPQVBfQklORElOR19VU0UgPSBlSU5TVEFOQ0UuZ2V0U09BUEJpbmRpbmdVc2UoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA8ZW0+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+fScgZW51bS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKQ0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFRW51bSBTT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFID0gZUlOU1RBTkNFLmdldFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0NCi0JfQ0KLQ0KLX0gLy9Eb21QYWNrYWdlDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOTRhODhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lET00uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklET008L2I+PC9lbT4nLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqDQotICogPHA+DQotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOg0KLSAqIDx1bD4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NI2dldFdlYlNlcnZpY2VQcm9qZWN0cyA8ZW0+V2ViIFNlcnZpY2UgUHJvamVjdHM8L2VtPn08L2xpPg0KLSAqIDwvdWw+DQotICogPC9wPg0KLSAqDQotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SURPTSgpDQotICogQG1vZGVsDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSURPTSBleHRlbmRzIEVPYmplY3Qgew0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2UgUHJvamVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3R9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V2ViIFNlcnZpY2UgUHJvamVjdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2ViIFNlcnZpY2UgUHJvamVjdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlI2dldElET01fV2ViU2VydmljZVByb2plY3RzKCkNCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiBzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eT0idHJ1ZSINCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUxpc3Q8SVdlYlNlcnZpY2VQcm9qZWN0PiBnZXRXZWJTZXJ2aWNlUHJvamVjdHMoKTsNCi0NCi19IC8vIElET00NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxMjAwZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi0NCi0vKioNCi0gKiBAbW9kZWwNCi0gKiAgKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBJSmF2YVdlYlNlcnZpY2VFbGVtZW50IGV4dGVuZHMgRU9iamVjdA0KLXsNCi0JLyoqDQotCSAqIEBtb2RlbCBjaGFuZ2VhYmxlPSJ0cnVlIiBzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eT0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiDQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wbGVtZW50YXRpb24oKTsNCi0NCi0JLyoqDQotCSAqIEBtb2RlbCBjaGFuZ2VhYmxlPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgI2dldE5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNTg5ZDExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCi0NCi0NCi0vKioNCi0gKiBAbW9kZWwNCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGV4dGVuZHMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudA0KLXsNCi0JLyoqDQotCSAqIEBtb2RlbCBjaGFuZ2VhYmxlPSJ0cnVlIiBzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eT0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiDQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzSW1wbGljaXQoKTsNCi0NCi0JLyoqDQotCSAqIEBtb2RlbCBjaGFuZ2VhYmxlPSJ0cnVlIiBzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eT0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIGNvbnRhaW5tZW50PSJmYWxzZSIgbWFueT0idHJ1ZSIgdHlwZT0iSVdlYlNlcnZpY2UiIG9wcG9zaXRlPSJzZXJ2aWNlRW5kcG9pbnQiDQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBFTGlzdDxJV2ViU2VydmljZT4gZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKTsNCi0JDQotCS8qKg0KLQkgKiBAbW9kZWwgY2hhbmdlYWJsZT0idHJ1ZSIgc3VwcHJlc3NlZFNldFZpc2liaWxpdHk9InRydWUiIHJlcXVpcmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgbWFueT0idHJ1ZSIgdHlwZT0iSVdlYk1ldGhvZCINCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIEVMaXN0PElXZWJNZXRob2Q+IGdldFdlYk1ldGhvZHMoKTsNCi0JDQotCS8qKg0KLQkgKiBAbW9kZWwgY2hhbmdlYWJsZT0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB2YWx1ZSk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkRPQ1VNRU5UIjwvY29kZT4uDQotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZX0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlDQotCSAqIEBzZWUgI3NldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZSkNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1N0eWxlKCkNCi0JICogQG1vZGVsIGRlZmF1bHQ9IkRPQ1VNRU5UIiByZXF1aXJlZD0idHJ1ZSINCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JU09BUEJpbmRpbmdTdHlsZSBnZXRTb2FwQmluZGluZ1N0eWxlKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0U29hcEJpbmRpbmdTdHlsZSA8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZQ0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1N0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0Jdm9pZCBzZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUgdmFsdWUpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFVzZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iTElURVJBTCI8L2NvZGU+Lg0KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2UNCi0JICogQHNlZSAjc2V0U29hcEJpbmRpbmdVc2UoU09BUEJpbmRpbmdVc2UpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdVc2UoKQ0KLQkgKiBAbW9kZWwgZGVmYXVsdD0iTElURVJBTCIgcmVxdWlyZWQ9InRydWUiDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCVNPQVBCaW5kaW5nVXNlIGdldFNvYXBCaW5kaW5nVXNlKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0U29hcEJpbmRpbmdVc2UgPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2UNCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdVc2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldFNvYXBCaW5kaW5nVXNlKFNPQVBCaW5kaW5nVXNlIHZhbHVlKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IldSQVBQRUQiPC9jb2RlPi4NCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZQ0KLQkgKiBAc2VlICNzZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotCSAqIEBtb2RlbCBkZWZhdWx0PSJXUkFQUEVEIiByZXF1aXJlZD0idHJ1ZSINCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlDQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSB2YWx1ZSk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV1NET01SdW50aW1lTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTM5Y2I5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi0NCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElXU0RPTVJ1bnRpbWVNYW5hZ2VyDQotew0KLQkvKioNCi0JICogSW5zdGFudGlhdGVzIHRoZSBET00gUnVudGltZXMgaWYgbm90IGFscmVhZHkuDQotCSAqIEBwYXJhbSBwcm9ncmVzcyBtb25pdG9yIHRvIHRyYWNrIHByb2dyZXNzIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgY3JlYXRlRE9NUnVudGltZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsNCi0JDQotCS8qKg0KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBET00gcnVudGltZSBpbnN0YW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBydW50aW1lIGlkDQotCSAqIGFuZCBpbnN0YW50aWF0ZSBzdWNoIERPTSBydW50aW1lIGluc3RhbmNlIGlmIG5vbiBleGlzdGVudCBhdCB0aGUgDQotCSAqIG1vbWVudCBvZiBpbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kLg0KLQkgKiANCi0JICogQHBhcmFtIHJ1bnRpbWVJZCAtIHN0cmluZyBpZGVudGlmaWVyIG9mIHRoZSBydW50aW1lIA0KLQkgKiBAcmV0dXJuIHRoZSBET00gcnVudGltZSBpbnN0YW5jZS4gTnVsbCBpZiBydW50aW1lIHdpdGggc3VjaCBpZCBpcyBub3QgcmVnaXN0ZXJlZA0KLQkgKi8NCi0JcHVibGljICBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldERPTVJ1bnRpbWUoU3RyaW5nIHJ1bnRpbWVJZCk7DQotCQ0KLQkvKioNCi0JICogDQotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGFsbCBET00gUnVudGltZXMgY3VycmVudGx5IGluc3RhbnRpYXRlZA0KLQkgKi8NCi0JcHVibGljIENvbGxlY3Rpb248SVdzRE9NUnVudGltZUV4dGVuc2lvbj4gZ2V0RE9NUnVudGltZXMoKTsNCi0NCi0JLyoqDQotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCByZWxvYWQgYWxsIGluc3RhbmNlcyBvZiBET00gUnVudGltZXMuDQotCSAqDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZWxvYWRET01SdW50aW1lcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3MGQzODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLQ0KLQ0KLS8qKg0KLSAqIEBtb2RlbA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICovDQotcHVibGljIGludGVyZmFjZSBJV2ViTWV0aG9kIGV4dGVuZHMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudA0KLXsNCi0JLyoqDQotCSAqIEBtb2RlbCB0eXBlPSJJV2ViUGFyYW0iIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIiBtYW55PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiDQotCSAqIEByZXR1cm4NCi0JICovDQotCUVMaXN0PElXZWJQYXJhbT4gZ2V0UGFyYW1ldGVycygpOw0KLQkNCi0JLyoqDQotCSAqIEBtb2RlbCB0eXBlPSJib29sZWFuIiBtYW55PSJmYWxzZSIgY2hhbmdlYWJsZT0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiDQotCSAqLw0KLQlib29sZWFuIGlzRXhjbHVkZWQoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNpc0V4Y2x1ZGVkIDxlbT5FeGNsdWRlZDwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZWQ8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNpc0V4Y2x1ZGVkKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0Jdm9pZCBzZXRFeGNsdWRlZChib29sZWFuIHZhbHVlKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iRE9DVU1FTlQiPC9jb2RlPi4NCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUNCi0JICogQHNlZSAjc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAbW9kZWwgZGVmYXVsdD0iRE9DVU1FTlQiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlTT0FQQmluZGluZ1N0eWxlIGdldFNvYXBCaW5kaW5nU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNnZXRTb2FwQmluZGluZ1N0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlDQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZSB2YWx1ZSk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJMSVRFUkFMIjwvY29kZT4uDQotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2V9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZQ0KLQkgKiBAc2VlICNzZXRTb2FwQmluZGluZ1VzZShTT0FQQmluZGluZ1VzZSkNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1VzZSgpDQotCSAqIEBtb2RlbCBkZWZhdWx0PSJMSVRFUkFMIiByZXF1aXJlZD0idHJ1ZSINCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JU09BUEJpbmRpbmdVc2UgZ2V0U29hcEJpbmRpbmdVc2UoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNnZXRTb2FwQmluZGluZ1VzZSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZQ0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1VzZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0U29hcEJpbmRpbmdVc2UoU09BUEJpbmRpbmdVc2UgdmFsdWUpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iV1JBUFBFRCI8L2NvZGU+Lg0KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGV9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlDQotCSAqIEBzZWUgI3NldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSkNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQG1vZGVsIGRlZmF1bHQ9IldSQVBQRUQiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIGdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUNCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIHZhbHVlKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjc2OTZlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotDQotLyoqDQotICogDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKg0KLSAqIEBtb2RlbA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYlBhcmFtIGV4dGVuZHMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudA0KLXsNCi0JLyoqDQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgbWFueT0iZmFsc2UiIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIg0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlTdHJpbmcgZ2V0VHlwZU5hbWUoKTsNCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJ0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSAjc2V0UGFydE5hbWUoU3RyaW5nKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRJV2ViUGFyYW1fUGFydE5hbWUoKQ0KLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCVN0cmluZyBnZXRQYXJ0TmFtZSgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jZ2V0UGFydE5hbWUgPGVtPlBhcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSAjZ2V0UGFydE5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldFBhcnROYW1lKFN0cmluZyB2YWx1ZSk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSAjc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SVdlYlBhcmFtX1RhcmdldE5hbWVzcGFjZSgpDQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSINCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0Jdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHZhbHVlKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhlYWRlcjwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhlYWRlcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGVhZGVyPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSAjc2V0SGVhZGVyKGJvb2xlYW4pDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlI2dldElXZWJQYXJhbV9IZWFkZXIoKQ0KLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlib29sZWFuIGlzSGVhZGVyKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNpc0hlYWRlciA8ZW0+SGVhZGVyPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IZWFkZXI8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNpc0hlYWRlcigpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0SGVhZGVyKGJvb2xlYW4gdmFsdWUpOw0KLQ0KLQkvKioNCi0JICogQG1vZGVsIHR5cGU9IldlYlBhcmFtS2luZCIgcmVxdWlyZWQ9InRydWUiIG1hbnk9ImZhbHNlIg0KLQkgKi8NCi0JV2ViUGFyYW1LaW5kIGdldEtpbmQoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2dldEtpbmQgPGVtPktpbmQ8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kDQotCSAqIEBzZWUgI2dldEtpbmQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldEtpbmQoV2ViUGFyYW1LaW5kIHZhbHVlKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYwMTFmZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi0NCi0vKioNCi0gKiBAbW9kZWwNCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBJV2ViU2VydmljZSBleHRlbmRzIElKYXZhV2ViU2VydmljZUVsZW1lbnQgDQotew0KLQkvKioNCi0JICogQG1vZGVsIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIiBvcHBvc2l0ZT0iaW1wbGVtZW50aW5nV2ViU2VydmljZXMiIHR5cGU9IklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiDQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGdldFNlcnZpY2VFbmRwb2ludCgpOw0KLQkNCi0JLyoqDQotCSAqIEBtb2RlbCBjaGFuZ2VhYmxlPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotCQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSNnZXRUYXJnZXROYW1lc3BhY2UgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgdmFsdWUpOw0KLQ0KLQkvKioNCi0JICogQG1vZGVsIGNoYW5nZWFibGU9InRydWUiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQb3J0TmFtZSgpOw0KLQkNCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UjZ2V0UG9ydE5hbWUgPGVtPlBvcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSAjZ2V0UG9ydE5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldFBvcnROYW1lKFN0cmluZyB2YWx1ZSk7DQotDQotCS8qKg0KLQkgKiBAbW9kZWwgY2hhbmdlYWJsZT0idHJ1ZSIgc3VwcHJlc3NlZFNldFZpc2liaWxpdHk9InRydWUiDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFdzZGxMb2NhdGlvbigpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSNnZXRXc2RsTG9jYXRpb24gPGVtPldzZGwgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgTG9jYXRpb248L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNnZXRXc2RsTG9jYXRpb24oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldFdzZGxMb2NhdGlvbihTdHJpbmcgdmFsdWUpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDFkNWVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLQ0KLQ0KLS8qKg0KLSAqIEBtb2RlbA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICovDQotcHVibGljIGludGVyZmFjZSBJV2ViU2VydmljZVByb2plY3QgZXh0ZW5kcyBFT2JqZWN0DQotew0KLQkvKioNCi0JICogQG1vZGVsIHR5cGU9IklXZWJTZXJ2aWNlIiBzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eT0idHJ1ZSIgbWFueT0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiDQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBFTGlzdDxJV2ViU2VydmljZT4gZ2V0V2ViU2VydmljZXMoKTsNCi0JDQotCQ0KLQkvKioNCi0JICogQG1vZGVsIHR5cGU9IklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIiBtYW55PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSINCi0JICovDQotCXB1YmxpYyBFTGlzdDxJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPiBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCk7DQotCQ0KLQkvKioNCi0JICogQG1vZGVsIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzM0ZGE5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLQ0KLS8qKg0KLSAqIEBtb2RlbA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICovDQotcHVibGljIGludGVyZmFjZSBJV2ViVHlwZSAgZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50IHsNCi0JDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjJiODA1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgcnVudGltZSB3aGljaCB3YW50IHRvIGhhdmUgRE9NIFRyZWUgDQotICogcmVwcmVzZW50YXRpb24gb24gdG9wIG9mIHRoZW0uDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgSHJpc3RvdiBJMDM2MjAxDQotICovDQotcHVibGljIGludGVyZmFjZSBJV3NET01SdW50aW1lRXh0ZW5zaW9uIA0KLXsNCi0JLyoqDQotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBpbnN0YW50aWF0ZSB0aGUgRE9NIGluc3RhbmNlIGZvciB0aGUgcnVudGltZSBhbmQgbG9hZHMgdGhlDQotCSAqIGRhdGEgaW50byBpdC4gVGhlIG1ldGhvZCBsb2NrcyB0aGUgd29ya3NwYWNlIHJvb3QgZHVyaW5nIGV4ZWN1dGlvbi4gSWYgeW91IGNhbGwgdGhpcw0KLQkgKiBtZXRob2QgZHVyaW5nIGxvYWRpbmcgKGkuZS4gc29tZWJvZHkgYWxyZWFkeSBjYWxsZWQgaXQgaW4gZGlmZmVyZW50IHRocmVhZCkgdGhlIG1ldGhvZCANCi0JICogd2lsbCBibG9jayB1bnRpbCB0aGUgbG9hZCBmaW5pc2hlcyBpbnN0ZWFkIG9mIHRyaWdnZXJpbmcgRE9NIHJlbG9hZC4gDQotCSAqIA0KLQkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yIHRvIGJlIHVzZWQgZHVyaW5nIGxvYWRpbmcsIGNhbmNlbGxpbmcgdGhlIGxvYWQgdmlhIG1vbml0b3IgaXMgc3VwcG9ydGVkDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaW4gY2FzZSB0aGUgRE9NIGxvYWRpbmcgaXMgbm90IGFibGUgdG8gcmVhZCByZXF1aXJlZCBkYXRhDQotCSAqIEB0aHJvd3MgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gaW4gY2FzZSB0aGUgbG9hZGluZyB3YXMgY2FuY2VsbGVkIHZpYSBwcm92aWRlZCANCi0JICogPGNvZGU+bW9uaXRvcjwvY29kZT4uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjcmVhdGVET00oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uOw0KLQkNCi0JLyoqDQotCSAqIEFkZHMgYSBsb2FkIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkIGluIGxvYWQgZXZlbnRzLiBJbiBjYXNlIHRoZSBsb2FkaW5nIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZCANCi0JICogdGhpcyBsaXN0ZW5lcidzIG1ldGhvZHMgYXJlIGNhbGxlZCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGxvYWQuDQotCSAqIHtAbGluayBJV3NEb21Mb2FkTGlzdGVuZXIjZmluaXNoZWQoKX0gbWV0aG9kIGlzIGNhbGxlZCBpbiBhbnkgY2FzZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgbG9hZGluZw0KLQkgKiBoYXMgYmVlbiBjYW5jZWxsZWQgb3Igbm90LiANCi0JICogQHBhcmFtIGxpc3RlbmVyDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRMb2FkTGlzdGVuZXIoSVdzRG9tTG9hZExpc3RlbmVyIGxpc3RlbmVyKTsNCi0JDQotCS8qKg0KLQkgKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBmcm9tIERPTSBsb2FkaW5nIGxpc3RlbmVycyBsaXN0DQotCSAqIA0KLQkgKiBAcGFyYW0gbGlzdGVuZXINCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZUxvYWRMaXN0ZW5lcihJV3NEb21Mb2FkTGlzdGVuZXIgbGlzdGVuZXIpOw0KLQkNCi0JLyoqDQotCSAqIFRvIGdldCBhIGhhbmRsZSB0byB0aGUgRE9NIGluc3RhbmNlIGF2YWlsYWJsZSBmb3IgdGhpcyBydW50aW1lLg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgRE9NIGluc3RhbmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGluIGNhc2UgdGhlIGxvYWRpbmcgd2FzIG5vdCBzdGFydGVkIHlldCBvcg0KLQkgKiBpcyBub3QgZmluaXNoZWQgeWV0Lg0KLQkgKiBAdGhyb3dzIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIGluIGNhc2UgbG9hZGluZyBoYXMgYmVlbiBjYWxsZWQgYWxyZWFkeSBidXQgdGhlIGxvYWQNCi0JICogaGFzIGJlZW4gY2FuY2VsbGVkDQotCSAqLw0KLQlwdWJsaWMgSURPTSBnZXRET00oKSB0aHJvd3MgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RvbUxvYWRMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRG9tTG9hZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3OWIwNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRG9tTG9hZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotDQotDQotLyoqDQotICogSW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5IGludGVyZXN0ZWQgaW4gRE9NIGxvYWQgcHJvY2Vzcy4gSW1wbGVtZW50b3JzIGNhbiBiZSBhZGRlZCB0bw0KLSAqIHRoZSB7QGxpbmsgSVdzRE9NUnVudGltZUV4dGVuc2lvbn0gdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIG9uIGxvYWQgc3RhcnR1cC9maW5pc2ggIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXc0RvbUxvYWRMaXN0ZW5lciANCi17DQotCS8qKg0KLQkgKiBDYWxsZWQgYnkge0BsaW5rIElXc0RPTVJ1bnRpbWVFeHRlbnNpb259IGp1c3QgYmVmb3JlIHRoZSBET00gbG9hZCBzdGFydCANCi0JICovDQotCXB1YmxpYyB2b2lkIHN0YXJ0ZWQoKTsNCi0JDQotCS8qKg0KLQkgKiBDYWxsZWQgYnkge0BsaW5rIElXc0RPTVJ1bnRpbWVFeHRlbnNpb259IHdoZW4gdGhlIERPTSBsb2FkIGhhcyBmaW5pc2hlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgZmluaXNoZWQoKTsJDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTU2ODU1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsNCi0NCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nLA0KLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlI2dldFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKQ0KLSAqIEBtb2RlbA0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgZW51bSBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIGltcGxlbWVudHMgRW51bWVyYXRvciB7DQotCS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5XUkFQUEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI1dSQVBQRURfVkFMVUUNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JV1JBUFBFRCgwLCAiV1JBUFBFRCIsICJXUkFQUEVEIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQ0KLQkvKioNCi0JICogVGhlICc8ZW0+PGI+QkFSRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNCQVJFX1ZBTFVFDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCUJBUkUoMSwgIkJBUkUiLCAiQkFSRSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0NCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPldSQVBQRUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPldSQVBQRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI1dSQVBQRUQNCi0JICogQG1vZGVsDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdSQVBQRURfVkFMVUUgPSAwOw0KLQ0KLQkvKioNCi0JICogVGhlICc8ZW0+PGI+QkFSRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QkFSRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjQkFSRQ0KLQkgKiBAbW9kZWwNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFSRV9WQUxVRSA9IDE7DQotDQotCS8qKg0KLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgZW51bWVyYXRvcnMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlW10gVkFMVUVTX0FSUkFZID0NCi0JCW5ldyBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlW10NCi0JCXsNCi0JCQlXUkFQUEVELA0KLQkJCUJBUkUsDQotCQl9Ow0KLQ0KLQkvKioNCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQ0KLQkJew0KLQkJCVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOw0KLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpDQotCQkJew0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkNCi0JCXsNCi0JCQlTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsNCi0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgZ2V0KGludCB2YWx1ZSkgew0KLQkJc3dpdGNoICh2YWx1ZSkNCi0JCXsNCi0JCQljYXNlIFdSQVBQRURfVkFMVUU6IHJldHVybiBXUkFQUEVEOw0KLQkJCWNhc2UgQkFSRV9WQUxVRTogcmV0dXJuIEJBUkU7DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsNCi0NCi0JLyoqDQotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgew0KLQkJdGhpcy52YWx1ZSA9IHZhbHVlOw0KLQkJdGhpcy5uYW1lID0gbmFtZTsNCi0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkgew0KLQkgIHJldHVybiB2YWx1ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCi0JICByZXR1cm4gbmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsNCi0JICByZXR1cm4gbGl0ZXJhbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJcmV0dXJuIGxpdGVyYWw7DQotCX0NCi0JDQotfSAvL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYwODIyNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7DQotDQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5TT0FQIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nLA0KLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlI2dldFNPQVBCaW5kaW5nU3R5bGUoKQ0KLSAqIEBtb2RlbA0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgZW51bSBTT0FQQmluZGluZ1N0eWxlIGltcGxlbWVudHMgRW51bWVyYXRvciB7DQotCS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5ET0NVTUVOVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNET0NVTUVOVF9WQUxVRQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlET0NVTUVOVCgwLCAiRE9DVU1FTlQiLCAiRE9DVU1FTlQiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotDQotCS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5SUEM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjUlBDX1ZBTFVFDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCVJQQygxLCAiUlBDIiwgIlJQQyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0NCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPkRPQ1VNRU5UPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5ET0NVTUVOVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjRE9DVU1FTlQNCi0JICogQG1vZGVsDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPQ1VNRU5UX1ZBTFVFID0gMDsNCi0NCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPlJQQzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UlBDPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNSUEMNCi0JICogQG1vZGVsDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJQQ19WQUxVRSA9IDE7DQotDQotCS8qKg0KLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNPQVBCaW5kaW5nU3R5bGVbXSBWQUxVRVNfQVJSQVkgPQ0KLQkJbmV3IFNPQVBCaW5kaW5nU3R5bGVbXQ0KLQkJew0KLQkJCURPQ1VNRU5ULA0KLQkJCVJQQywNCi0JCX07DQotDQotCS8qKg0KLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxTT0FQQmluZGluZ1N0eWxlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU09BUEJpbmRpbmdTdHlsZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQ0KLQkJew0KLQkJCVNPQVBCaW5kaW5nU3R5bGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOw0KLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpDQotCQkJew0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU09BUEJpbmRpbmdTdHlsZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQ0KLQkJew0KLQkJCVNPQVBCaW5kaW5nU3R5bGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOw0KLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTT0FQQmluZGluZ1N0eWxlIGdldChpbnQgdmFsdWUpIHsNCi0JCXN3aXRjaCAodmFsdWUpDQotCQl7DQotCQkJY2FzZSBET0NVTUVOVF9WQUxVRTogcmV0dXJuIERPQ1VNRU5UOw0KLQkJCWNhc2UgUlBDX1ZBTFVFOiByZXR1cm4gUlBDOw0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7DQotDQotCS8qKg0KLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIFNPQVBCaW5kaW5nU3R5bGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsNCi0JCXRoaXMudmFsdWUgPSB2YWx1ZTsNCi0JCXRoaXMubmFtZSA9IG5hbWU7DQotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIGludCBnZXRWYWx1ZSgpIHsNCi0JICByZXR1cm4gdmFsdWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQotCSAgcmV0dXJuIG5hbWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7DQotCSAgcmV0dXJuIGxpdGVyYWw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCXJldHVybiBsaXRlcmFsOw0KLQl9DQotCQ0KLX0gLy9TT0FQQmluZGluZ1N0eWxlDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIzNWIxODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOw0KLQ0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicsDQotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0U09BUEJpbmRpbmdVc2UoKQ0KLSAqIEBtb2RlbA0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgZW51bSBTT0FQQmluZGluZ1VzZSBpbXBsZW1lbnRzIEVudW1lcmF0b3Igew0KLQkvKioNCi0JICogVGhlICc8ZW0+PGI+TElURVJBTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNMSVRFUkFMX1ZBTFVFDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCUxJVEVSQUwoMCwgIkxJVEVSQUwiLCAiTElURVJBTCIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0NCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPkVOQ09ERUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjRU5DT0RFRF9WQUxVRQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlFTkNPREVEKDEsICJFTkNPREVEIiwgIkVOQ09ERUQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotDQotCS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5MSVRFUkFMPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5MSVRFUkFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNMSVRFUkFMDQotCSAqIEBtb2RlbA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVRFUkFMX1ZBTFVFID0gMDsNCi0NCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPkVOQ09ERUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkVOQ09ERUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI0VOQ09ERUQNCi0JICogQG1vZGVsDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQ09ERURfVkFMVUUgPSAxOw0KLQ0KLQkvKioNCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGVudW1lcmF0b3JzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU09BUEJpbmRpbmdVc2VbXSBWQUxVRVNfQVJSQVkgPQ0KLQkJbmV3IFNPQVBCaW5kaW5nVXNlW10NCi0JCXsNCi0JCQlMSVRFUkFMLA0KLQkJCUVOQ09ERUQsDQotCQl9Ow0KLQ0KLQkvKioNCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGVudW1lcmF0b3JzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFNPQVBCaW5kaW5nVXNlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFNPQVBCaW5kaW5nVXNlIGdldChTdHJpbmcgbGl0ZXJhbCkgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpDQotCQl7DQotCQkJU09BUEJpbmRpbmdVc2UgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOw0KLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpDQotCQkJew0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFNPQVBCaW5kaW5nVXNlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpDQotCQl7DQotCQkJU09BUEJpbmRpbmdVc2UgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOw0KLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU09BUEJpbmRpbmdVc2UgZ2V0KGludCB2YWx1ZSkgew0KLQkJc3dpdGNoICh2YWx1ZSkNCi0JCXsNCi0JCQljYXNlIExJVEVSQUxfVkFMVUU6IHJldHVybiBMSVRFUkFMOw0KLQkJCWNhc2UgRU5DT0RFRF9WQUxVRTogcmV0dXJuIEVOQ09ERUQ7DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsNCi0NCi0JLyoqDQotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgU09BUEJpbmRpbmdVc2UoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsNCi0JCXRoaXMudmFsdWUgPSB2YWx1ZTsNCi0JCXRoaXMubmFtZSA9IG5hbWU7DQotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIGludCBnZXRWYWx1ZSgpIHsNCi0JICByZXR1cm4gdmFsdWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQotCSAgcmV0dXJuIG5hbWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7DQotCSAgcmV0dXJuIGxpdGVyYWw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCXJldHVybiBsaXRlcmFsOw0KLQl9DQotCQ0KLX0gLy9TT0FQQmluZGluZ1VzZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5MjY0M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsNCi0NCi0vKioNCi0gKiBAbW9kZWwNCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqDQotICovDQotcHVibGljIGVudW0gV2ViUGFyYW1LaW5kIGltcGxlbWVudHMgRW51bWVyYXRvciB7LyoqQG1vZGVsKi9JTigwLCAiSU4iLCAiSU4iKSwgLyoqQG1vZGVsKi9JTk9VVCgxLCAiSU5PVVQiLCAiSU5PVVQiKSwgLyoqQG1vZGVsKi9PVVQoMiwgIk9VVCIsICJPVVQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQNCi0NCi0vKioNCi0JICogVGhlICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNJTg0KLQkgKiBAbW9kZWwNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fVkFMVUUgPSAwOw0KLS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5JTk9VVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI0lOT1VUDQotCSAqIEBtb2RlbA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTk9VVF9WQUxVRSA9IDE7DQotLyoqDQotCSAqIFRoZSAnPGVtPjxiPk9VVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T1VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNPVVQNCi0JICogQG1vZGVsDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVF9WQUxVRSA9IDI7DQotLyoqDQotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5XZWIgUGFyYW0gS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBXZWJQYXJhbUtpbmRbXSBWQUxVRVNfQVJSQVkgPQ0KLQkJbmV3IFdlYlBhcmFtS2luZFtdDQotCQl7DQotCQkJSU4sDQotCQkJSU5PVVQsDQotCQkJT1VULA0KLQkJfTsNCi0vKioNCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPldlYiBQYXJhbSBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxXZWJQYXJhbUtpbmQ+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsNCi0NCi0vKioNCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5XZWIgUGFyYW0gS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgV2ViUGFyYW1LaW5kIGdldChTdHJpbmcgbGl0ZXJhbCkgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpDQotCQl7DQotCQkJV2ViUGFyYW1LaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsNCi0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLS8qKg0KLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPldlYiBQYXJhbSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBXZWJQYXJhbUtpbmQgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkNCi0JCXsNCi0JCQlXZWJQYXJhbUtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOw0KLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0vKioNCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5XZWIgUGFyYW0gS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgV2ViUGFyYW1LaW5kIGdldChpbnQgdmFsdWUpIHsNCi0JCXN3aXRjaCAodmFsdWUpDQotCQl7DQotCQkJY2FzZSBJTl9WQUxVRTogcmV0dXJuIElOOw0KLQkJCWNhc2UgSU5PVVRfVkFMVUU6IHJldHVybiBJTk9VVDsNCi0JCQljYXNlIE9VVF9WQUxVRTogcmV0dXJuIE9VVDsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsNCi0vKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7DQotLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOw0KLQ0KLS8qKg0KLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIFdlYlBhcmFtS2luZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgew0KLQkJdGhpcy52YWx1ZSA9IHZhbHVlOw0KLQkJdGhpcy5uYW1lID0gbmFtZTsNCi0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7DQotCX0NCi0NCi0vKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7DQotCSAgcmV0dXJuIHZhbHVlOw0KLQl9DQotDQotLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQotCSAgcmV0dXJuIG5hbWU7DQotCX0NCi0NCi0vKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsNCi0JICByZXR1cm4gbGl0ZXJhbDsNCi0JfQ0KLQ0KLS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlyZXR1cm4gbGl0ZXJhbDsNCi0JfX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjcxMDQ3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLQ0KLQ0KLS8qKg0KLSAqIEV4Y2VwdGlvbiB0aHJvd24gaW4gY2FzZSB0aGUgbG9hZGluZyBvZiBXUyBET00gaGFzIGJlZW4gY2FuY2VsbGVkDQotICogIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsNCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbG9jYWxpemVkTWVzc2FnZTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdHMgZXhjZXB0aW9uIHdpdGggYWJpbGl0eSB0byBwcm92aWRlIGxvY2FsaXplZCBtZXNzYWdlDQotCSAqIEBwYXJhbSBtZXNzYWdlIC0gdGhlIGRldGFpbCBtZXNzYWdlICh3aGljaCBpcyBzYXZlZCBmb3IgbGF0ZXIgcmV0cmlldmFsDQotICAgICAqICAgICAgICAgYnkgdGhlIHtAbGluayAjZ2V0TWVzc2FnZSgpfSBtZXRob2QpDQotCSAqIEBwYXJhbSBsb2NhbGl6ZWRNZXNzYWdlIC0gdGhlIGxvY2FsaXplZCBtZXNzYWdlICh3aGljaCBpcyBzYXZlZCBmb3IgbGF0ZXIgcmV0cmlldmFsDQotICAgICAqICAgICAgICAgYnkgdGhlIHtAbGluayAjZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSBtZXRob2QpDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICAtIGluIGNhc2UgbG9jYWxpc2VkIG1lc3NhZ2UgaXMgbnVsbA0KLQkgKiAqLw0KLQlwdWJsaWMgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlKSB7DQotCQlzdXBlcihtZXNzYWdlKTsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShsb2NhbGl6ZWRNZXNzYWdlLCAibG9jYWxpemVkTWVzc2FnZSIpOyAvLyROT04tTkxTLTEkDQotCQl0aGlzLmxvY2FsaXplZE1lc3NhZ2UgPSBsb2NhbGl6ZWRNZXNzYWdlOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyBsb2NhbGl6ZWQgbWVzc2FnZSB3aXRoIHdoaWNoIHRoZSBleGNlcHRpb24gd2FzIGNvbnN0cnVjdGVkLiovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsaXplZE1lc3NhZ2UoKSB7DQotCQlyZXR1cm4gbG9jYWxpemVkTWVzc2FnZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2ZDRhNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnJlZ2lzdHJ5LklXc0RPTVJ1bnRpbWVJbmZvOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucmVnaXN0cnkuV3NET01SdW50aW1lUmVnaXN0cnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBGYWN0b3J5IGNsYXNzIGZvciBpbnN0YW50aWF0aW5nIERPTSBSdW50aW1lcyBhbmQgbWFuYWdpbmcgdGhvc2UgaW5zdGFuY2VzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIEhyaXN0b3YNCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXc0RPTVJ1bnRpbWVNYW5hZ2VyIGltcGxlbWVudHMgSVdTRE9NUnVudGltZU1hbmFnZXINCi17DQotCXByaXZhdGUgc3RhdGljIFdzRE9NUnVudGltZU1hbmFnZXIgaW5zdGFuY2UgPSBuZXcgV3NET01SdW50aW1lTWFuYWdlcigpOw0KLQ0KLQlwcml2YXRlIE1hcDxTdHJpbmcsSVdzRE9NUnVudGltZUV4dGVuc2lvbj4gZG9tUnVudGltZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsSVdzRE9NUnVudGltZUV4dGVuc2lvbj4oKTsNCi0NCi0JcHJvdGVjdGVkIFdzRE9NUnVudGltZU1hbmFnZXIoKQ0KLQl7DQotCQkvLyBzaW5nbGV0b24NCi0JfQ0KLQkNCi0JcHVibGljIHN0YXRpYyBJV1NET01SdW50aW1lTWFuYWdlciBpbnN0YW5jZSgpDQotCXsNCi0JCXJldHVybiBpbnN0YW5jZTsNCi0JfQkNCi0JDQotCS8qKg0KLQkgKiBJbnN0YW50aWF0ZXMgdGhlIERPTSBSdW50aW1lcyBpZiBub3QgYWxyZWFkeS4NCi0JICoNCi0JICovDQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjcmVhdGVET01SdW50aW1lcyhmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCXsNCi0JCWZvciAoSVdzRE9NUnVudGltZUluZm8gcnVudGltZUluZm8gOiBXc0RPTVJ1bnRpbWVSZWdpc3RyeS5nZXRSZWdpc3RlcmVkUnVudGltZXNJbmZvKCkpIHsNCi0JCQljcmVhdGVET01SdW50aW1lKHJ1bnRpbWVJbmZvLCBtb25pdG9yKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gY3JlYXRlRE9NUnVudGltZShmaW5hbCBJV3NET01SdW50aW1lSW5mbyBydW50aW1lSW5mbywgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQl7DQotCQlmaW5hbCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGRvbVJ1bnRpbWUgPSBnZXRET01SdW50aW1lKHJ1bnRpbWVJbmZvKTsJCQ0KLQkJaWYgKGRvbVJ1bnRpbWUgPT0gbnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQl0cnkgew0KLQkJCWRvbVJ1bnRpbWUuY3JlYXRlRE9NKG1vbml0b3IpOw0KLQkJfSANCi0JCWNhdGNoIChFeGNlcHRpb24gdW5leHBlY3RlZCkgew0KLQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiEgRG9tIGZyb20gcnVudGltZSAiICsgcnVudGltZUluZm8uZ2V0TmFtZSgpICsgIiB3aWxsIG5vdCBiZSBwcm9jZXNzZWQhIiwgdW5leHBlY3RlZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZG9tUnVudGltZTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIERPTSBydW50aW1lIGluc3RhbmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRlc2NyaXB0b3Igb2JqZWN0DQotCSAqIG9mIHR5cGUgSVJ1bnRpbWVJbmZvIGFuZCBpbnN0YW50aWF0ZSBzdWNoIERPTSBydW50aW1lIGluc3RhbmNlIGlmIG5vbiBleGlzdGVudCBhdCB0aGUgDQotCSAqIG1vbWVudCBvZiBpbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kLg0KLQkgKiANCi0JICogQHBhcmFtIHJ1bnRpbWVJbmZvIC0gZGVzY3JpcHRvciBvZiB0aGUgRE9NIHJ1bnRpbWUgdG8gYmUgaW5zdGFudGlhdGVkIGFuZCByZXR1cm5lZCANCi0JICogQHJldHVybiB0aGUgRE9NIHJ1bnRpbWUgaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldERPTVJ1bnRpbWUoZmluYWwgSVdzRE9NUnVudGltZUluZm8gcnVudGltZUluZm8pDQotCXsNCi0JCWlmIChydW50aW1lSW5mbyA9PSBudWxsKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotCQkNCi0JCUlXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZG9tUnVudGltZSA9IGRvbVJ1bnRpbWVzLmdldChydW50aW1lSW5mby5nZXRJZCgpKTsJCQ0KLQkJaWYgKGRvbVJ1bnRpbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQlkb21SdW50aW1lID0gV3NET01SdW50aW1lUmVnaXN0cnkuaW5zdGFudGlhdGVSdW50aW1lKHJ1bnRpbWVJbmZvKTsNCi0JCQlpZiAoZG9tUnVudGltZSAhPSBudWxsKSB7DQotCQkJCXN5bmNocm9uaXplZChkb21SdW50aW1lcykgew0KLQkJCQkJZG9tUnVudGltZXMucHV0KHJ1bnRpbWVJbmZvLmdldElkKCksIGRvbVJ1bnRpbWUpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZG9tUnVudGltZTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIERPTSBydW50aW1lIGluc3RhbmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJ1bnRpbWUgaWQNCi0JICogYW5kIGluc3RhbnRpYXRlIHN1Y2ggRE9NIHJ1bnRpbWUgaW5zdGFuY2UgaWYgbm9uIGV4aXN0ZW50IGF0IHRoZSANCi0JICogbW9tZW50IG9mIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2QuDQotCSAqIA0KLQkgKiBAcGFyYW0gcnVudGltZUlkIC0gc3RyaW5nIGlkZW50aWZpZXIgb2YgdGhlIHJ1bnRpbWUgDQotCSAqIEByZXR1cm4gdGhlIERPTSBydW50aW1lIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBnZXRET01SdW50aW1lKGZpbmFsIFN0cmluZyBydW50aW1lSWQpDQotCXsNCi0JCXJldHVybiBnZXRET01SdW50aW1lKFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJ1bnRpbWVJbmZvKHJ1bnRpbWVJZCkpOw0KLQl9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGFsbCBpbnN0YW50aWF0ZWQgRE9NIFJ1bnRpbWVzDQotICAgICAqLw0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxJV3NET01SdW50aW1lRXh0ZW5zaW9uPiBnZXRET01SdW50aW1lcygpDQotICAgIHsNCi0gICAgCWlmIChkb21SdW50aW1lcy5zaXplKCkgPT0gMCkgDQotICAgIAl7DQotCSAgICAJZmluYWwgQ29sbGVjdGlvbjxJV3NET01SdW50aW1lSW5mbz4gcnRJbmZvcyA9IFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRSdW50aW1lc0luZm8oKTsNCi0JICAgIAlmb3IgKElXc0RPTVJ1bnRpbWVJbmZvIHJ1bnRpbWVJbmZvIDogcnRJbmZvcykgew0KLQkJCQlnZXRET01SdW50aW1lKHJ1bnRpbWVJbmZvKTsNCi0JCQl9DQotICAgIAl9DQotICAgIAkNCi0gICAgCXJldHVybiBkb21SdW50aW1lcy52YWx1ZXMoKTsNCi0gICAgfQ0KLQkNCi0JLyoqDQotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCByZWxvYWQgYWxsIGluc3RhbmNlcyBvZiBET00gUnVudGltZXMuDQotCSAqDQotCSAqLw0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVsb2FkRE9NUnVudGltZXMoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQl7DQotCQlzeW5jaHJvbml6ZWQoZG9tUnVudGltZXMpIHsNCi0JCQlkb21SdW50aW1lcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxJV3NET01SdW50aW1lRXh0ZW5zaW9uPigpOw0KLQkJfQ0KLQkJDQotCQljcmVhdGVET01SdW50aW1lcyhtb25pdG9yKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIElMb2dnZXIgbG9nZ2VyKCkgew0KLQkJcmV0dXJuIG5ldyBMb2dnZXIoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2RvbS5lY29yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDQxZWRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImRvbSIKLSAgICBuc1VSST0iaHR0cDovLy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJRE9NIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2ViU2VydmljZVByb2plY3RzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0lXZWJTZXJ2aWNlUHJvamVjdCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklKYXZhV2ViU2VydmljZUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBsZW1lbnRhdGlvbiIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIgZVN1cGVyVHlwZXM9IiMvL0lKYXZhV2ViU2VydmljZUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBsaWNpdCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9InN1cHByZXNzZWRTZXRWaXNpYmlsaXR5IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9JV2ViU2VydmljZSIgZU9wcG9zaXRlPSIjLy9JV2ViU2VydmljZS9zZXJ2aWNlRW5kcG9pbnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9InN1cHByZXNzZWRTZXRWaXNpYmlsaXR5IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWJNZXRob2RzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0lXZWJNZXRob2QiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9InN1cHByZXNzZWRTZXRWaXNpYmlsaXR5IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic29hcEJpbmRpbmdTdHlsZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1NPQVBCaW5kaW5nU3R5bGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IkRPQ1VNRU5UIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNvYXBCaW5kaW5nVXNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vU09BUEJpbmRpbmdVc2UiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IkxJVEVSQUwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IldSQVBQRUQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSVdlYk1ldGhvZCIgZVN1cGVyVHlwZXM9IiMvL0lKYXZhV2ViU2VydmljZUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwYXJhbWV0ZXJzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0lXZWJQYXJhbSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4Y2x1ZGVkIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb2FwQmluZGluZ1N0eWxlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vU09BUEJpbmRpbmdTdHlsZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iRE9DVU1FTlQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic29hcEJpbmRpbmdVc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TT0FQQmluZGluZ1VzZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iTElURVJBTCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iV1JBUFBFRCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJV2ViUGFyYW0iIGVTdXBlclR5cGVzPSIjLy9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2luZCIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1dlYlBhcmFtS2luZCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlTmFtZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhcnROYW1lIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhcmdldE5hbWVzcGFjZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoZWFkZXIiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJV2ViU2VydmljZSIgZVN1cGVyVHlwZXM9IiMvL0lKYXZhV2ViU2VydmljZUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2aWNlRW5kcG9pbnQiIGVUeXBlPSIjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIgotICAgICAgICBlT3Bwb3NpdGU9IiMvL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UvaW1wbGVtZW50aW5nV2ViU2VydmljZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9InN1cHByZXNzZWRTZXRWaXNpYmlsaXR5IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icG9ydE5hbWUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id3NkbExvY2F0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklXZWJTZXJ2aWNlUHJvamVjdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndlYlNlcnZpY2VzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0lXZWJTZXJ2aWNlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VydmljZUVuZHBvaW50SW50ZXJmYWNlcyIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklXZWJUeXBlIiBlU3VwZXJUeXBlcz0iIy8vSUphdmFXZWJTZXJ2aWNlRWxlbWVudCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iV2ViUGFyYW1LaW5kIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IklOIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJJTk9VVCIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik9VVCIgdmFsdWU9IjIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJTT0FQQmluZGluZ1N0eWxlIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkRPQ1VNRU5UIiBsaXRlcmFsPSJET0NVTUVOVCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUlBDIiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlNPQVBCaW5kaW5nVXNlIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkxJVEVSQUwiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkVOQ09ERUQiIHZhbHVlPSIxIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJXUkFQUEVEIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJCQVJFIiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2RvbS53cy5nZW5tb2RlbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLndzLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDI2OWFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLndzLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjIgotICAgIGVkaXREaXJlY3Rvcnk9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSIgbW9kZWxOYW1lPSJEb20iIGVkaXRQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5pbnRlcm5hbC5wbHVnaW4uRG9tVWkiCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkubmF2aWdhdG9yLmdlbmVyYXRlZC5Eb21FZGl0b3JQbHVnaW4iCi0gICAgbm9uTkxTTWFya2Vycz0idHJ1ZSIgdGVzdHNEaXJlY3Rvcnk9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMiCi0gICAgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLmphdmEiIGNvbXBsaWFuY2VMZXZlbD0iNS4wIiBjb3B5cmlnaHRGaWVsZHM9ImZhbHNlIgotICAgIHByb3ZpZGVyUm9vdEV4dGVuZHNDbGFzcz0iIj4KLSAgPGZvcmVpZ25Nb2RlbD5AbW9kZWw8L2ZvcmVpZ25Nb2RlbD4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iRG9tIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlUGFja2FnZVN1ZmZpeD0icnVudGltZS5hcGkiIG1ldGFEYXRhUGFja2FnZVN1ZmZpeD0icnVudGltZS5hcGkiIGNsYXNzUGFja2FnZVN1ZmZpeD0icnVudGltZS5pbnRlcm5hbC5pbXBsIgotICAgICAgdXRpbGl0eVBhY2thZ2VTdWZmaXg9InJ1bnRpbWUudXRpbCIgcHJvdmlkZXJQYWNrYWdlU3VmZml4PSJ1aSIgZ2VuZXJhdGVFeGFtcGxlQ2xhc3M9ImZhbHNlIgotICAgICAgZWNvcmVQYWNrYWdlPSJkb20uZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImRvbS5lY29yZSMvL1dlYlBhcmFtS2luZCI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImRvbS5lY29yZSMvL1dlYlBhcmFtS2luZC9JTiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJkb20uZWNvcmUjLy9XZWJQYXJhbUtpbmQvSU5PVVQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZG9tLmVjb3JlIy8vV2ViUGFyYW1LaW5kL09VVCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImRvbS5lY29yZSMvL1NPQVBCaW5kaW5nU3R5bGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJkb20uZWNvcmUjLy9TT0FQQmluZGluZ1N0eWxlL0RPQ1VNRU5UIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImRvbS5lY29yZSMvL1NPQVBCaW5kaW5nU3R5bGUvUlBDIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iZG9tLmVjb3JlIy8vU09BUEJpbmRpbmdVc2UiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJkb20uZWNvcmUjLy9TT0FQQmluZGluZ1VzZS9MSVRFUkFMIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImRvbS5lY29yZSMvL1NPQVBCaW5kaW5nVXNlL0VOQ09ERUQiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJkb20uZWNvcmUjLy9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZG9tLmVjb3JlIy8vU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS9XUkFQUEVEIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImRvbS5lY29yZSMvL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUvQkFSRSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZG9tLmVjb3JlIy8vSURPTSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRvbS5lY29yZSMvL0lET00vd2ViU2VydmljZVByb2plY3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRvbS5lY29yZSMvL0lKYXZhV2ViU2VydmljZUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lKYXZhV2ViU2VydmljZUVsZW1lbnQvaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JSmF2YVdlYlNlcnZpY2VFbGVtZW50L25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZG9tLmVjb3JlIy8vSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS9pbXBsaWNpdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRvbS5lY29yZSMvL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UvaW1wbGVtZW50aW5nV2ViU2VydmljZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZG9tLmVjb3JlIy8vSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS93ZWJNZXRob2RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS90YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlL3NvYXBCaW5kaW5nU3R5bGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlL3NvYXBCaW5kaW5nVXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS9zb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRvbS5lY29yZSMvL0lXZWJNZXRob2QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkb20uZWNvcmUjLy9JV2ViTWV0aG9kL3BhcmFtZXRlcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JV2ViTWV0aG9kL2V4Y2x1ZGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYk1ldGhvZC9zb2FwQmluZGluZ1N0eWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYk1ldGhvZC9zb2FwQmluZGluZ1VzZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lXZWJNZXRob2Qvc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkb20uZWNvcmUjLy9JV2ViUGFyYW0iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lXZWJQYXJhbS9raW5kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlBhcmFtL3R5cGVOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlBhcmFtL3BhcnROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlBhcmFtL3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lXZWJQYXJhbS9oZWFkZXIiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRvbS5lY29yZSMvL0lXZWJTZXJ2aWNlL3NlcnZpY2VFbmRwb2ludCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lXZWJTZXJ2aWNlL3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lXZWJTZXJ2aWNlL3BvcnROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2Uvd3NkbExvY2F0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRvbS5lY29yZSMvL0lXZWJTZXJ2aWNlUHJvamVjdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRvbS5lY29yZSMvL0lXZWJTZXJ2aWNlUHJvamVjdC93ZWJTZXJ2aWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkb20uZWNvcmUjLy9JV2ViU2VydmljZVByb2plY3Qvc2VydmljZUVuZHBvaW50SW50ZXJmYWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lXZWJTZXJ2aWNlUHJvamVjdC9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRvbS5lY29yZSMvL0lXZWJUeXBlIi8+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0RvbUZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvRG9tRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTFkM2E3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvRG9tRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kOw0KLQ0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+Lg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRG9tRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBEb21GYWN0b3J5IHsNCi0JLyoqDQotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgRG9tRmFjdG9yeSBpbml0KCkgew0KLQkJdHJ5DQotCQl7DQotCQkJRG9tRmFjdG9yeSB0aGVEb21GYWN0b3J5ID0gKERvbUZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly8vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2RvbS5lY29yZSIpOyAvLyROT04tTkxTLTEkIA0KLQkJCWlmICh0aGVEb21GYWN0b3J5ICE9IG51bGwpDQotCQkJew0KLQkJCQlyZXR1cm4gdGhlRG9tRmFjdG9yeTsNCi0JCQl9DQotCQl9DQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikNCi0JCXsNCi0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCi0JCX0NCi0JCXJldHVybiBuZXcgRG9tRmFjdG9yeUltcGwoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBEb21GYWN0b3J5SW1wbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsNCi0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JRE9NOiByZXR1cm4gY3JlYXRlSURPTSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UOiByZXR1cm4gY3JlYXRlSUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6IHJldHVybiBjcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EOiByZXR1cm4gY3JlYXRlSVdlYk1ldGhvZCgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNOiByZXR1cm4gY3JlYXRlSVdlYlBhcmFtKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRTogcmV0dXJuIGNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUOiByZXR1cm4gY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0KCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfVFlQRTogcmV0dXJuIGNyZWF0ZUlXZWJUeXBlKCk7DQotCQkJZGVmYXVsdDoNCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsNCi0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5XRUJfUEFSQU1fS0lORDoNCi0JCQkJcmV0dXJuIGNyZWF0ZVdlYlBhcmFtS2luZEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5TT0FQX0JJTkRJTkdfU1RZTEU6DQotCQkJCXJldHVybiBjcmVhdGVTT0FQQmluZGluZ1N0eWxlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLlNPQVBfQklORElOR19VU0U6DQotCQkJCXJldHVybiBjcmVhdGVTT0FQQmluZGluZ1VzZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlyZXR1cm4gY3JlYXRlU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOw0KLQkJCWRlZmF1bHQ6DQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7DQotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuV0VCX1BBUkFNX0tJTkQ6DQotCQkJCXJldHVybiBjb252ZXJ0V2ViUGFyYW1LaW5kVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuU09BUF9CSU5ESU5HX1NUWUxFOg0KLQkJCQlyZXR1cm4gY29udmVydFNPQVBCaW5kaW5nU3R5bGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5TT0FQX0JJTkRJTkdfVVNFOg0KLQkJCQlyZXR1cm4gY29udmVydFNPQVBCaW5kaW5nVXNlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRToNCi0JCQkJcmV0dXJuIGNvbnZlcnRTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsNCi0JCQlkZWZhdWx0Og0KLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJRE9NIGNyZWF0ZUlET00oKSB7DQotCQlJRE9NSW1wbCBpZG9tID0gbmV3IElET01JbXBsKCk7DQotCQlyZXR1cm4gaWRvbTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50IGNyZWF0ZUlKYXZhV2ViU2VydmljZUVsZW1lbnQoKSB7DQotCQlJSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbCBpSmF2YVdlYlNlcnZpY2VFbGVtZW50ID0gbmV3IElKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsKCk7DQotCQlyZXR1cm4gaUphdmFXZWJTZXJ2aWNlRWxlbWVudDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCBpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gbmV3IElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsKCk7DQotCQlyZXR1cm4gaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJV2ViTWV0aG9kIGNyZWF0ZUlXZWJNZXRob2QoKSB7DQotCQlJV2ViTWV0aG9kSW1wbCBpV2ViTWV0aG9kID0gbmV3IElXZWJNZXRob2RJbXBsKCk7DQotCQlyZXR1cm4gaVdlYk1ldGhvZDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJV2ViUGFyYW0gY3JlYXRlSVdlYlBhcmFtKCkgew0KLQkJSVdlYlBhcmFtSW1wbCBpV2ViUGFyYW0gPSBuZXcgSVdlYlBhcmFtSW1wbCgpOw0KLQkJcmV0dXJuIGlXZWJQYXJhbTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJV2ViU2VydmljZSBjcmVhdGVJV2ViU2VydmljZSgpIHsNCi0JCUlXZWJTZXJ2aWNlSW1wbCBpV2ViU2VydmljZSA9IG5ldyBJV2ViU2VydmljZUltcGwoKTsNCi0JCXJldHVybiBpV2ViU2VydmljZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJV2ViU2VydmljZVByb2plY3QgY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0KCkgew0KLQkJSVdlYlNlcnZpY2VQcm9qZWN0SW1wbCBpV2ViU2VydmljZVByb2plY3QgPSBuZXcgSVdlYlNlcnZpY2VQcm9qZWN0SW1wbCgpOw0KLQkJcmV0dXJuIGlXZWJTZXJ2aWNlUHJvamVjdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJV2ViVHlwZSBjcmVhdGVJV2ViVHlwZSgpIHsNCi0JCUlXZWJUeXBlSW1wbCBpV2ViVHlwZSA9IG5ldyBJV2ViVHlwZUltcGwoKTsNCi0JCXJldHVybiBpV2ViVHlwZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBXZWJQYXJhbUtpbmQgY3JlYXRlV2ViUGFyYW1LaW5kRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7DQotCQlXZWJQYXJhbUtpbmQgcmVzdWx0ID0gV2ViUGFyYW1LaW5kLmdldChpbml0aWFsVmFsdWUpOw0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V2ViUGFyYW1LaW5kVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsNCi0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nU3R5bGUgY3JlYXRlU09BUEJpbmRpbmdTdHlsZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgew0KLQkJU09BUEJpbmRpbmdTdHlsZSByZXN1bHQgPSBTT0FQQmluZGluZ1N0eWxlLmdldChpbml0aWFsVmFsdWUpOw0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U09BUEJpbmRpbmdTdHlsZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7DQotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1VzZSBjcmVhdGVTT0FQQmluZGluZ1VzZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgew0KLQkJU09BUEJpbmRpbmdVc2UgcmVzdWx0ID0gU09BUEJpbmRpbmdVc2UuZ2V0KGluaXRpYWxWYWx1ZSk7DQotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTT0FQQmluZGluZ1VzZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7DQotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIGNyZWF0ZVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsNCi0JCVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgcmVzdWx0ID0gU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5nZXQoaW5pdGlhbFZhbHVlKTsNCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgY29udmVydFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgew0KLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRG9tUGFja2FnZSBnZXREb21QYWNrYWdlKCkgew0KLQkJcmV0dXJuIChEb21QYWNrYWdlKWdldEVQYWNrYWdlKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZGVwcmVjYXRlZA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlARGVwcmVjYXRlZA0KLQlwdWJsaWMgc3RhdGljIERvbVBhY2thZ2UgZ2V0UGFja2FnZSgpIHsNCi0JCXJldHVybiBEb21QYWNrYWdlLmVJTlNUQU5DRTsNCi0JfQ0KLQ0KLX0gLy9Eb21GYWN0b3J5SW1wbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9Eb21QYWNrYWdlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0RvbVBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc5NTg4YTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0RvbVBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbDsNCi0NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQ7DQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEb21QYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIERvbVBhY2thZ2Ugew0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgRUNsYXNzIGlkb21FQ2xhc3MgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgRUNsYXNzIGlKYXZhV2ViU2VydmljZUVsZW1lbnRFQ2xhc3MgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgRUNsYXNzIGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgRUNsYXNzIGlXZWJNZXRob2RFQ2xhc3MgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgRUNsYXNzIGlXZWJQYXJhbUVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaVdlYlNlcnZpY2VFQ2xhc3MgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgRUNsYXNzIGlXZWJTZXJ2aWNlUHJvamVjdEVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaVdlYlR5cGVFQ2xhc3MgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgRUVudW0gd2ViUGFyYW1LaW5kRUVudW0gPSBudWxsOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgRUVudW0gc29hcEJpbmRpbmdTdHlsZUVFbnVtID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIEVFbnVtIHNvYXBCaW5kaW5nVXNlRUVudW0gPSBudWxsOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgRUVudW0gc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZUVFbnVtID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgNCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UNCi0JICogcGFja2FnZSBVUkkgdmFsdWUuDQotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMNCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMNCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwNCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZU5TX1VSSQ0KLQkgKiBAc2VlICNpbml0KCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBEb21QYWNrYWdlSW1wbCgpIHsNCi0JCXN1cGVyKGVOU19VUkksIERvbUZhY3RvcnkuZUlOU1RBTkNFKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcw0KLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQ0KLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbA0KLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMNCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbA0KLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLg0KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoDQotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZA0KLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6DQotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55DQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvDQotCSAqIHRob3NlIG9mIGFub3RoZXIuDQotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUNCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZU5TX1VSSQ0KLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQ0KLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBEb21QYWNrYWdlIGluaXQoKSB7DQotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoRG9tUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEb21QYWNrYWdlLmVOU19VUkkpOw0KLQ0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQ0KLQkJRG9tUGFja2FnZUltcGwgdGhlRG9tUGFja2FnZSA9IChEb21QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBEb21QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IERvbVBhY2thZ2VJbXBsKCkpOw0KLQ0KLQkJaXNJbml0ZWQgPSB0cnVlOw0KLQ0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMNCi0JCXRoZURvbVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7DQotDQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhDQotCQl0aGVEb21QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsNCi0NCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQNCi0JCXRoZURvbVBhY2thZ2UuZnJlZXplKCk7DQotDQotCQlyZXR1cm4gdGhlRG9tUGFja2FnZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQ2xhc3MgZ2V0SURPTSgpIHsNCi0JCXJldHVybiBpZG9tRUNsYXNzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SURPTV9XZWJTZXJ2aWNlUHJvamVjdHMoKSB7DQotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaWRvbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVDbGFzcyBnZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkgew0KLQkJcmV0dXJuIGlKYXZhV2ViU2VydmljZUVsZW1lbnRFQ2xhc3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50X0ltcGxlbWVudGF0aW9uKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlKYXZhV2ViU2VydmljZUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElKYXZhV2ViU2VydmljZUVsZW1lbnRfTmFtZSgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpSmF2YVdlYlNlcnZpY2VFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUNsYXNzIGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7DQotCQlyZXR1cm4gaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGljaXQoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9JbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpIHsNCi0JCXJldHVybiAoRVJlZmVyZW5jZSlpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1dlYk1ldGhvZHMoKSB7DQotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9UYXJnZXROYW1lc3BhY2UoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1N0eWxlKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdVc2UoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQ2xhc3MgZ2V0SVdlYk1ldGhvZCgpIHsNCi0JCXJldHVybiBpV2ViTWV0aG9kRUNsYXNzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SVdlYk1ldGhvZF9QYXJhbWV0ZXJzKCkgew0KLQkJcmV0dXJuIChFUmVmZXJlbmNlKWlXZWJNZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElXZWJNZXRob2RfRXhjbHVkZWQoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYk1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1N0eWxlKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlXZWJNZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElXZWJNZXRob2RfU29hcEJpbmRpbmdVc2UoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYk1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlXZWJNZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQ2xhc3MgZ2V0SVdlYlBhcmFtKCkgew0KLQkJcmV0dXJuIGlXZWJQYXJhbUVDbGFzczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElXZWJQYXJhbV9LaW5kKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlXZWJQYXJhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYlBhcmFtX1R5cGVOYW1lKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlXZWJQYXJhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYlBhcmFtX1BhcnROYW1lKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlXZWJQYXJhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYlBhcmFtX1RhcmdldE5hbWVzcGFjZSgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpV2ViUGFyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElXZWJQYXJhbV9IZWFkZXIoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYlBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUNsYXNzIGdldElXZWJTZXJ2aWNlKCkgew0KLQkJcmV0dXJuIGlXZWJTZXJ2aWNlRUNsYXNzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SVdlYlNlcnZpY2VfU2VydmljZUVuZHBvaW50KCkgew0KLQkJcmV0dXJuIChFUmVmZXJlbmNlKWlXZWJTZXJ2aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViU2VydmljZV9UYXJnZXROYW1lc3BhY2UoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYlNlcnZpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElXZWJTZXJ2aWNlX1BvcnROYW1lKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlXZWJTZXJ2aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViU2VydmljZV9Xc2RsTG9jYXRpb24oKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYlNlcnZpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQ2xhc3MgZ2V0SVdlYlNlcnZpY2VQcm9qZWN0KCkgew0KLQkJcmV0dXJuIGlXZWJTZXJ2aWNlUHJvamVjdEVDbGFzczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFUmVmZXJlbmNlIGdldElXZWJTZXJ2aWNlUHJvamVjdF9XZWJTZXJ2aWNlcygpIHsNCi0JCXJldHVybiAoRVJlZmVyZW5jZSlpV2ViU2VydmljZVByb2plY3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFUmVmZXJlbmNlIGdldElXZWJTZXJ2aWNlUHJvamVjdF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkgew0KLQkJcmV0dXJuIChFUmVmZXJlbmNlKWlXZWJTZXJ2aWNlUHJvamVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYlNlcnZpY2VQcm9qZWN0X05hbWUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUNsYXNzIGdldElXZWJUeXBlKCkgew0KLQkJcmV0dXJuIGlXZWJUeXBlRUNsYXNzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVFbnVtIGdldFdlYlBhcmFtS2luZCgpIHsNCi0JCXJldHVybiB3ZWJQYXJhbUtpbmRFRW51bTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFRW51bSBnZXRTT0FQQmluZGluZ1N0eWxlKCkgew0KLQkJcmV0dXJuIHNvYXBCaW5kaW5nU3R5bGVFRW51bTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFRW51bSBnZXRTT0FQQmluZGluZ1VzZSgpIHsNCi0JCXJldHVybiBzb2FwQmluZGluZ1VzZUVFbnVtOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVFbnVtIGdldFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSB7DQotCQlyZXR1cm4gc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZUVFbnVtOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIERvbUZhY3RvcnkgZ2V0RG9tRmFjdG9yeSgpIHsNCi0JCXJldHVybiAoRG9tRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMNCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgew0KLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOw0KLQkJaXNDcmVhdGVkID0gdHJ1ZTsNCi0NCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcw0KLQkJaWRvbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJRE9NKTsNCi0JCWNyZWF0ZUVSZWZlcmVuY2UoaWRvbUVDbGFzcywgSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFMpOw0KLQ0KLQkJaUphdmFXZWJTZXJ2aWNlRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaUphdmFXZWJTZXJ2aWNlRWxlbWVudEVDbGFzcywgSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04pOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpSmF2YVdlYlNlcnZpY2VFbGVtZW50RUNsYXNzLCBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKTsNCi0NCi0JCWlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcywgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCk7DQotCQljcmVhdGVFUmVmZXJlbmNlKGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MsIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUyk7DQotCQljcmVhdGVFUmVmZXJlbmNlKGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MsIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFMpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0UpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19TVFlMRSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MsIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1VTRSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MsIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSk7DQotDQotCQlpV2ViTWV0aG9kRUNsYXNzID0gY3JlYXRlRUNsYXNzKElXRUJfTUVUSE9EKTsNCi0JCWNyZWF0ZUVSZWZlcmVuY2UoaVdlYk1ldGhvZEVDbGFzcywgSVdFQl9NRVRIT0RfX1BBUkFNRVRFUlMpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViTWV0aG9kRUNsYXNzLCBJV0VCX01FVEhPRF9fRVhDTFVERUQpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViTWV0aG9kRUNsYXNzLCBJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1NUWUxFKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVdlYk1ldGhvZEVDbGFzcywgSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0UpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViTWV0aG9kRUNsYXNzLCBJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSk7DQotDQotCQlpV2ViUGFyYW1FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVdFQl9QQVJBTSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJQYXJhbUVDbGFzcywgSVdFQl9QQVJBTV9fS0lORCk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJQYXJhbUVDbGFzcywgSVdFQl9QQVJBTV9fVFlQRV9OQU1FKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVdlYlBhcmFtRUNsYXNzLCBJV0VCX1BBUkFNX19QQVJUX05BTUUpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViUGFyYW1FQ2xhc3MsIElXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViUGFyYW1FQ2xhc3MsIElXRUJfUEFSQU1fX0hFQURFUik7DQotDQotCQlpV2ViU2VydmljZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJV0VCX1NFUlZJQ0UpOw0KLQkJY3JlYXRlRVJlZmVyZW5jZShpV2ViU2VydmljZUVDbGFzcywgSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVdlYlNlcnZpY2VFQ2xhc3MsIElXRUJfU0VSVklDRV9fVEFSR0VUX05BTUVTUEFDRSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJTZXJ2aWNlRUNsYXNzLCBJV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJTZXJ2aWNlRUNsYXNzLCBJV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT04pOw0KLQ0KLQkJaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElXRUJfU0VSVklDRV9QUk9KRUNUKTsNCi0JCWNyZWF0ZUVSZWZlcmVuY2UoaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzLCBJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTKTsNCi0JCWNyZWF0ZUVSZWZlcmVuY2UoaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzLCBJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzLCBJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRSk7DQotDQotCQlpV2ViVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJV0VCX1RZUEUpOw0KLQ0KLQkJLy8gQ3JlYXRlIGVudW1zDQotCQl3ZWJQYXJhbUtpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKFdFQl9QQVJBTV9LSU5EKTsNCi0JCXNvYXBCaW5kaW5nU3R5bGVFRW51bSA9IGNyZWF0ZUVFbnVtKFNPQVBfQklORElOR19TVFlMRSk7DQotCQlzb2FwQmluZGluZ1VzZUVFbnVtID0gY3JlYXRlRUVudW0oU09BUF9CSU5ESU5HX1VTRSk7DQotCQlzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlRUVudW0gPSBjcmVhdGVFRW51bShTT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7DQotDQotCS8qKg0KLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcw0KLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsNCi0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47DQotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsNCi0NCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQ0KLQkJc2V0TmFtZShlTkFNRSk7DQotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsNCi0JCXNldE5zVVJJKGVOU19VUkkpOw0KLQ0KLQkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycw0KLQ0KLQkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzDQotDQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzDQotCQlpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpKTsNCi0JCWlXZWJNZXRob2RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkpOw0KLQkJaVdlYlBhcmFtRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpKTsNCi0JCWlXZWJTZXJ2aWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpKTsNCi0JCWlXZWJUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpKTsNCi0NCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzDQotCQlpbml0RUNsYXNzKGlkb21FQ2xhc3MsIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTS5jbGFzcywgIklET00iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFUmVmZXJlbmNlKGdldElET01fV2ViU2VydmljZVByb2plY3RzKCksIHRoaXMuZ2V0SVdlYlNlcnZpY2VQcm9qZWN0KCksIG51bGwsICJ3ZWJTZXJ2aWNlUHJvamVjdHMiLCBudWxsLCAwLCAtMSwgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotDQotCQlpbml0RUNsYXNzKGlKYXZhV2ViU2VydmljZUVsZW1lbnRFQ2xhc3MsIElKYXZhV2ViU2VydmljZUVsZW1lbnQuY2xhc3MsICJJSmF2YVdlYlNlcnZpY2VFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50X0ltcGxlbWVudGF0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpbXBsZW1lbnRhdGlvbiIsIG51bGwsIDEsIDEsIElKYXZhV2ViU2VydmljZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElKYXZhV2ViU2VydmljZUVsZW1lbnRfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIElKYXZhV2ViU2VydmljZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCWluaXRFQ2xhc3MoaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcywgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcywgIklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGljaXQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpbXBsaWNpdCIsIG51bGwsIDEsIDEsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFUmVmZXJlbmNlKGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGVtZW50aW5nV2ViU2VydmljZXMoKSwgdGhpcy5nZXRJV2ViU2VydmljZSgpLCB0aGlzLmdldElXZWJTZXJ2aWNlX1NlcnZpY2VFbmRwb2ludCgpLCAiaW1wbGVtZW50aW5nV2ViU2VydmljZXMiLCBudWxsLCAxLCAtMSwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9XZWJNZXRob2RzKCksIHRoaXMuZ2V0SVdlYk1ldGhvZCgpLCBudWxsLCAid2ViTWV0aG9kcyIsIG51bGwsIDEsIC0xLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1RhcmdldE5hbWVzcGFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGFyZ2V0TmFtZXNwYWNlIiwgbnVsbCwgMSwgMSwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1N0eWxlKCksIHRoaXMuZ2V0U09BUEJpbmRpbmdTdHlsZSgpLCAic29hcEJpbmRpbmdTdHlsZSIsICJET0NVTUVOVCIsIDEsIDEsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1VzZSgpLCB0aGlzLmdldFNPQVBCaW5kaW5nVXNlKCksICJzb2FwQmluZGluZ1VzZSIsICJMSVRFUkFMIiwgMSwgMSwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSwgdGhpcy5nZXRTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKCksICJzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIiwgIldSQVBQRUQiLCAxLCAxLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0NCi0JCWluaXRFQ2xhc3MoaVdlYk1ldGhvZEVDbGFzcywgSVdlYk1ldGhvZC5jbGFzcywgIklXZWJNZXRob2QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFUmVmZXJlbmNlKGdldElXZWJNZXRob2RfUGFyYW1ldGVycygpLCB0aGlzLmdldElXZWJQYXJhbSgpLCBudWxsLCAicGFyYW1ldGVycyIsIG51bGwsIDEsIC0xLCBJV2ViTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJV2ViTWV0aG9kX0V4Y2x1ZGVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZXhjbHVkZWQiLCBudWxsLCAxLCAxLCBJV2ViTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nU3R5bGUoKSwgdGhpcy5nZXRTT0FQQmluZGluZ1N0eWxlKCksICJzb2FwQmluZGluZ1N0eWxlIiwgIkRPQ1VNRU5UIiwgMSwgMSwgSVdlYk1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nVXNlKCksIHRoaXMuZ2V0U09BUEJpbmRpbmdVc2UoKSwgInNvYXBCaW5kaW5nVXNlIiwgIkxJVEVSQUwiLCAxLCAxLCBJV2ViTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJNZXRob2RfU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpLCB0aGlzLmdldFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSwgInNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiLCAiV1JBUFBFRCIsIDEsIDEsIElXZWJNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQ0KLQkJaW5pdEVDbGFzcyhpV2ViUGFyYW1FQ2xhc3MsIElXZWJQYXJhbS5jbGFzcywgIklXZWJQYXJhbSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYlBhcmFtX0tpbmQoKSwgdGhpcy5nZXRXZWJQYXJhbUtpbmQoKSwgImtpbmQiLCBudWxsLCAxLCAxLCBJV2ViUGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJQYXJhbV9UeXBlTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZU5hbWUiLCBudWxsLCAxLCAxLCBJV2ViUGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJQYXJhbV9QYXJ0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFydE5hbWUiLCBudWxsLCAxLCAxLCBJV2ViUGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJQYXJhbV9UYXJnZXROYW1lc3BhY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInRhcmdldE5hbWVzcGFjZSIsIG51bGwsIDEsIDEsIElXZWJQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYlBhcmFtX0hlYWRlcigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImhlYWRlciIsICJmYWxzZSIsIDEsIDEsIElXZWJQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotDQotCQlpbml0RUNsYXNzKGlXZWJTZXJ2aWNlRUNsYXNzLCBJV2ViU2VydmljZS5jbGFzcywgIklXZWJTZXJ2aWNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RVJlZmVyZW5jZShnZXRJV2ViU2VydmljZV9TZXJ2aWNlRW5kcG9pbnQoKSwgdGhpcy5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCksIHRoaXMuZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9JbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLCAic2VydmljZUVuZHBvaW50IiwgbnVsbCwgMCwgMSwgSVdlYlNlcnZpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJTZXJ2aWNlX1RhcmdldE5hbWVzcGFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGFyZ2V0TmFtZXNwYWNlIiwgbnVsbCwgMSwgMSwgSVdlYlNlcnZpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJTZXJ2aWNlX1BvcnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwb3J0TmFtZSIsIG51bGwsIDEsIDEsIElXZWJTZXJ2aWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJV2ViU2VydmljZV9Xc2RsTG9jYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndzZGxMb2NhdGlvbiIsIG51bGwsIDAsIDEsIElXZWJTZXJ2aWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotDQotCQlpbml0RUNsYXNzKGlXZWJTZXJ2aWNlUHJvamVjdEVDbGFzcywgSVdlYlNlcnZpY2VQcm9qZWN0LmNsYXNzLCAiSVdlYlNlcnZpY2VQcm9qZWN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RVJlZmVyZW5jZShnZXRJV2ViU2VydmljZVByb2plY3RfV2ViU2VydmljZXMoKSwgdGhpcy5nZXRJV2ViU2VydmljZSgpLCBudWxsLCAid2ViU2VydmljZXMiLCBudWxsLCAwLCAtMSwgSVdlYlNlcnZpY2VQcm9qZWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RVJlZmVyZW5jZShnZXRJV2ViU2VydmljZVByb2plY3RfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLCB0aGlzLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSwgbnVsbCwgInNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMiLCBudWxsLCAwLCAtMSwgSVdlYlNlcnZpY2VQcm9qZWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJV2ViU2VydmljZVByb2plY3RfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIElXZWJTZXJ2aWNlUHJvamVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJaW5pdEVDbGFzcyhpV2ViVHlwZUVDbGFzcywgSVdlYlR5cGUuY2xhc3MsICJJV2ViVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMNCi0JCWluaXRFRW51bSh3ZWJQYXJhbUtpbmRFRW51bSwgV2ViUGFyYW1LaW5kLmNsYXNzLCAiV2ViUGFyYW1LaW5kIik7IC8vJE5PTi1OTFMtMSQNCi0JCWFkZEVFbnVtTGl0ZXJhbCh3ZWJQYXJhbUtpbmRFRW51bSwgV2ViUGFyYW1LaW5kLklOKTsNCi0JCWFkZEVFbnVtTGl0ZXJhbCh3ZWJQYXJhbUtpbmRFRW51bSwgV2ViUGFyYW1LaW5kLklOT1VUKTsNCi0JCWFkZEVFbnVtTGl0ZXJhbCh3ZWJQYXJhbUtpbmRFRW51bSwgV2ViUGFyYW1LaW5kLk9VVCk7DQotDQotCQlpbml0RUVudW0oc29hcEJpbmRpbmdTdHlsZUVFbnVtLCBTT0FQQmluZGluZ1N0eWxlLmNsYXNzLCAiU09BUEJpbmRpbmdTdHlsZSIpOyAvLyROT04tTkxTLTEkDQotCQlhZGRFRW51bUxpdGVyYWwoc29hcEJpbmRpbmdTdHlsZUVFbnVtLCBTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UKTsNCi0JCWFkZEVFbnVtTGl0ZXJhbChzb2FwQmluZGluZ1N0eWxlRUVudW0sIFNPQVBCaW5kaW5nU3R5bGUuUlBDKTsNCi0NCi0JCWluaXRFRW51bShzb2FwQmluZGluZ1VzZUVFbnVtLCBTT0FQQmluZGluZ1VzZS5jbGFzcywgIlNPQVBCaW5kaW5nVXNlIik7IC8vJE5PTi1OTFMtMSQNCi0JCWFkZEVFbnVtTGl0ZXJhbChzb2FwQmluZGluZ1VzZUVFbnVtLCBTT0FQQmluZGluZ1VzZS5MSVRFUkFMKTsNCi0JCWFkZEVFbnVtTGl0ZXJhbChzb2FwQmluZGluZ1VzZUVFbnVtLCBTT0FQQmluZGluZ1VzZS5FTkNPREVEKTsNCi0NCi0JCWluaXRFRW51bShzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlRUVudW0sIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuY2xhc3MsICJTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIik7IC8vJE5PTi1OTFMtMSQNCi0JCWFkZEVFbnVtTGl0ZXJhbChzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlRUVudW0sIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCk7DQotCQlhZGRFRW51bUxpdGVyYWwoc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZUVFbnVtLCBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUpOw0KLQ0KLQkJLy8gQ3JlYXRlIHJlc291cmNlDQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsNCi0JfQ0KLQ0KLX0gLy9Eb21QYWNrYWdlSW1wbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JRE9NSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lET01JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhZTg2N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lET01JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbDsNCi0NCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklET008L2I+PC9lbT4nLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIDxwPg0KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KLSAqIDx1bD4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSURPTUltcGwjZ2V0V2ViU2VydmljZVByb2plY3RzIDxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+fTwvbGk+DQotICogPC91bD4NCi0gKiA8L3A+DQotICoNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElET01JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBJRE9NIHsNCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlYlNlcnZpY2VQcm9qZWN0cygpIDxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRXZWJTZXJ2aWNlUHJvamVjdHMoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgRUxpc3Q8SVdlYlNlcnZpY2VQcm9qZWN0PiB3ZWJTZXJ2aWNlUHJvamVjdHM7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElET01JbXBsKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCi0JCXJldHVybiBEb21QYWNrYWdlLkxpdGVyYWxzLklET007DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUxpc3Q8SVdlYlNlcnZpY2VQcm9qZWN0PiBnZXRXZWJTZXJ2aWNlUHJvamVjdHMoKSB7DQotCQlpZiAod2ViU2VydmljZVByb2plY3RzID09IG51bGwpDQotCQl7DQotCQkJd2ViU2VydmljZVByb2plY3RzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PElXZWJTZXJ2aWNlUHJvamVjdD4oSVdlYlNlcnZpY2VQcm9qZWN0LmNsYXNzLCB0aGlzLCBEb21QYWNrYWdlLklET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTKTsNCi0JCX0NCi0JCXJldHVybiB3ZWJTZXJ2aWNlUHJvamVjdHM7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTOg0KLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFdlYlNlcnZpY2VQcm9qZWN0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTOg0KLQkJCQlyZXR1cm4gZ2V0V2ViU2VydmljZVByb2plY3RzKCk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JRE9NX19XRUJfU0VSVklDRV9QUk9KRUNUUzoNCi0JCQkJZ2V0V2ViU2VydmljZVByb2plY3RzKCkuY2xlYXIoKTsNCi0JCQkJZ2V0V2ViU2VydmljZVByb2plY3RzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJV2ViU2VydmljZVByb2plY3Q+KW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTOg0KLQkJCQlnZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5jbGVhcigpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTOg0KLQkJCQlyZXR1cm4gd2ViU2VydmljZVByb2plY3RzICE9IG51bGwgJiYgIXdlYlNlcnZpY2VQcm9qZWN0cy5pc0VtcHR5KCk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi19IC8vSURPTUltcGwNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkODBjMTI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGw7DQotDQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudDsNCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9iPjwvZW0+Jy4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiA8cD4NCi0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoNCi0gKiA8dWw+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsI2dldEltcGxlbWVudGF0aW9uIDxlbT5JbXBsZW1lbnRhdGlvbjwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPg0KLSAqIDwvdWw+DQotICogPC9wPg0KLSAqDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudCB7DQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wbGVtZW50YXRpb24oKSA8ZW0+SW1wbGVtZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldEltcGxlbWVudGF0aW9uKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTEVNRU5UQVRJT05fRURFRkFVTFQgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wbGVtZW50YXRpb24oKSA8ZW0+SW1wbGVtZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldEltcGxlbWVudGF0aW9uKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFN0cmluZyBpbXBsZW1lbnRhdGlvbiA9IElNUExFTUVOVEFUSU9OX0VERUZBVUxUOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXROYW1lKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KLQkJcmV0dXJuIERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wbGVtZW50YXRpb24oKSB7DQotCQlyZXR1cm4gaW1wbGVtZW50YXRpb247DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbnRhdGlvbihTdHJpbmcgbmV3SW1wbGVtZW50YXRpb24pIHsNCi0JCVN0cmluZyBvbGRJbXBsZW1lbnRhdGlvbiA9IGltcGxlbWVudGF0aW9uOw0KLQkJaW1wbGVtZW50YXRpb24gPSBuZXdJbXBsZW1lbnRhdGlvbjsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCBvbGRJbXBsZW1lbnRhdGlvbiwgaW1wbGVtZW50YXRpb24pKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCi0JCXJldHVybiBuYW1lOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgew0KLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOw0KLQkJbmFtZSA9IG5ld05hbWU7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OOg0KLQkJCQlyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRToNCi0JCQkJcmV0dXJuIGdldE5hbWUoKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT046DQotCQkJCXNldEltcGxlbWVudGF0aW9uKChTdHJpbmcpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUU6DQotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTjoNCi0JCQkJc2V0SW1wbGVtZW50YXRpb24oSU1QTEVNRU5UQVRJT05fRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUU6DQotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT046DQotCQkJCXJldHVybiBJTVBMRU1FTlRBVElPTl9FREVGQVVMVCA9PSBudWxsID8gaW1wbGVtZW50YXRpb24gIT0gbnVsbCA6ICFJTVBMRU1FTlRBVElPTl9FREVGQVVMVC5lcXVhbHMoaW1wbGVtZW50YXRpb24pOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FOg0KLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQotDQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiAoaW1wbGVtZW50YXRpb246ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKGltcGxlbWVudGF0aW9uKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQobmFtZSk7DQotCQlyZXN1bHQuYXBwZW5kKCcpJyk7DQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQotCX0NCi0NCi19IC8vSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZDBlNTFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGw7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi0NCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2I+PC9lbT4nLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIDxwPg0KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KLSAqIDx1bD4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwjaXNJbXBsaWNpdCA8ZW0+SW1wbGljaXQ8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCNnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyA8ZW0+SW1wbGVtZW50aW5nIFdlYiBTZXJ2aWNlczwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsI2dldFdlYk1ldGhvZHMgPGVtPldlYiBNZXRob2RzPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwjZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwjZ2V0U29hcEJpbmRpbmdTdHlsZSA8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwjZ2V0U29hcEJpbmRpbmdVc2UgPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59PC9saT4NCi0gKiA8L3VsPg0KLSAqIDwvcD4NCi0gKg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwgZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbCBpbXBsZW1lbnRzIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugew0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSW1wbGljaXQoKSA8ZW0+SW1wbGljaXQ8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2lzSW1wbGljaXQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSU1QTElDSVRfRURFRkFVTFQgPSBmYWxzZTsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSW1wbGljaXQoKSA8ZW0+SW1wbGljaXQ8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2lzSW1wbGljaXQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBsaWNpdCA9IElNUExJQ0lUX0VERUZBVUxUOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKSA8ZW0+SW1wbGVtZW50aW5nIFdlYiBTZXJ2aWNlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBFTGlzdDxJV2ViU2VydmljZT4gaW1wbGVtZW50aW5nV2ViU2VydmljZXM7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXZWJNZXRob2RzKCkgPGVtPldlYiBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFdlYk1ldGhvZHMoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgRUxpc3Q8SVdlYk1ldGhvZD4gd2ViTWV0aG9kczsNCi0NCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXROYW1lc3BhY2UoKSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCA9IG51bGw7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXROYW1lc3BhY2UoKSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBCaW5kaW5nU3R5bGUoKSA8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1N0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTT0FQQmluZGluZ1N0eWxlIFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVCA9IFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQ7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1N0eWxlKCkgPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdTdHlsZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTT0FQQmluZGluZ1N0eWxlIHNvYXBCaW5kaW5nU3R5bGUgPSBTT0FQX0JJTkRJTkdfU1RZTEVfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdVc2UoKSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdVc2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFNPQVBCaW5kaW5nVXNlIFNPQVBfQklORElOR19VU0VfRURFRkFVTFQgPSBTT0FQQmluZGluZ1VzZS5MSVRFUkFMOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdVc2UoKSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdVc2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU09BUEJpbmRpbmdVc2Ugc29hcEJpbmRpbmdVc2UgPSBTT0FQX0JJTkRJTkdfVVNFX0VERUZBVUxUOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSA8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBTT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFX0VERUZBVUxUID0gU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9IFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEVfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCi0JCXJldHVybiBEb21QYWNrYWdlLkxpdGVyYWxzLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzSW1wbGljaXQoKSB7DQotCQlyZXR1cm4gaW1wbGljaXQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdChib29sZWFuIG5ld0ltcGxpY2l0KSB7DQotCQlib29sZWFuIG9sZEltcGxpY2l0ID0gaW1wbGljaXQ7DQotCQlpbXBsaWNpdCA9IG5ld0ltcGxpY2l0Ow0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCwgb2xkSW1wbGljaXQsIGltcGxpY2l0KSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUxpc3Q8SVdlYlNlcnZpY2U+IGdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkgew0KLQkJaWYgKGltcGxlbWVudGluZ1dlYlNlcnZpY2VzID09IG51bGwpDQotCQl7DQotCQkJaW1wbGVtZW50aW5nV2ViU2VydmljZXMgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q8SVdlYlNlcnZpY2U+KElXZWJTZXJ2aWNlLmNsYXNzLCB0aGlzLCBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUywgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQpOw0KLQkJfQ0KLQkJcmV0dXJuIGltcGxlbWVudGluZ1dlYlNlcnZpY2VzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVMaXN0PElXZWJNZXRob2Q+IGdldFdlYk1ldGhvZHMoKSB7DQotCQlpZiAod2ViTWV0aG9kcyA9PSBudWxsKQ0KLQkJew0KLQkJCXdlYk1ldGhvZHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SVdlYk1ldGhvZD4oSVdlYk1ldGhvZC5jbGFzcywgdGhpcywgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1dFQl9NRVRIT0RTKTsNCi0JCX0NCi0JCXJldHVybiB3ZWJNZXRob2RzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7DQotCQlyZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyBuZXdUYXJnZXROYW1lc3BhY2UpIHsNCi0JCVN0cmluZyBvbGRUYXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7DQotCQl0YXJnZXROYW1lc3BhY2UgPSBuZXdUYXJnZXROYW1lc3BhY2U7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0UsIG9sZFRhcmdldE5hbWVzcGFjZSwgdGFyZ2V0TmFtZXNwYWNlKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU09BUEJpbmRpbmdTdHlsZSBnZXRTb2FwQmluZGluZ1N0eWxlKCkgew0KLQkJcmV0dXJuIHNvYXBCaW5kaW5nU3R5bGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUgbmV3U29hcEJpbmRpbmdTdHlsZSkgew0KLQkJU09BUEJpbmRpbmdTdHlsZSBvbGRTb2FwQmluZGluZ1N0eWxlID0gc29hcEJpbmRpbmdTdHlsZTsNCi0JCXNvYXBCaW5kaW5nU3R5bGUgPSBuZXdTb2FwQmluZGluZ1N0eWxlID09IG51bGwgPyBTT0FQX0JJTkRJTkdfU1RZTEVfRURFRkFVTFQgOiBuZXdTb2FwQmluZGluZ1N0eWxlOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEUsIG9sZFNvYXBCaW5kaW5nU3R5bGUsIHNvYXBCaW5kaW5nU3R5bGUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1VzZSBnZXRTb2FwQmluZGluZ1VzZSgpIHsNCi0JCXJldHVybiBzb2FwQmluZGluZ1VzZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNvYXBCaW5kaW5nVXNlKFNPQVBCaW5kaW5nVXNlIG5ld1NvYXBCaW5kaW5nVXNlKSB7DQotCQlTT0FQQmluZGluZ1VzZSBvbGRTb2FwQmluZGluZ1VzZSA9IHNvYXBCaW5kaW5nVXNlOw0KLQkJc29hcEJpbmRpbmdVc2UgPSBuZXdTb2FwQmluZGluZ1VzZSA9PSBudWxsID8gU09BUF9CSU5ESU5HX1VTRV9FREVGQVVMVCA6IG5ld1NvYXBCaW5kaW5nVXNlOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFLCBvbGRTb2FwQmluZGluZ1VzZSwgc29hcEJpbmRpbmdVc2UpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIGdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSB7DQotCQlyZXR1cm4gc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBuZXdTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKSB7DQotCQlTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIG9sZFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPSBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLQkJc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9IG5ld1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPT0gbnVsbCA/IFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEVfRURFRkFVTFQgOiBuZXdTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFLCBvbGRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlLCBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExFTUVOVElOR19XRUJfU0VSVklDRVM6DQotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikoSW50ZXJuYWxFTGlzdDw/PilnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUzoNCi0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFM6DQotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0V2ViTWV0aG9kcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTElDSVQ6DQotCQkJCXJldHVybiBpc0ltcGxpY2l0KCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUzoNCi0JCQkJcmV0dXJuIGdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFM6DQotCQkJCXJldHVybiBnZXRXZWJNZXRob2RzKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQkJcmV0dXJuIGdldFRhcmdldE5hbWVzcGFjZSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19TVFlMRToNCi0JCQkJcmV0dXJuIGdldFNvYXBCaW5kaW5nU3R5bGUoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFOg0KLQkJCQlyZXR1cm4gZ2V0U29hcEJpbmRpbmdVc2UoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlyZXR1cm4gZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVDoNCi0JCQkJc2V0SW1wbGljaXQoKEJvb2xlYW4pbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUzoNCi0JCQkJZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5jbGVhcigpOw0KLQkJCQlnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSVdlYlNlcnZpY2U+KW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1dFQl9NRVRIT0RTOg0KLQkJCQlnZXRXZWJNZXRob2RzKCkuY2xlYXIoKTsNCi0JCQkJZ2V0V2ViTWV0aG9kcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSVdlYk1ldGhvZD4pbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQkJc2V0VGFyZ2V0TmFtZXNwYWNlKChTdHJpbmcpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFOg0KLQkJCQlzZXRTb2FwQmluZGluZ1N0eWxlKChTT0FQQmluZGluZ1N0eWxlKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0U6DQotCQkJCXNldFNvYXBCaW5kaW5nVXNlKChTT0FQQmluZGluZ1VzZSluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlzZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKChTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTElDSVQ6DQotCQkJCXNldEltcGxpY2l0KElNUExJQ0lUX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExFTUVOVElOR19XRUJfU0VSVklDRVM6DQotCQkJCWdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuY2xlYXIoKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1dFQl9NRVRIT0RTOg0KLQkJCQlnZXRXZWJNZXRob2RzKCkuY2xlYXIoKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJCXNldFRhcmdldE5hbWVzcGFjZShUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19TVFlMRToNCi0JCQkJc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQX0JJTkRJTkdfU1RZTEVfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1VTRToNCi0JCQkJc2V0U29hcEJpbmRpbmdVc2UoU09BUF9CSU5ESU5HX1VTRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlzZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEVfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTElDSVQ6DQotCQkJCXJldHVybiBpbXBsaWNpdCAhPSBJTVBMSUNJVF9FREVGQVVMVDsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTOg0KLQkJCQlyZXR1cm4gaW1wbGVtZW50aW5nV2ViU2VydmljZXMgIT0gbnVsbCAmJiAhaW1wbGVtZW50aW5nV2ViU2VydmljZXMuaXNFbXB0eSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1dFQl9NRVRIT0RTOg0KLQkJCQlyZXR1cm4gd2ViTWV0aG9kcyAhPSBudWxsICYmICF3ZWJNZXRob2RzLmlzRW1wdHkoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlyZXR1cm4gVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCA9PSBudWxsID8gdGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgOiAhVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVC5lcXVhbHModGFyZ2V0TmFtZXNwYWNlKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEU6DQotCQkJCXJldHVybiBzb2FwQmluZGluZ1N0eWxlICE9IFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVDsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFOg0KLQkJCQlyZXR1cm4gc29hcEJpbmRpbmdVc2UgIT0gU09BUF9CSU5ESU5HX1VTRV9FREVGQVVMVDsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlyZXR1cm4gc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSAhPSBTT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFX0VERUZBVUxUOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQotDQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiAoaW1wbGljaXQ6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKGltcGxpY2l0KTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgdGFyZ2V0TmFtZXNwYWNlOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZCh0YXJnZXROYW1lc3BhY2UpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCBzb2FwQmluZGluZ1N0eWxlOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChzb2FwQmluZGluZ1N0eWxlKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgc29hcEJpbmRpbmdVc2U6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHNvYXBCaW5kaW5nVXNlKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQoc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSk7DQotCQlyZXN1bHQuYXBwZW5kKCcpJyk7DQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQotCX0NCi0JDQotCUBPdmVycmlkZSANCi0JcHVibGljIEVPYmplY3QgZUNvbnRhaW5lcigpDQotCXsNCi0JCWlmIChzdXBlci5lQ29udGFpbmVyKCkhPW51bGwpIHsNCi0JCQlyZXR1cm4gc3VwZXIuZUNvbnRhaW5lcigpOw0KLQkJfQ0KLQkJDQotCQlmb3IgKElXZWJTZXJ2aWNlIHdzIDogZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKSkgew0KLQkJCWlmICh3cy5lQ29udGFpbmVyKCkhPW51bGwpIHsNCi0JCQkJcmV0dXJuIHdzLmVDb250YWluZXIoKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotfSAvL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJNZXRob2RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYk1ldGhvZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmJiYTQ5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYk1ldGhvZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsOw0KLQ0KLQ0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2U7DQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SVdlYiBNZXRob2Q8L2I+PC9lbT4nLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIDxwPg0KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KLSAqIDx1bD4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYk1ldGhvZEltcGwjZ2V0UGFyYW1ldGVycyA8ZW0+UGFyYW1ldGVyczwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJNZXRob2RJbXBsI2lzRXhjbHVkZWQgPGVtPkV4Y2x1ZGVkPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYk1ldGhvZEltcGwjZ2V0U29hcEJpbmRpbmdTdHlsZSA8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYk1ldGhvZEltcGwjZ2V0U29hcEJpbmRpbmdVc2UgPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViTWV0aG9kSW1wbCNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59PC9saT4NCi0gKiA8L3VsPg0KLSAqIDwvcD4NCi0gKg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSVdlYk1ldGhvZEltcGwgZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbCBpbXBsZW1lbnRzIElXZWJNZXRob2Qgew0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1ldGVycygpIDxlbT5QYXJhbWV0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFBhcmFtZXRlcnMoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgRUxpc3Q8SVdlYlBhcmFtPiBwYXJhbWV0ZXJzOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhjbHVkZWQoKSA8ZW0+RXhjbHVkZWQ8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2lzRXhjbHVkZWQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRVhDTFVERURfRURFRkFVTFQgPSBmYWxzZTsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhjbHVkZWQoKSA8ZW0+RXhjbHVkZWQ8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2lzRXhjbHVkZWQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGNsdWRlZCA9IEVYQ0xVREVEX0VERUZBVUxUOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBCaW5kaW5nU3R5bGUoKSA8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1N0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTT0FQQmluZGluZ1N0eWxlIFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVCA9IFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQ7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1N0eWxlKCkgPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdTdHlsZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTT0FQQmluZGluZ1N0eWxlIHNvYXBCaW5kaW5nU3R5bGUgPSBTT0FQX0JJTkRJTkdfU1RZTEVfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdVc2UoKSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdVc2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFNPQVBCaW5kaW5nVXNlIFNPQVBfQklORElOR19VU0VfRURFRkFVTFQgPSBTT0FQQmluZGluZ1VzZS5MSVRFUkFMOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdVc2UoKSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdVc2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU09BUEJpbmRpbmdVc2Ugc29hcEJpbmRpbmdVc2UgPSBTT0FQX0JJTkRJTkdfVVNFX0VERUZBVUxUOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSA8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBTT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFX0VERUZBVUxUID0gU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9IFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEVfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElXZWJNZXRob2RJbXBsKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCi0JCXJldHVybiBEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfTUVUSE9EOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVMaXN0PElXZWJQYXJhbT4gZ2V0UGFyYW1ldGVycygpIHsNCi0JCWlmIChwYXJhbWV0ZXJzID09IG51bGwpDQotCQl7DQotCQkJcGFyYW1ldGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxJV2ViUGFyYW0+KElXZWJQYXJhbS5jbGFzcywgdGhpcywgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fUEFSQU1FVEVSUyk7DQotCQl9DQotCQlyZXR1cm4gcGFyYW1ldGVyczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzRXhjbHVkZWQoKSB7DQotCQlyZXR1cm4gZXhjbHVkZWQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRFeGNsdWRlZChib29sZWFuIG5ld0V4Y2x1ZGVkKSB7DQotCQlib29sZWFuIG9sZEV4Y2x1ZGVkID0gZXhjbHVkZWQ7DQotCQlleGNsdWRlZCA9IG5ld0V4Y2x1ZGVkOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX0VYQ0xVREVELCBvbGRFeGNsdWRlZCwgZXhjbHVkZWQpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1N0eWxlIGdldFNvYXBCaW5kaW5nU3R5bGUoKSB7DQotCQlyZXR1cm4gc29hcEJpbmRpbmdTdHlsZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZSBuZXdTb2FwQmluZGluZ1N0eWxlKSB7DQotCQlTT0FQQmluZGluZ1N0eWxlIG9sZFNvYXBCaW5kaW5nU3R5bGUgPSBzb2FwQmluZGluZ1N0eWxlOw0KLQkJc29hcEJpbmRpbmdTdHlsZSA9IG5ld1NvYXBCaW5kaW5nU3R5bGUgPT0gbnVsbCA/IFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVCA6IG5ld1NvYXBCaW5kaW5nU3R5bGU7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1NUWUxFLCBvbGRTb2FwQmluZGluZ1N0eWxlLCBzb2FwQmluZGluZ1N0eWxlKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU09BUEJpbmRpbmdVc2UgZ2V0U29hcEJpbmRpbmdVc2UoKSB7DQotCQlyZXR1cm4gc29hcEJpbmRpbmdVc2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRTb2FwQmluZGluZ1VzZShTT0FQQmluZGluZ1VzZSBuZXdTb2FwQmluZGluZ1VzZSkgew0KLQkJU09BUEJpbmRpbmdVc2Ugb2xkU29hcEJpbmRpbmdVc2UgPSBzb2FwQmluZGluZ1VzZTsNCi0JCXNvYXBCaW5kaW5nVXNlID0gbmV3U29hcEJpbmRpbmdVc2UgPT0gbnVsbCA/IFNPQVBfQklORElOR19VU0VfRURFRkFVTFQgOiBuZXdTb2FwQmluZGluZ1VzZTsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfVVNFLCBvbGRTb2FwQmluZGluZ1VzZSwgc29hcEJpbmRpbmdVc2UpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIGdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSB7DQotCQlyZXR1cm4gc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBuZXdTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKSB7DQotCQlTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIG9sZFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPSBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLQkJc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9IG5ld1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPT0gbnVsbCA/IFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEVfRURFRkFVTFQgOiBuZXdTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUsIG9sZFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUsIHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1BBUkFNRVRFUlM6DQotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UGFyYW1ldGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19QQVJBTUVURVJTOg0KLQkJCQlyZXR1cm4gZ2V0UGFyYW1ldGVycygpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fRVhDTFVERUQ6DQotCQkJCXJldHVybiBpc0V4Y2x1ZGVkKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEU6DQotCQkJCXJldHVybiBnZXRTb2FwQmluZGluZ1N0eWxlKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfVVNFOg0KLQkJCQlyZXR1cm4gZ2V0U29hcEJpbmRpbmdVc2UoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXJldHVybiBnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fUEFSQU1FVEVSUzoNCi0JCQkJZ2V0UGFyYW1ldGVycygpLmNsZWFyKCk7DQotCQkJCWdldFBhcmFtZXRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElXZWJQYXJhbT4pbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19FWENMVURFRDoNCi0JCQkJc2V0RXhjbHVkZWQoKEJvb2xlYW4pbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEU6DQotCQkJCXNldFNvYXBCaW5kaW5nU3R5bGUoKFNPQVBCaW5kaW5nU3R5bGUpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfVVNFOg0KLQkJCQlzZXRTb2FwQmluZGluZ1VzZSgoU09BUEJpbmRpbmdVc2UpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlzZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKChTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19QQVJBTUVURVJTOg0KLQkJCQlnZXRQYXJhbWV0ZXJzKCkuY2xlYXIoKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fRVhDTFVERUQ6DQotCQkJCXNldEV4Y2x1ZGVkKEVYQ0xVREVEX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1NUWUxFOg0KLQkJCQlzZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0U6DQotCQkJCXNldFNvYXBCaW5kaW5nVXNlKFNPQVBfQklORElOR19VU0VfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlzZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEVfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19QQVJBTUVURVJTOg0KLQkJCQlyZXR1cm4gcGFyYW1ldGVycyAhPSBudWxsICYmICFwYXJhbWV0ZXJzLmlzRW1wdHkoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX0VYQ0xVREVEOg0KLQkJCQlyZXR1cm4gZXhjbHVkZWQgIT0gRVhDTFVERURfRURFRkFVTFQ7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEU6DQotCQkJCXJldHVybiBzb2FwQmluZGluZ1N0eWxlICE9IFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVDsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0U6DQotCQkJCXJldHVybiBzb2FwQmluZGluZ1VzZSAhPSBTT0FQX0JJTkRJTkdfVVNFX0VERUZBVUxUOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRToNCi0JCQkJcmV0dXJuIHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgIT0gU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRV9FREVGQVVMVDsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOw0KLQ0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7DQotCQlyZXN1bHQuYXBwZW5kKCIgKGV4Y2x1ZGVkOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChleGNsdWRlZCk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHNvYXBCaW5kaW5nU3R5bGU6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHNvYXBCaW5kaW5nU3R5bGUpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCBzb2FwQmluZGluZ1VzZTogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQoc29hcEJpbmRpbmdVc2UpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKTsNCi0JCXJlc3VsdC5hcHBlbmQoJyknKTsNCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLX0gLy9JV2ViTWV0aG9kSW1wbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViUGFyYW1JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYlBhcmFtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MTUwNGU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViUGFyYW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbDsNCi0NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQ7DQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SVdlYiBQYXJhbTwvYj48L2VtPicuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogPHA+DQotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQotICogPHVsPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViUGFyYW1JbXBsI2dldEtpbmQgPGVtPktpbmQ8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViUGFyYW1JbXBsI2dldFR5cGVOYW1lIDxlbT5UeXBlIE5hbWU8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViUGFyYW1JbXBsI2dldFBhcnROYW1lIDxlbT5QYXJ0IE5hbWU8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViUGFyYW1JbXBsI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJQYXJhbUltcGwjaXNIZWFkZXIgPGVtPkhlYWRlcjwvZW0+fTwvbGk+DQotICogPC91bD4NCi0gKiA8L3A+DQotICoNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElXZWJQYXJhbUltcGwgZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbCBpbXBsZW1lbnRzIElXZWJQYXJhbSB7DQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2luZCgpIDxlbT5LaW5kPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRLaW5kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBXZWJQYXJhbUtpbmQgS0lORF9FREVGQVVMVCA9IFdlYlBhcmFtS2luZC5JTjsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtpbmQoKSA8ZW0+S2luZDwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0S2luZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBXZWJQYXJhbUtpbmQga2luZCA9IEtJTkRfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZU5hbWUoKSA8ZW0+VHlwZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRUeXBlTmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTkFNRV9FREVGQVVMVCA9IG51bGw7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlTmFtZSgpIDxlbT5UeXBlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFR5cGVOYW1lKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlTmFtZSA9IFRZUEVfTkFNRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJ0TmFtZSgpIDxlbT5QYXJ0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFBhcnROYW1lKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9OQU1FX0VERUZBVUxUID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnROYW1lKCkgPGVtPlBhcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0UGFydE5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcnROYW1lID0gUEFSVF9OQU1FX0VERUZBVUxUOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldE5hbWVzcGFjZSgpIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldE5hbWVzcGFjZSgpIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIZWFkZXIoKSA8ZW0+SGVhZGVyPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNpc0hlYWRlcigpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBIRUFERVJfRURFRkFVTFQgPSBmYWxzZTsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSGVhZGVyKCkgPGVtPkhlYWRlcjwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjaXNIZWFkZXIoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoZWFkZXIgPSBIRUFERVJfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElXZWJQYXJhbUltcGwoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KLQkJcmV0dXJuIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBXZWJQYXJhbUtpbmQgZ2V0S2luZCgpIHsNCi0JCXJldHVybiBraW5kOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0S2luZChXZWJQYXJhbUtpbmQgbmV3S2luZCkgew0KLQkJV2ViUGFyYW1LaW5kIG9sZEtpbmQgPSBraW5kOw0KLQkJa2luZCA9IG5ld0tpbmQgPT0gbnVsbCA/IEtJTkRfRURFRkFVTFQgOiBuZXdLaW5kOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fS0lORCwgb2xkS2luZCwga2luZCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsNCi0JCXJldHVybiB0eXBlTmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFR5cGVOYW1lKFN0cmluZyBuZXdUeXBlTmFtZSkgew0KLQkJU3RyaW5nIG9sZFR5cGVOYW1lID0gdHlwZU5hbWU7DQotCQl0eXBlTmFtZSA9IG5ld1R5cGVOYW1lOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVFlQRV9OQU1FLCBvbGRUeXBlTmFtZSwgdHlwZU5hbWUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydE5hbWUoKSB7DQotCQlyZXR1cm4gcGFydE5hbWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0TmFtZShTdHJpbmcgbmV3UGFydE5hbWUpIHsNCi0JCVN0cmluZyBvbGRQYXJ0TmFtZSA9IHBhcnROYW1lOw0KLQkJcGFydE5hbWUgPSBuZXdQYXJ0TmFtZTsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1BBUlRfTkFNRSwgb2xkUGFydE5hbWUsIHBhcnROYW1lKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsNCi0JCXJldHVybiB0YXJnZXROYW1lc3BhY2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIG5ld1RhcmdldE5hbWVzcGFjZSkgew0KLQkJU3RyaW5nIG9sZFRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsNCi0JCXRhcmdldE5hbWVzcGFjZSA9IG5ld1RhcmdldE5hbWVzcGFjZTsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UsIG9sZFRhcmdldE5hbWVzcGFjZSwgdGFyZ2V0TmFtZXNwYWNlKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc0hlYWRlcigpIHsNCi0JCXJldHVybiBoZWFkZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRIZWFkZXIoYm9vbGVhbiBuZXdIZWFkZXIpIHsNCi0JCWJvb2xlYW4gb2xkSGVhZGVyID0gaGVhZGVyOw0KLQkJaGVhZGVyID0gbmV3SGVhZGVyOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fSEVBREVSLCBvbGRIZWFkZXIsIGhlYWRlcikpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19LSU5EOg0KLQkJCQlyZXR1cm4gZ2V0S2luZCgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19UWVBFX05BTUU6DQotCQkJCXJldHVybiBnZXRUeXBlTmFtZSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19QQVJUX05BTUU6DQotCQkJCXJldHVybiBnZXRQYXJ0TmFtZSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlyZXR1cm4gZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0hFQURFUjoNCi0JCQkJcmV0dXJuIGlzSGVhZGVyKCk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0tJTkQ6DQotCQkJCXNldEtpbmQoKFdlYlBhcmFtS2luZCluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVFlQRV9OQU1FOg0KLQkJCQlzZXRUeXBlTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19QQVJUX05BTUU6DQotCQkJCXNldFBhcnROYW1lKChTdHJpbmcpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJCXNldFRhcmdldE5hbWVzcGFjZSgoU3RyaW5nKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19IRUFERVI6DQotCQkJCXNldEhlYWRlcigoQm9vbGVhbiluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19LSU5EOg0KLQkJCQlzZXRLaW5kKEtJTkRfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1RZUEVfTkFNRToNCi0JCQkJc2V0VHlwZU5hbWUoVFlQRV9OQU1FX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19QQVJUX05BTUU6DQotCQkJCXNldFBhcnROYW1lKFBBUlRfTkFNRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQkJc2V0VGFyZ2V0TmFtZXNwYWNlKFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0hFQURFUjoNCi0JCQkJc2V0SGVhZGVyKEhFQURFUl9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fS0lORDoNCi0JCQkJcmV0dXJuIGtpbmQgIT0gS0lORF9FREVGQVVMVDsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVFlQRV9OQU1FOg0KLQkJCQlyZXR1cm4gVFlQRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyB0eXBlTmFtZSAhPSBudWxsIDogIVRZUEVfTkFNRV9FREVGQVVMVC5lcXVhbHModHlwZU5hbWUpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19QQVJUX05BTUU6DQotCQkJCXJldHVybiBQQVJUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHBhcnROYW1lICE9IG51bGwgOiAhUEFSVF9OQU1FX0VERUZBVUxULmVxdWFscyhwYXJ0TmFtZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJCXJldHVybiBUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUID09IG51bGwgPyB0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCA6ICFUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxULmVxdWFscyh0YXJnZXROYW1lc3BhY2UpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19IRUFERVI6DQotCQkJCXJldHVybiBoZWFkZXIgIT0gSEVBREVSX0VERUZBVUxUOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQotDQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiAoa2luZDogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQoa2luZCk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGVOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZCh0eXBlTmFtZSk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHBhcnROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChwYXJ0TmFtZSk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHRhcmdldE5hbWVzcGFjZTogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQodGFyZ2V0TmFtZXNwYWNlKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgaGVhZGVyOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChoZWFkZXIpOw0KLQkJcmVzdWx0LmFwcGVuZCgnKScpOw0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KLQl9DQotDQotfSAvL0lXZWJQYXJhbUltcGwNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYlNlcnZpY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYlNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRlODQ1ZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGw7DQotDQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JV2ViIFNlcnZpY2U8L2I+PC9lbT4nLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIDxwPg0KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KLSAqIDx1bD4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VJbXBsI2dldFNlcnZpY2VFbmRwb2ludCA8ZW0+U2VydmljZSBFbmRwb2ludDwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlSW1wbCNnZXRUYXJnZXROYW1lc3BhY2UgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZUltcGwjZ2V0UG9ydE5hbWUgPGVtPlBvcnQgTmFtZTwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlSW1wbCNnZXRXc2RsTG9jYXRpb24gPGVtPldzZGwgTG9jYXRpb248L2VtPn08L2xpPg0KLSAqIDwvdWw+DQotICogPC9wPg0KLSAqDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJV2ViU2VydmljZUltcGwgZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbCBpbXBsZW1lbnRzIElXZWJTZXJ2aWNlIHsNCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VFbmRwb2ludCgpIDxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT59JyByZWZlcmVuY2UuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZXJ2aWNlRW5kcG9pbnQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQgPSBudWxsOw0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVDsNCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0TmFtZSgpIDxlbT5Qb3J0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFBvcnROYW1lKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9OQU1FX0VERUZBVUxUID0gbnVsbDsNCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnROYW1lKCkgPGVtPlBvcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0UG9ydE5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvcnROYW1lID0gUE9SVF9OQU1FX0VERUZBVUxUOw0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxMb2NhdGlvbigpIDxlbT5Xc2RsIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRXc2RsTG9jYXRpb24oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0xPQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsNCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxMb2NhdGlvbigpIDxlbT5Xc2RsIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRXc2RsTG9jYXRpb24oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IFdTRExfTE9DQVRJT05fRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlSW1wbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQotCQlyZXR1cm4gRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0U7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBnZXRTZXJ2aWNlRW5kcG9pbnQoKSB7DQotCQlpZiAoc2VydmljZUVuZHBvaW50ICE9IG51bGwgJiYgc2VydmljZUVuZHBvaW50LmVJc1Byb3h5KCkpDQotCQl7DQotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFNlcnZpY2VFbmRwb2ludCA9IChJbnRlcm5hbEVPYmplY3Qpc2VydmljZUVuZHBvaW50Ow0KLQkJCXNlcnZpY2VFbmRwb2ludCA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKWVSZXNvbHZlUHJveHkob2xkU2VydmljZUVuZHBvaW50KTsNCi0JCQlpZiAoc2VydmljZUVuZHBvaW50ICE9IG9sZFNlcnZpY2VFbmRwb2ludCkNCi0JCQl7DQotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVCwgb2xkU2VydmljZUVuZHBvaW50LCBzZXJ2aWNlRW5kcG9pbnQpKTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50Ow0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgYmFzaWNHZXRTZXJ2aWNlRW5kcG9pbnQoKSB7DQotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50Ow0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U2VydmljZUVuZHBvaW50KElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgbmV3U2VydmljZUVuZHBvaW50LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIG9sZFNlcnZpY2VFbmRwb2ludCA9IHNlcnZpY2VFbmRwb2ludDsNCi0JCXNlcnZpY2VFbmRwb2ludCA9IG5ld1NlcnZpY2VFbmRwb2ludDsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCXsNCi0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQsIG9sZFNlcnZpY2VFbmRwb2ludCwgbmV3U2VydmljZUVuZHBvaW50KTsNCi0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7DQotCQl9DQotCQlyZXR1cm4gbXNnczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VFbmRwb2ludChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIG5ld1NlcnZpY2VFbmRwb2ludCkgew0KLQkJaWYgKG5ld1NlcnZpY2VFbmRwb2ludCAhPSBzZXJ2aWNlRW5kcG9pbnQpDQotCQl7DQotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7DQotCQkJaWYgKHNlcnZpY2VFbmRwb2ludCAhPSBudWxsKQ0KLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc2VydmljZUVuZHBvaW50KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUywgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcywgbXNncyk7DQotCQkJaWYgKG5ld1NlcnZpY2VFbmRwb2ludCAhPSBudWxsKQ0KLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U2VydmljZUVuZHBvaW50KS5lSW52ZXJzZUFkZCh0aGlzLCBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUywgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcywgbXNncyk7DQotCQkJbXNncyA9IGJhc2ljU2V0U2VydmljZUVuZHBvaW50KG5ld1NlcnZpY2VFbmRwb2ludCwgbXNncyk7DQotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOw0KLQkJfQ0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQsIG5ld1NlcnZpY2VFbmRwb2ludCwgbmV3U2VydmljZUVuZHBvaW50KSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsNCi0JCXJldHVybiB0YXJnZXROYW1lc3BhY2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIG5ld1RhcmdldE5hbWVzcGFjZSkgew0KLQkJU3RyaW5nIG9sZFRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsNCi0JCXRhcmdldE5hbWVzcGFjZSA9IG5ld1RhcmdldE5hbWVzcGFjZTsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fVEFSR0VUX05BTUVTUEFDRSwgb2xkVGFyZ2V0TmFtZXNwYWNlLCB0YXJnZXROYW1lc3BhY2UpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydE5hbWUoKSB7DQotCQlyZXR1cm4gcG9ydE5hbWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRQb3J0TmFtZShTdHJpbmcgbmV3UG9ydE5hbWUpIHsNCi0JCVN0cmluZyBvbGRQb3J0TmFtZSA9IHBvcnROYW1lOw0KLQkJcG9ydE5hbWUgPSBuZXdQb3J0TmFtZTsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fUE9SVF9OQU1FLCBvbGRQb3J0TmFtZSwgcG9ydE5hbWUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0V3NkbExvY2F0aW9uKCkgew0KLQkJcmV0dXJuIHdzZGxMb2NhdGlvbjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFdzZGxMb2NhdGlvbihTdHJpbmcgbmV3V3NkbExvY2F0aW9uKSB7DQotCQlTdHJpbmcgb2xkV3NkbExvY2F0aW9uID0gd3NkbExvY2F0aW9uOw0KLQkJd3NkbExvY2F0aW9uID0gbmV3V3NkbExvY2F0aW9uOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OLCBvbGRXc2RsTG9jYXRpb24sIHdzZGxMb2NhdGlvbikpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQ6DQotCQkJCWlmIChzZXJ2aWNlRW5kcG9pbnQgIT0gbnVsbCkNCi0JCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzZXJ2aWNlRW5kcG9pbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCBtc2dzKTsNCi0JCQkJcmV0dXJuIGJhc2ljU2V0U2VydmljZUVuZHBvaW50KChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKW90aGVyRW5kLCBtc2dzKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UOg0KLQkJCQlyZXR1cm4gYmFzaWNTZXRTZXJ2aWNlRW5kcG9pbnQobnVsbCwgbXNncyk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVDoNCi0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTZXJ2aWNlRW5kcG9pbnQoKTsNCi0JCQkJcmV0dXJuIGJhc2ljR2V0U2VydmljZUVuZHBvaW50KCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQkJcmV0dXJuIGdldFRhcmdldE5hbWVzcGFjZSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRToNCi0JCQkJcmV0dXJuIGdldFBvcnROYW1lKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fV1NETF9MT0NBVElPTjoNCi0JCQkJcmV0dXJuIGdldFdzZGxMb2NhdGlvbigpOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQ6DQotCQkJCXNldFNlcnZpY2VFbmRwb2ludCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlzZXRUYXJnZXROYW1lc3BhY2UoKFN0cmluZyluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19QT1JUX05BTUU6DQotCQkJCXNldFBvcnROYW1lKChTdHJpbmcpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fV1NETF9MT0NBVElPTjoNCi0JCQkJc2V0V3NkbExvY2F0aW9uKChTdHJpbmcpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UOg0KLQkJCQlzZXRTZXJ2aWNlRW5kcG9pbnQoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpbnVsbCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlzZXRUYXJnZXROYW1lc3BhY2UoVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19QT1JUX05BTUU6DQotCQkJCXNldFBvcnROYW1lKFBPUlRfTkFNRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OOg0KLQkJCQlzZXRXc2RsTG9jYXRpb24oV1NETF9MT0NBVElPTl9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UOg0KLQkJCQlyZXR1cm4gc2VydmljZUVuZHBvaW50ICE9IG51bGw7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQkJcmV0dXJuIFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHRhcmdldE5hbWVzcGFjZSAhPSBudWxsIDogIVRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQuZXF1YWxzKHRhcmdldE5hbWVzcGFjZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fUE9SVF9OQU1FOg0KLQkJCQlyZXR1cm4gUE9SVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwb3J0TmFtZSAhPSBudWxsIDogIVBPUlRfTkFNRV9FREVGQVVMVC5lcXVhbHMocG9ydE5hbWUpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT046DQotCQkJCXJldHVybiBXU0RMX0xPQ0FUSU9OX0VERUZBVUxUID09IG51bGwgPyB3c2RsTG9jYXRpb24gIT0gbnVsbCA6ICFXU0RMX0xPQ0FUSU9OX0VERUZBVUxULmVxdWFscyh3c2RsTG9jYXRpb24pOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQotDQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiAodGFyZ2V0TmFtZXNwYWNlOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZCh0YXJnZXROYW1lc3BhY2UpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCBwb3J0TmFtZTogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQocG9ydE5hbWUpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCB3c2RsTG9jYXRpb246ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHdzZGxMb2NhdGlvbik7DQotCQlyZXN1bHQuYXBwZW5kKCcpJyk7DQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQotCX0NCi0NCi19IC8vSVdlYlNlcnZpY2VJbXBsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJTZXJ2aWNlUHJvamVjdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViU2VydmljZVByb2plY3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDliMTNmM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJTZXJ2aWNlUHJvamVjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2I+PC9lbT4nLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIDxwPg0KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KLSAqIDx1bD4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VQcm9qZWN0SW1wbCNnZXRXZWJTZXJ2aWNlcyA8ZW0+V2ViIFNlcnZpY2VzPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VQcm9qZWN0SW1wbCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXM8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZVByb2plY3RJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPg0KLSAqIDwvdWw+DQotICogPC9wPg0KLSAqDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJV2ViU2VydmljZVByb2plY3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBJV2ViU2VydmljZVByb2plY3Qgew0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2ViU2VydmljZXMoKSA8ZW0+V2ViIFNlcnZpY2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VzKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIEVMaXN0PElXZWJTZXJ2aWNlPiB3ZWJTZXJ2aWNlczsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgRUxpc3Q8SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZT4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlczsNCi0NCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldE5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlUHJvamVjdEltcGwoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KLQkJcmV0dXJuIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX1BST0pFQ1Q7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUxpc3Q8SVdlYlNlcnZpY2U+IGdldFdlYlNlcnZpY2VzKCkgew0KLQkJaWYgKHdlYlNlcnZpY2VzID09IG51bGwpDQotCQl7DQotCQkJd2ViU2VydmljZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SVdlYlNlcnZpY2U+KElXZWJTZXJ2aWNlLmNsYXNzLCB0aGlzLCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVMpOw0KLQkJfQ0KLQkJcmV0dXJuIHdlYlNlcnZpY2VzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVMaXN0PElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+IGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSB7DQotCQlpZiAoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlcyA9PSBudWxsKQ0KLQkJew0KLQkJCXNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZT4oSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcywgdGhpcywgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTKTsNCi0JCX0NCi0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLQkJcmV0dXJuIG5hbWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7DQotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7DQotCQluYW1lID0gbmV3TmFtZTsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVM6DQotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0V2ViU2VydmljZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTOg0KLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTOg0KLQkJCQlyZXR1cm4gZ2V0V2ViU2VydmljZXMoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFUzoNCi0JCQkJcmV0dXJuIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUU6DQotCQkJCXJldHVybiBnZXROYW1lKCk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTOg0KLQkJCQlnZXRXZWJTZXJ2aWNlcygpLmNsZWFyKCk7DQotCQkJCWdldFdlYlNlcnZpY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJV2ViU2VydmljZT4pbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVM6DQotCQkJCWdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKS5jbGVhcigpOw0KLQkJCQlnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPiluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUU6DQotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTOg0KLQkJCQlnZXRXZWJTZXJ2aWNlcygpLmNsZWFyKCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFUzoNCi0JCQkJZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLmNsZWFyKCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUU6DQotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1dFQl9TRVJWSUNFUzoNCi0JCQkJcmV0dXJuIHdlYlNlcnZpY2VzICE9IG51bGwgJiYgIXdlYlNlcnZpY2VzLmlzRW1wdHkoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFUzoNCi0JCQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMgIT0gbnVsbCAmJiAhc2VydmljZUVuZHBvaW50SW50ZXJmYWNlcy5pc0VtcHR5KCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FOg0KLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQotDQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQobmFtZSk7DQotCQlyZXN1bHQuYXBwZW5kKCcpJyk7DQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQotCX0NCi0NCi19IC8vSVdlYlNlcnZpY2VQcm9qZWN0SW1wbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViVHlwZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTFjNTk4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYlR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsOw0KLQ0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlR5cGU7DQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SVdlYiBUeXBlPC9iPjwvZW0+Jy4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiA8cD4NCi0gKiA8L3A+DQotICoNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElXZWJUeXBlSW1wbCBleHRlbmRzIElKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgSVdlYlR5cGUgew0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBJV2ViVHlwZUltcGwoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KLQkJcmV0dXJuIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9UWVBFOw0KLQl9DQotDQotfSAvL0lXZWJUeXBlSW1wbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvcGx1Z2luL0pheFdzRG9tUnVudGltZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3BsdWdpbi9KYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OWFmMTEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvcGx1Z2luL0pheFdzRG9tUnVudGltZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW47DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7DQotDQotcHVibGljIGNsYXNzIEpheFdzRG9tUnVudGltZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4ubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkDQotCQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdENsYXNzTm90SW1wbGVtZW50ZWRFeGNlcHRpb25fRXJyb3JfTWVzc2FnZTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uc3RydWN0b3JOb3RFeHBvc2FibGVFeGNlcHRpb25fRXJyb3JfTWVzc2FnZTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfQklOQVJZQ0xBU1M7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZHBvaW50VHlwZVZhbGlkYXRvcl9FUlJfTVNHX05PVENMQVNTOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmRwb2ludFR5cGVWYWxpZGF0b3JfRVJSX01TR19BQlNUUkFDVDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfQ09OU1RSVUNUT1I7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZHBvaW50VHlwZVZhbGlkYXRvcl9FUlJfTVNHX05PVFBVQkxJQzsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfRklOQUw7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZHBvaW50VHlwZVZhbGlkYXRvcl9FUlJfTVNHX0hBU0ZJTkFMWVpFOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIYXNJbmFkbWlzYWJsZUlubmVyVHlwZXNFeGNlcHRpb25fRXJyb3JfTWVzc2FnZTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5oZXJpdGFuY2VBbmRJbXBsZW1lbnRhdGlvbkV4ZWNwdGlvbl9FcnJvcl9NZXNzYWdlOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnRlcmZhY2VzTm90U3VwcG9ydGVkRXhjZXB0aW9uX0Vycm9yX01lc3NhZ2U7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZE5vdFB1YmxpY0V4Y2VwdGlvbl9FcnJvcl9NZXNzYWdlOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNdWx0aXBsZUltcGxlbWVudGF0aW9uRXhjZXB0aW9uX0Vycm9yX01lc3NhZ2U7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW90ZU9iamVjdEV4Y2VwdGlvbl9FcnJvcl9NZXNzYWdlOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXc0RvbVN0YXJ0dXBQYXJ0aWNpcGFudF9TdGFydHVwX0pvYl9NZXNzYWdlOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3Jrc3BhY2VDVUZpbmRlcl9MT0FESU5HX0NBTkNFTEVEOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19ET01fTE9BRElORzsNCi0JDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yX01FVEhPRF9OT1RfRk9VTkQ7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yX01FVEhPRF9IQVNESUZGRVJFTlRfRVhDRVBUSU9OUzsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3JfTUVUSE9EX05PVF9QVUJMSUM7DQotCQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWlWYWxpZGF0b3JfTk9UX0NPTVBJTEFUSU9OVU5JVF9NU0c7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlaVZhbGlkYXRvcl9OT1RfSU5URVJGQUNFX01TRzsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VpVmFsaWRhdG9yX05PVF9PVVRFUl9NU0c7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlaVZhbGlkYXRvcl9OT1RfUFVCTElDX01TRzsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHlwZU5vdEZvdW5kRXhjZXB0aW9uX0Vycm9yX01lc3NhZ2U7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldE5zVmFsaWRVcmlDb25zdHJhaW50X1VSSV9TWU5UQVhfRVJST1I7DQotCQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb21WYWxpZGF0aW9uQ29uc3RyYWludERlc2NyaXB0b3JfV1NfRE9NX1ZBTElEQVRJT05fQ09OU1RSQUlOVDsNCi0NCi0JDQotCXN0YXRpYyB7DQotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQ0KLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuY2xhc3MpOw0KLQl9DQotDQotCXByaXZhdGUgSmF4V3NEb21SdW50aW1lTWVzc2FnZXMoKSB7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vSmF4V3NEb21SdW50aW1lUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3BsdWdpbi9KYXhXc0RvbVJ1bnRpbWVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTlmOGZkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3BsdWdpbi9KYXhXc0RvbVJ1bnRpbWVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsNCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7DQotDQotLyoqDQotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlDQotICovDQotcHVibGljIGNsYXNzIEpheFdzRG9tUnVudGltZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7DQotDQotCS8vIFRoZSBwbHVnLWluIElEDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiOw0KLQ0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlDQotCXByaXZhdGUgc3RhdGljIEpheFdzRG9tUnVudGltZVBsdWdpbiBwbHVnaW47DQotCQ0KLQkvKioNCi0JICogVGhlIGNvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgSmF4V3NEb21SdW50aW1lUGx1Z2luKCkgew0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2lucyNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlzdXBlci5zdGFydChjb250ZXh0KTsNCi0JCXBsdWdpbiA9IHRoaXM7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXBsdWdpbiA9IG51bGw7DQotCQlzdXBlci5zdG9wKGNvbnRleHQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JICoNCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEpheFdzRG9tUnVudGltZVBsdWdpbiBnZXREZWZhdWx0KCkgew0KLQkJcmV0dXJuIHBsdWdpbjsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3BsdWdpbi9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDUxOTc1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3BsdWdpbi9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLUFic3RyYWN0Q2xhc3NOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbl9FcnJvcl9NZXNzYWdlPUFic3RyYWN0IGNsYXNzIHswfSBjYW5ub3QgYmUgdXNlZCBhcyBydW50aW1lIGNsYXNzIGJlY2F1c2UgaXQgaXMgbm90IGV4dGVuZGVkIGJ5IG5vbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBpcyBzdWl0YWJsZSBmb3IgYSBydW50aW1lIGNsYXNzDQotQ29uc3RydWN0b3JOb3RFeHBvc2FibGVFeGNlcHRpb25fRXJyb3JfTWVzc2FnZT1Db25zdHJ1Y3RvciB7MH0gY2Fubm90IGJlIGV4cG9zZWQgYXMgd2ViIHNlcnZpY2Ugb3BlcmF0aW9uDQotRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfQklOQVJZQ0xBU1MJPSBDbGFzcyB7MH0gaXMgYmluYXJ5IGNsYXNzIGFuZCBjYW5ub3QgYmUgYW5ub3RhdGVkDQotRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfTk9UQ0xBU1MJCT0gezB9IGlzIG5vdCBhIGNsYXNzDQotRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfQUJTVFJBQ1QJCT0gQ2xhc3MgezB9IGlzIGFic3RyYWN0DQotRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfQ09OU1RSVUNUT1IJPSBDbGFzcyB7MH0gZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3INCi1FbmRwb2ludFR5cGVWYWxpZGF0b3JfRVJSX01TR19OT1RQVUJMSUMJCT0gQ2xhc3MgezB9IGlzIG5vdCBwdWJsaWMgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIHdlYiBzZXJ2aWNlIGVuZHBvaW50DQotRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfRklOQUwJCQk9IENsYXNzIHswfSBpcyBmaW5hbCBhbmQgY2Fubm90IGJlIHVzZWQgYXMgd2ViIHNlcnZpY2UgZW5kcG9pbnQNCi1FbmRwb2ludFR5cGVWYWxpZGF0b3JfRVJSX01TR19IQVNGSU5BTFlaRQk9IENsYXNzIHswfSBjb250YWlucyBmaW5hbGl6ZSgpIG1ldGhvZCBhbmQgY2Fubm90IGJlIHVzZWQgYXMgd2ViIHNlcnZpY2UgZW5kcG9pbnQNCi1IYXNJbmFkbWlzYWJsZUlubmVyVHlwZXNFeGNlcHRpb25fRXJyb3JfTWVzc2FnZT1DbGFzcyB7MH0gaGFzIGlubmVyIHR5cGVzIHRoYXQgYXJlIG5vdCBwdWJsaWMgYW5kIHN0YXRpYw0KLUluaGVyaXRhbmNlQW5kSW1wbGVtZW50YXRpb25FeGVjcHRpb25fRXJyb3JfTWVzc2FnZT1DbGFzcyB7MH0gZXh0ZW5kcyB7MX0gYW5kIGltcGxlbWVudHMgY3VzdG9tIGludGVyZmFjZSAobXVsdGlwbGUgaW5oZXJpdGFuY2UgaXMgbm90IGFsbG93ZWQpDQotSW50ZXJmYWNlc05vdFN1cHBvcnRlZEV4Y2VwdGlvbl9FcnJvcl9NZXNzYWdlPXswfSBpcyBhIGludGVyZmFjZSwgYW5kIEpBWEIgY2Fubm90IGhhbmRsZSBpbnRlcmZhY2VzDQotTWV0aG9kTm90UHVibGljRXhjZXB0aW9uX0Vycm9yX01lc3NhZ2U9TWV0aG9kIHswfSBpcyBub3QgcHVibGljIGFuZCBjYW5ub3QgYmUgZXhwb3NlZCBhcyBhIHdlYiBzZXJ2aWNlIG9wZXJhdGlvbg0KLU11bHRpcGxlSW1wbGVtZW50YXRpb25FeGNlcHRpb25fRXJyb3JfTWVzc2FnZT1DbGFzcyB7MH0gaW1wbGVtZW50cyBib3RoIGludGVyZmFjZSB7MX0gYW5kIGludGVyZmFjZSB7Mn0gKG11bHRpcGxlIGluaGVyaXRhbmNlIGlzIG5vdCBhbGxvd2VkKQ0KLVJlbW90ZU9iamVjdEV4Y2VwdGlvbl9FcnJvcl9NZXNzYWdlPUNsYXNzIHswfSBpcyBhIHJlbW90ZSBPYmplY3QNCi0NCi0NCi1Xc0RvbVN0YXJ0dXBQYXJ0aWNpcGFudF9TdGFydHVwX0pvYl9NZXNzYWdlCT1Mb2FkaW5nIFdlYiBTZXJ2aWNlIERPTS4uLg0KLVdvcmtzcGFjZUNVRmluZGVyX0xPQURJTkdfQ0FOQ0VMRUQ9SkFYLVdTIERPTSBsb2FkaW5nIGNhbmNlbGVkDQotSkFYV1NfRE9NX0xPQURJTkc9TG9hZGluZyBET00gZm9yIEpBWC1XUyBXZWIgU2VydmljZXMNCi1TZWlJbXBsZW1lbnRhdGlvblZhbGlkYXRvcl9NRVRIT0RfTk9UX0ZPVU5EID0gTWV0aG9kIHswfSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIGltcGxlbWVudGF0aW9uIGJlYW4gezF9LiBJdCBpcyByZXF1aXJlZCB0aGF0IHRoZSBiZWFuIGltcGxlbWVudHMgYWxsIHRoZSBtZXRob2RzIG9mIHRoZSBzcGVjaWZpZWQgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UNCi1TZWlJbXBsZW1lbnRhdGlvblZhbGlkYXRvcl9NRVRIT0RfSEFTRElGRkVSRU5UX0VYQ0VQVElPTlMgPSBNZXRob2QgezB9IGluIHRoZSBpbXBsZW1lbnRhdGlvbiBiZWFuIHsxfSBpcyBkZWNsYXJlZCB0byB0aHJvdyBleGNlcHRpb25zIHRoYXQgZGlmZmVyIGZyb20gZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIHNhbWUgbWV0aG9kIGluIHRoZSBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZQ0KLVNlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yX01FVEhPRF9OT1RfUFVCTElDPSBNZXRob2QgezB9IGluIHRoZSBpbXBsZW1lbnRhdGlvbiBiZWFuIHsxfSBpcyBub3QgcHVibGljIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIGV4cG9zZWQgYXMgYSB3ZWIgc2VydmljZSBvcGVyYXRpb24NCi0NCi0NCi1TZWlWYWxpZGF0b3JfTk9UX0NPTVBJTEFUSU9OVU5JVF9NU0cgPSB7MH0gaXMgYSBiaW5hcnkgaW50ZXJmYWNlIGFuZCBjYW5ub3QgYW5ub3RhdGVkIGFzIGEgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UNCi1TZWlWYWxpZGF0b3JfTk9UX0lOVEVSRkFDRV9NU0cgPSB7MH0gaXMgbm90IGEgaW50ZXJmYWNlIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBhIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlDQotU2VpVmFsaWRhdG9yX05PVF9PVVRFUl9NU0cgPSB7MH0gaXMgbm90IGEgb3V0ZXIgaW50ZXJmYWNlIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBhIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlDQotU2VpVmFsaWRhdG9yX05PVF9QVUJMSUNfTVNHID0gezB9IGlzIG5vdCBhIHB1YmxpYyBpbnRlcmZhY2UgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIGEgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UNCi1UeXBlTm90Rm91bmRFeGNlcHRpb25fRXJyb3JfTWVzc2FnZT1DbGFzcyB7MH0gY2Fubm90IGJlIGZvdW5kDQotDQotRG9tVmFsaWRhdGlvbkNvbnN0cmFpbnREZXNjcmlwdG9yX1dTX0RPTV9WQUxJREFUSU9OX0NPTlNUUkFJTlQ9V2ViU2VydmljZSBET00gdmFsaWRhdGlvbiBjb25zdHJhaW50DQotVGFyZ2V0TnNWYWxpZFVyaUNvbnN0cmFpbnRfVVJJX1NZTlRBWF9FUlJPUj1VUkkgc3ludGF4IGVycm9yIGF0IGluZGV4IHswfSBvZiBpbnB1dCBTdHJpbmcgJyd7MX0nJy4gUmVhc29uOiB7Mn0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3V0aWwvTmFtZWRFeHRlbnNpb25JbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3V0aWwvTmFtZWRFeHRlbnNpb25JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk3Y2E1MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC91dGlsL05hbWVkRXh0ZW5zaW9uSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklOYW1lZEV4dGVuc2lvbkluZm87DQotDQotLyoqDQotICogSW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHtAbGluayBJTmFtZWRFeHRlbnNpb25JbmZvfS4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgTmFtZWRFeHRlbnNpb25JbmZvIGltcGxlbWVudHMgSU5hbWVkRXh0ZW5zaW9uSW5mbw0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7DQotDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7DQotDQotCXByb3RlY3RlZCBOYW1lZEV4dGVuc2lvbkluZm8oZmluYWwgU3RyaW5nIHBJZCwgZmluYWwgU3RyaW5nIHBMYWJlbCkNCi0Jew0KLQkJdGhpcy5pZCA9IHBJZDsNCi0JCXRoaXMubmFtZSA9IHBMYWJlbDsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkNCi0Jew0KLQkJcmV0dXJuIGlkOw0KLQl9DQotDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpDQotCXsNCi0JCXJldHVybiBuYW1lOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdXRpbC9YcFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdXRpbC9YcFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDY0MjJiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3V0aWwvWHBVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0NCi0vKioNCi0gKiBVdGlsaXR5IGNsYXNzIGZvciB3b3JraW5nIHdpdGggZXh0ZW5kaW9uIHBvaW50cy4NCi0gKi8NCi1wdWJsaWMgZmluYWwgY2xhc3MgWHBVdGlsDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX05PVF9QUk9QRVJMWV9SRUdJU1RFUkVEID0gIkNvbnN1bWVyVHlwZSBleHRlbnNpb24gbm90IHByb3Blcmx5IHJlZ2lzdGVyZWQgKGVycm9yIGluIHBsdWdpbi54bWwpIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKiogICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhQX0lNUExFTUVOVEFUSU9OX0VMRU1FTlQgPSAiaW1wbGVtZW50YXRpb24iOyAvLyROT04tTkxTLTEkDQotDQotCS8qKiAgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBfSU1QTEVNRU5UQVRJT05fRUxFTUVOVF9DTEFTU19BVFRSID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZXhlY3V0YWJsZSBleHRlbnNpb24uDQotCSAqIA0KLQkgKiBAcGFyYW0gZXh0DQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgZXh0ZW50aW9uIGltcGxlbWVudGF0aW9uDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBpbnN0YW50aWF0ZUltcGxlbWVudGF0aW9uKGZpbmFsIElFeHRlbnNpb24gZXh0KQ0KLQl7DQotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbCA6IGV4dC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSkNCi0JCXsNCi0JCQlpZiAoZWwuZ2V0TmFtZSgpLmVxdWFscyhYUF9JTVBMRU1FTlRBVElPTl9FTEVNRU5UKSkNCi0JCQl7DQotCQkJCXRyeQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gZWwuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihYUF9JTVBMRU1FTlRBVElPTl9FTEVNRU5UX0NMQVNTX0FUVFIpOw0KLQkJCQl9IGNhdGNoIChmaW5hbCBDb3JlRXhjZXB0aW9uIGUpDQotCQkJCXsNCi0JCQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmFibGUgdG8gY3JlYXRlIGV4dGVuc2lvbiIsIGUpOyAvLyROT04tTkxTLTEkDQotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWxvZ2dlcigpLmxvZ0Vycm9yKEVYVEVOU0lPTl9OT1RfUFJPUEVSTFlfUkVHSVNURVJFRCk7DQotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihFWFRFTlNJT05fTk9UX1BST1BFUkxZX1JFR0lTVEVSRUQpOw0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIElMb2dnZXIgbG9nZ2VyKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBMb2dnZXIoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3ZhbGlkYXRpb24vcHJvdmlkZXIvVHlwZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9wcm92aWRlci9UeXBlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NmRjMjQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9wcm92aWRlci9UeXBlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnZhbGlkYXRpb24ucHJvdmlkZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkdlbmVyYWxUeXBlc05hbWVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuVHlwZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLlR5cGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi0NCi0vKioNCi0gKiBUeXBlUHJveHkgcmVwcmVzZW50cyBhIHR5cGUgaW4gYSB3YXkgY29udmllbmllbnQgZm9yIHR5cGUgY2hlY2tpbmcuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBUeXBlQWRhcHRlcg0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBJVHlwZSB0eXBlOw0KLQ0KLQlwcml2YXRlIFN0cmluZyBzdXBlckNsYXNzTmFtZTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yLg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGUNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAtDQotCSAqICAgICAgICAgICAgIGluIGNhc2UgPGNvZGU+dHlwZTwvY29kZT4gaXMgbnVsbC4NCi0JICovDQotCXB1YmxpYyBUeXBlQWRhcHRlcihJVHlwZSB0eXBlKQ0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0odHlwZSwgInR5cGUiKTsNCi0JCXRoaXMudHlwZSA9IHR5cGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIENoZWNrcyBmb3IgZGVmYXVsdCBjb25zdHJ1Y3RvciBpbiBhbmFseXNlZCBjbGFzcy4NCi0JICogDQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBwdWJsaWMgY29uc3RydWN0b3Igd2l0aG91dCBwYXJhbWV0aGVycyBleGlzdHMgb3IgY2xhc3MgZG9lcyBub3QgaGF2ZSBhbnkgY29uc3RydWN0b3IuDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBoYXNEZWZhdWx0Q29uc3RydWN0b3IoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWJvb2xlYW4gaGFzQ29uc3RydWN0b3IgPSBmYWxzZTsNCi0JCWJvb2xlYW4gaXNQdWJsaWMgPSBmYWxzZTsNCi0NCi0JCWZvciAoSU1ldGhvZCBtZXRob2QgOiB0eXBlLmdldE1ldGhvZHMoKSkNCi0JCXsNCi0JCQlpc1B1YmxpYyA9IEZsYWdzLmlzUHVibGljKG1ldGhvZC5nZXRGbGFncygpKTsNCi0JCQlpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkNCi0JCQl7DQotCQkJCWhhc0NvbnN0cnVjdG9yID0gdHJ1ZTsNCi0JCQl9DQotDQotCQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkgJiYgaXNQdWJsaWMgJiYgbWV0aG9kLmdldFBhcmFtZXRlck5hbWVzKCkubGVuZ3RoID09IDApDQotCQkJew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gIWhhc0NvbnN0cnVjdG9yOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZXMgdGhlIGRpcmVjdCBzdXBlciBpbnRlcmZhY2VzIGZ1bGx5IHF1YWxpZmllZCBuYW1lcy4NCi0JICogDQotCSAqIEByZXR1cm4gbGlzdCBvZiBpbnRlcmZhY2UgbmFtZXMgLSBpbiBjYXNlIG5vIGludGVyZmFjZXMgYXJlIGltcGxlbWVudGVkIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgTGlzdDxTdHJpbmc+IGdldEludGVyZmFjZU5hbWVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmdbXSBpTmFtZXMgPSB0eXBlLmdldFN1cGVySW50ZXJmYWNlTmFtZXMoKTsNCi0JCUxpc3Q8U3RyaW5nPiBpbnRlcmZhY2VOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihpTmFtZXMubGVuZ3RoKTsNCi0JCWZvciAoU3RyaW5nIG5hbWUgOiBpTmFtZXMpDQotCQl7DQotCQkJU3RyaW5nIHJlc29sdmVkTmFtZSA9IFR5cGVSZXNvbHZlci5yZXNvbHZlVHlwZShuYW1lLCB0eXBlKTsNCi0JCQlpbnRlcmZhY2VOYW1lcy5hZGQocmVzb2x2ZWROYW1lKTsNCi0JCX0NCi0NCi0JCXJldHVybiBpbnRlcmZhY2VOYW1lczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIGlmIHRoZSBjbGFzcyBjb250YWlucyBub24gc3RhdGljIGFuZCBub24gcHVibGljIGlubmVyIGNsYXNzZXMuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRydWUgaWYgY29udGFpbnMgc3VjaA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaGFzTm9uU3RhdGljT3JOb25QdWJsaWNJbm5lclR5cGVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmb3IgKElUeXBlIHQgOiB0eXBlLmdldFR5cGVzKCkpDQotCQl7DQotCQkJaW50IHR5cGVGbGFncyA9IHQuZ2V0RmxhZ3MoKTsNCi0JCQlpZiAoIUZsYWdzLmlzU3RhdGljKHR5cGVGbGFncykgfHwgIUZsYWdzLmlzUHVibGljKHR5cGVGbGFncykpDQotCQkJew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlcyB0aGUgbmFtZSBvZiBpdCdzIHN1cGVyY2xhc3MNCi0JICogDQotCSAqIEByZXR1cm4gcmV0dXJuZXMgcmVzb2x2ZWQgc3VwZXIgY2xhc3MgbmFtZSBvciBudWxsIGlmIG5vdCBwcmVzZW50DQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN1cGVyQ2xhc3NOYW1lKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAodHlwZS5nZXRTdXBlcmNsYXNzTmFtZSgpICE9IG51bGwgJiYgc3VwZXJDbGFzc05hbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQlzdXBlckNsYXNzTmFtZSA9IFR5cGVSZXNvbHZlci5yZXNvbHZlVHlwZSh0eXBlLmdldFN1cGVyY2xhc3NOYW1lKCksIHR5cGUpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHN1cGVyQ2xhc3NOYW1lOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXNvbHZlcyBhbmQgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBUeXBlUHJveHkgZm9yIHN1cGVyIGNsYXNzLg0KLQkgKiANCi0JICogQHJldHVybiByZXR1cm5zIGluc3RhbmNlIG9mIHtAbGluayBUeXBlQWRhcHRlcn0gZm9yIHN1cGVyIGNsYXNzIG9yIG51bGwgaWYgbm90IHByZXNlbnQNCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICogQHRocm93cyBUeXBlTm90Rm91bmRFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBmaW5hbCBUeXBlQWRhcHRlciBnZXRTdXBlckNsYXNzVHlwZSgpIHRocm93cyBUeXBlTm90Rm91bmRFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoZ2V0U3VwZXJDbGFzc05hbWUoKSA9PSBudWxsKQ0KLQkJCXJldHVybiBudWxsOw0KLQ0KLQkJcmV0dXJuIG5ldyBUeXBlQWRhcHRlcihUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0U3VwZXJDbGFzc05hbWUoKSwgZ2V0VHlwZSgpKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIERlZmluZXMgaWYgdGhpcyBjbGFzcyBleHRlbmRzIDx0dD5iYXNlQ2xhc3NUeXBlPC90dD4NCi0JICogDQotCSAqIEBwYXJhbSBiYXNlQ2xhc3NUeXBlDQotCSAqIEByZXR1cm4gY2hlY2sgaWYgdGhpcyBjbGFzcyB0eXBlIGV4dGVuZHMgPHR0PmJhc2VDbGFzc1R5cGU8L3R0Pg0KLQkgKiBAdGhyb3dzIFR5cGVOb3RGb3VuZEV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNFeHRlbmRpbmcoU3RyaW5nIGJhc2VDbGFzc1R5cGUpIHRocm93cyBUeXBlTm90Rm91bmRFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmcgdHlwZU5hbWUgPSB0aGlzLmdldFF1YWxpZmllZE5hbWUoKTsNCi0NCi0JCS8vIGlmIHdlIGhhdmUgYXJyaXZlZCBhdCBvYmplY3QgaW4gdGhlIGhpZXJhcmNoeSwgdGhlIHR5cGUgY2Fubm90IGJlIGFuIGV4Y2VwdGlvbg0KLQkJaWYgKHR5cGVOYW1lLmVxdWFscyhHZW5lcmFsVHlwZXNOYW1lcy5KQVZBX0xBTkdfT0JKRUNUKSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkvLyBBbGwgZXhjZXB0aW9ucyBpbmhlcml0IGZyb20gVGhyb3dhYmxlDQotCQlpZiAodHlwZU5hbWUuZXF1YWxzKGJhc2VDbGFzc1R5cGUpKQ0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQ0KLQkJVHlwZUFkYXB0ZXIgcGFyZW50VHlwZSA9IGdldFN1cGVyQ2xhc3NUeXBlKCk7DQotCQlpZiAocGFyZW50VHlwZSAhPSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiBwYXJlbnRUeXBlLmlzRXh0ZW5kaW5nKGJhc2VDbGFzc1R5cGUpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVja3MgaWYgPGNvZGU+dHlwZTwvY29kZT4gaW1wbGVtZW50cyBpbnRlcmZhY2UgPGNvZGU+Y2hlY2tlZEludGVyZmFjZU5hbWU8L2NvZGU+LiBSZWN1cnNpdmUgY2hlY2sgb3ZlciB0aGUgaW1wbGVtZW50ZWQgaW50ZXJmYWNlcyBpcw0KLQkgKiBkb25lIHdoaWNoIGRlZmluZXMgaWYgc29tZSBvZiB0aGUgaW1wbGVtZW50ZWQgaW4gPGNvZGU+dHlwZTwvY29kZT4gaW50ZXJmYWNlIGlzIGV4dGVuZGluZyB0aGUgc3BlY2lmaWVkIGludGVyZmFjZS4NCi0JICogDQotCSAqIEBwYXJhbSBpbnRlcmZhY2VOYW1lDQotCSAqIEByZXR1cm4gdHJ1ZSBpcyB0aGlzIGNsYXNzIHR5cGUgaW1wbGVtZW50cyA8dHQ+aW50ZXJmYWNlTmFtZTwvdHQ+DQotCSAqIEB0aHJvd3MgVHlwZU5vdEZvdW5kRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcGxlbWVudGluZyhmaW5hbCBTdHJpbmcgaW50ZXJmYWNlTmFtZSkgdGhyb3dzIFR5cGVOb3RGb3VuZEV4Y2VwdGlvbiwgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXJldHVybiBpc0ltcGxlbWVudGluZyh0aGlzLCBpbnRlcmZhY2VOYW1lKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gaXNJbXBsZW1lbnRpbmcoZmluYWwgVHlwZUFkYXB0ZXIgY2hlY2tlZFR5cGUsIGZpbmFsIFN0cmluZyBjaGVja2VkSW50ZXJmYWNlTmFtZSkgdGhyb3dzIFR5cGVOb3RGb3VuZEV4Y2VwdGlvbiwgSmF2YU1vZGVsRXhjZXB0aW9uDQotDQotCXsNCi0JCWlmIChjaGVja2VkVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGNoZWNrZWRJbnRlcmZhY2VOYW1lKSkNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0NCi0JCWZvciAoU3RyaW5nIGludGVyZmFjZU5hbWUgOiBjaGVja2VkVHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpKQ0KLQkJew0KLQkJCVR5cGVBZGFwdGVyIHRhID0gbmV3IFR5cGVBZGFwdGVyKFR5cGVGYWN0b3J5LmNyZWF0ZShpbnRlcmZhY2VOYW1lLCBjaGVja2VkVHlwZS5nZXRUeXBlKCkpKTsNCi0JCQlpZiAoaXNJbXBsZW1lbnRpbmcodGEsIGNoZWNrZWRJbnRlcmZhY2VOYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCS8vIGhlcmUgdXNlIGVwIGNoZWNrZXIgYXMgc2VyaWFibGl6YWJsZSBpcyBub3QgcmVxdWlyZWQgaW4gc3VwZXJ0eXBlDQotCQlpZiAoY2hlY2tlZFR5cGUuZ2V0U3VwZXJDbGFzc05hbWUoKSAhPSBudWxsKQ0KLQkJew0KLQkJCVR5cGVBZGFwdGVyIHN1cGVyQ2xhc3MgPSBuZXcgVHlwZUFkYXB0ZXIoVHlwZUZhY3RvcnkuY3JlYXRlKGNoZWNrZWRUeXBlLmdldFN1cGVyQ2xhc3NOYW1lKCksIGNoZWNrZWRUeXBlLmdldFR5cGUoKSkpOw0KLQkJCXJldHVybiBpc0ltcGxlbWVudGluZyhzdXBlckNsYXNzLCBjaGVja2VkSW50ZXJmYWNlTmFtZSk7DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHR5cGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUNCi0JICogDQotCSAqIEByZXR1cm4gbm90IDx0dD5udWxsPC90dD4gc3RyaW5nDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKQ0KLQl7DQotCQlyZXR1cm4gdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcHJvamVjdCBuYW1lIGluIHdoaWNoIHRoZSB0eXBlIHJlc2lkZXMuDQotCSAqIA0KLQkgKiBAcmV0dXJuIG5vdCA8dHQ+bnVsbDwvdHQ+IHN0cmluZw0KLQkgKi8NCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpDQotCXsNCi0JCXJldHVybiB0eXBlLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB3cmFwcGVkIElUeXBlLg0KLQkgKiANCi0JICogQHJldHVybiBJVHlwZSBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIGZpbmFsIElUeXBlIGdldFR5cGUoKQ0KLQl7DQotCQlyZXR1cm4gdHlwZTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGludCBoYXNoQ29kZSgpDQotCXsNCi0JCXJldHVybiB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmhhc2hDb2RlKCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KLQl7DQotCQlpZiAob2JqID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJaWYgKG9iai5nZXRDbGFzcygpID09IFR5cGVBZGFwdGVyLmNsYXNzKQ0KLQkJew0KLQkJCXJldHVybiAoZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscygoKFR5cGVBZGFwdGVyKSBvYmopLmdldFF1YWxpZmllZE5hbWUoKSkpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVja3MgaWYgdGhlIHR5cGUgaXMgcHVibGljLg0KLQkgKiANCi0JICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBjbGFzcyBpcyBwdWJsaWMNCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzUHVibGljKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlyZXR1cm4gRmxhZ3MuaXNQdWJsaWModHlwZS5nZXRGbGFncygpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIGlmIHRoZSB0eXBlIGlzIGZpbmFsLg0KLQkgKiANCi0JICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBjbGFzcyBpcyBmaW5hbA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNGaW5hbCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJcmV0dXJuIEZsYWdzLmlzRmluYWwodHlwZS5nZXRGbGFncygpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIGlmIHRoZSB0eXBlIGlzIGFic3RyYWN0Lg0KLQkgKiANCi0JICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBjbGFzcyBpcyBhYnN0cmFjdA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJcmV0dXJuIEZsYWdzLmlzQWJzdHJhY3QodHlwZS5nZXRGbGFncygpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIGlmIHRoZSB0eXBlIGlzIGFuIGludGVyZmFjZS4NCi0JICogDQotCSAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiB0aGUgY2xhc3MgaXMgaW50ZXJmYWNlDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJcmV0dXJuIHR5cGUuaXNJbnRlcmZhY2UoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3ZhbGlkYXRpb24vcHJvdmlkZXIvVHlwZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9wcm92aWRlci9UeXBlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZjQ2ODliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9wcm92aWRlci9UeXBlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnZhbGlkYXRpb24ucHJvdmlkZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuUHJpbWl0aXZlVHlwZUhhbmRsZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuVHlwZU5vdEZvdW5kRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEZhY3RvcnkgZm9yIElUeXBlIG9iamVjdHMuIENvbnRhaW5zIGNhY2hlIHdpdGggYWxyZWFkeSBmb3VuZCB0eXBlcyBwZXIgcHJvamVjdCB0aGlzIHdheSBtaW5pbWl6aW5nIHRoZSB0aW1lIG5lZWRlZCB0byBvYnRhaW4gYW4gSVR5cGUgaW5zdGFuY2UgZm9yDQotICogY29uY3JlYXRlIHR5cGUuIFJlZ2lzdGVycyBSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lciB0byBsaXN0ZW4gZm9yIGNoYW5nZXMgaW4gcHJvamVjdHMuIElmIHNvbWUgcmVzb3VyY2UgaW4gc29tZSBwcm9qZWN0cyBoYXMgYmVlbiBjaGFuZ2VkIHRoZSBjYWNoZQ0KLSAqIGZvciB0aGlzIHByb2plY3QgaXMgY2xlYW5lZC4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFR5cGVGYWN0b3J5DQotew0KLQkvKioNCi0JICogQW5hbHlzZWQgdHlwZXMgY2FjaGUuDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBIYXNodGFibGU8U3RyaW5nLCBNYXA8U3RyaW5nLCBJVHlwZT4+IHR5cGVzQ2FjaGUgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgTWFwPFN0cmluZywgSVR5cGU+PigpOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBUeXBlQ2FjaGUgY2FjaGUgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBUeXBlUHJveHkgaW5zdGFuY2UgZm9yIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+IGZvciB0aGUgcHJvamVjdCB3aXRoIG5hbWUgPGNvZGU+cHJvamVjdE5hbWU8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIHByb2plY3ROYW1lDQotCSAqIEBwYXJhbSBxdWFsaWZpZWROYW1lDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgSVR5cGUgaW4gY2FzZSB0eXBlIGhhcyBiZWVuIGZvdW5kDQotCSAqIEB0aHJvd3MgVHlwZU5vdEZvdW5kRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIGlmIHR5cGUgd2l0aCBmdWxseSBxdWFsaWZpZWQgbmFtZSA8dHQ+cXVhbGlmaWVkTmFtZTwvdHQ+IGlzIG5vdCBmb3VuZA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJVHlwZSBjcmVhdGUoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkgdGhyb3dzIFR5cGVOb3RGb3VuZEV4Y2VwdGlvbiwgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOw0KLQ0KLQkJcmV0dXJuIGNyZWF0ZShKYXZhQ29yZS5jcmVhdGUocHJvamVjdCksIHF1YWxpZmllZE5hbWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBGaW5kcyBJVHlwZSBvYmplY3QgZm9yIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+IGZvciB0aGUgcHJvamVjdCBpbiB3aGljaCA8Y29kZT50eXBlPC9jb2RlPiByZXNpZGVzLg0KLQkgKiANCi0JICogQHBhcmFtIHF1YWxpZmllZE5hbWUNCi0JICogQHBhcmFtIHR5cGUNCi0JICogQHJldHVybiBpbnN0YW5jZSBvZiBJVHlwZSBpbiBjYXNlIHR5cGUgaGFzIGJlZW4gZm91bmQNCi0JICogQHRocm93cyBUeXBlTm90Rm91bmRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgaWYgdHlwZSB3aXRoIGZ1bGx5IHF1YWxpZmllZCBuYW1lIDx0dD5xdWFsaWZpZWROYW1lPC90dD4gaXMgbm90IGZvdW5kDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElUeXBlIGNyZWF0ZShTdHJpbmcgcXVhbGlmaWVkTmFtZSwgSVR5cGUgdHlwZSkgdGhyb3dzIFR5cGVOb3RGb3VuZEV4Y2VwdGlvbiwgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXJldHVybiBjcmVhdGUodHlwZS5nZXRKYXZhUHJvamVjdCgpLCBxdWFsaWZpZWROYW1lKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogRmluZHMgSVR5cGUgb2JqZWN0IGZvciA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPiB0eXBlIGluIDxjb2RlPmphdmFQcm9qZWN0PC9jb2RlPiBwcm9qZWN0LiBPbiBmaXJzdCBzdGVwcyB0cmllcyB0byBmaW5kIHRoaXMgdHlwZSBpbiBjYWNoZQ0KLQkgKiBhbmQgaWYgbm90IGZvdW5kIG5ldyBpbnN0YW5jZSBpcyBjcmVhdGVkLg0KLQkgKiANCi0JICogQHBhcmFtIGphdmFQcm9qZWN0DQotCSAqIEBwYXJhbSBxdWFsaWZpZWROYW1lDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgSVR5cGUgaW4gY2FzZSB0eXBlIGhhcyBiZWVuIGZvdW5kDQotCSAqIEB0aHJvd3MgVHlwZU5vdEZvdW5kRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIGlmIHR5cGUgd2l0aCBmdWxseSBxdWFsaWZpZWQgbmFtZSA8dHQ+cXVhbGlmaWVkTmFtZTwvdHQ+IGlzIG5vdCBmb3VuZA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgSVR5cGUgY3JlYXRlKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIHF1YWxpZmllZE5hbWUpIHRocm93cyBUeXBlTm90Rm91bmRFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmcgbG9jYWxRdWFsaWZpZWROYW1lID0gcXVhbGlmaWVkTmFtZTsNCi0NCi0JCWlmIChQcmltaXRpdmVUeXBlSGFuZGxlci5pc0FycmF5VHlwZShsb2NhbFF1YWxpZmllZE5hbWUpKQ0KLQkJew0KLQkJCWxvY2FsUXVhbGlmaWVkTmFtZSA9IFByaW1pdGl2ZVR5cGVIYW5kbGVyLmdldFR5cGVGcm9tQXJyYXlUeXBlKGxvY2FsUXVhbGlmaWVkTmFtZSk7DQotCQl9DQotDQotCQlpZiAoUHJpbWl0aXZlVHlwZUhhbmRsZXIuaXNKYXZhUHJpbWl0aXZlVHlwZShsb2NhbFF1YWxpZmllZE5hbWUpKQ0KLQkJew0KLQkJCWxvY2FsUXVhbGlmaWVkTmFtZSA9IFByaW1pdGl2ZVR5cGVIYW5kbGVyLmdldE9iamVjdFR5cGVGb3JQcmltaXRpdmVUeXBlKGxvY2FsUXVhbGlmaWVkTmFtZSk7DQotCQl9DQotDQotCQlpZiAoY2FjaGUgPT0gbnVsbCkNCi0JCXsNCi0JCQljYWNoZSA9IG5ldyBUeXBlQ2FjaGUoKTsNCi0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihjYWNoZSk7DQotCQl9DQotDQotCQlJVHlwZSB0eXBlID0gY2FjaGUuZmluZFR5cGUobG9jYWxRdWFsaWZpZWROYW1lLCBqYXZhUHJvamVjdCk7DQotCQlpZiAodHlwZSAhPSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiB0eXBlOw0KLQkJfQ0KLQ0KLQkJdHlwZSA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKGxvY2FsUXVhbGlmaWVkTmFtZSk7DQotCQlpZiAodHlwZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBUeXBlTm90Rm91bmRFeGNlcHRpb24obG9jYWxRdWFsaWZpZWROYW1lKTsNCi0JCX0NCi0NCi0JCWNhY2hlLmFkZFR5cGUobG9jYWxRdWFsaWZpZWROYW1lLCB0eXBlLCBqYXZhUHJvamVjdCk7DQotDQotCQlyZXR1cm4gdHlwZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2FjaGluZyBmdW5jdGlvbmFsaXR5LiBBbGwgdHlwZXMgdGhhdCBoYXZlIGJlZW4gcmV0cmlldmVkIGFyZSBjYWNoZWQuIENhY2hpbmcgaXMgcGVyIHByb2plY3QuIFNlYXJjaCBpcyBleGVjdXRlbiBpbiBmb2xsb3dpbiB3YXk6PGJyPg0KLQkgKiAxLiBTZWFyY2ggZm9yIGNoYWNoZSBmb3IgdGhlIHByb2plY3QuIElmIGNhY2hlIGlzIG5vdCBmb3VuZCBhbiBlbXB0eSBjYWNoZSBpcyBjcmVhdGVkLjxicj4NCi0JICogMi4gVHlwZSBpcyBzZWFyY2hlZCBpbiB0aGUgcHJvamVjdHMgY2FjaGUgYW5kIGlzIHJldHVybmVkLiBJZiBhIHR5cGUgaXMgbm90IGZvdW5kIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLg0KLQkgKiANCi0JICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZUNhY2hlIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXINCi0Jew0KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KQ0KLQkJew0KLQkJCWlmIChldmVudCAhPSBudWxsICYmIGV2ZW50LmdldERlbHRhKCkgIT0gbnVsbCkNCi0JCQl7DQotCQkJCWZvciAoSVJlc291cmNlRGVsdGEgY2hpbGRyZW4gOiBldmVudC5nZXREZWx0YSgpLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkNCi0JCQkJew0KLQkJCQkJSVJlc291cmNlRGVsdGEgckRlbHRhID0gKElSZXNvdXJjZURlbHRhKSBjaGlsZHJlbi5nZXRBZGFwdGVyKElSZXNvdXJjZURlbHRhLmNsYXNzKTsNCi0JCQkJCWlmIChyRGVsdGEuZ2V0UmVzb3VyY2UoKSAhPSBudWxsICYmIHJEZWx0YS5nZXRSZXNvdXJjZSgpIGluc3RhbmNlb2YgSVByb2plY3QpDQotCQkJCQl7DQotCQkJCQkJcmVtb3ZlTWFwRm9yUHJvamVjdChyRGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXROYW1lKCkpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcHJvdGVjdGVkIElUeXBlIGZpbmRUeXBlKFN0cmluZyBxdWFsaWZpZWROYW1lLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QpDQotCQl7DQotCQkJcmV0dXJuIGdldE1hcEZvclByb2plY3QoamF2YVByb2plY3QpLmdldChxdWFsaWZpZWROYW1lKTsNCi0JCX0NCi0NCi0JCXByb3RlY3RlZCB2b2lkIGFkZFR5cGUoU3RyaW5nIHF1YWxpZmllZE5hbWUsIElUeXBlIHR5cGUsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkNCi0JCXsNCi0JCQlnZXRNYXBGb3JQcm9qZWN0KGphdmFQcm9qZWN0KS5wdXQocXVhbGlmaWVkTmFtZSwgdHlwZSk7DQotCQl9DQotDQotCQlwcml2YXRlIHZvaWQgcmVtb3ZlTWFwRm9yUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpDQotCQl7DQotCQkJdHlwZXNDYWNoZS5yZW1vdmUocHJvamVjdE5hbWUpOw0KLQkJfQ0KLQ0KLQkJcHJpdmF0ZSBNYXA8U3RyaW5nLCBJVHlwZT4gZ2V0TWFwRm9yUHJvamVjdChJSmF2YVByb2plY3QgamF2YVByb2plY3QpDQotCQl7DQotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsNCi0JCQlNYXA8U3RyaW5nLCBJVHlwZT4gcHJvamVjdFR5cGVzID0gdHlwZXNDYWNoZS5nZXQocHJvamVjdE5hbWUpOw0KLQkJCWlmIChwcm9qZWN0VHlwZXMgPT0gbnVsbCkNCi0JCQl7DQotCQkJCXByb2plY3RUeXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVR5cGU+KCk7DQotCQkJCXR5cGVzQ2FjaGUucHV0KHByb2plY3ROYW1lLCBwcm9qZWN0VHlwZXMpOw0KLQkJCX0NCi0NCi0JCQlyZXR1cm4gcHJvamVjdFR5cGVzOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9wcm92aWRlci9UeXBlS2V5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3ZhbGlkYXRpb24vcHJvdmlkZXIvVHlwZUtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZDJhYTQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9wcm92aWRlci9UeXBlS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC52YWxpZGF0aW9uLnByb3ZpZGVyOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLQ0KLS8qKg0KLSAqIFR5cGUga2V5IC0gcmVwcmVzZW50cyB0eXBlIGluIGNvbnRleHQgb2YgcHJvamVjdC4gT3ZlcnJpZGVzIGhhc2hDb2RlKCkgZm9yIHVzYWdlIGluIG1hcHMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBUeXBlS2V5DQotew0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZTsNCi0NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWU7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvci4NCi0JICogDQotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZQ0KLQkgKiBAcGFyYW0gcXVhbGlmaWVkVHlwZU5hbWUNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICBpbiBjYXNlIHNvbWUgb2YgdGhlIHBhcmFtcyBpcyBudWxsLg0KLQkgKi8NCi0JcHVibGljIFR5cGVLZXkoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUpDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShwcm9qZWN0TmFtZSwgInByb2plY3ROYW1lIik7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0ocXVhbGlmaWVkVHlwZU5hbWUsICJxdWFsaWZpZWRUeXBlTmFtZSIpOw0KLQ0KLQkJdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOw0KLQkJdGhpcy5xdWFsaWZpZWRUeXBlTmFtZSA9IHF1YWxpZmllZFR5cGVOYW1lOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0Jew0KLQkJcmV0dXJuIHByb2plY3ROYW1lLmhhc2hDb2RlKCkgKyBxdWFsaWZpZWRUeXBlTmFtZS5oYXNoQ29kZSgpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pDQotCXsNCi0JCWlmIChvIGluc3RhbmNlb2YgVHlwZUtleSkNCi0JCXsNCi0JCQlyZXR1cm4gKChUeXBlS2V5KSBvKS5oYXNoQ29kZSgpID09IGhhc2hDb2RlKCk7DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JQW5ub3RhdGlvblNlcmlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSUFubm90YXRpb25TZXJpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFjOGVlZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JQW5ub3RhdGlvblNlcmlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotDQotLyoqDQotICogVGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCBpbnRlbmQgdG8gZG8gc2VyaWFsaXphdGlvbiBmb3IgDQotICogRE9NIG9iamVjdHMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUFubm90YXRpb25TZXJpYWxpemVyIA0KLXsNCi0JcHVibGljIHZvaWQgc2F2ZShmaW5hbCBOb3RpZmljYXRpb24gbXNnKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JQ29tcGlsYXRpb25Vbml0RmluZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lDb21waWxhdGlvblVuaXRGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Q2NjkwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lDb21waWxhdGlvblVuaXRGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotDQotLyoqDQotICogSW1wbGVtZW50cyBhIHZpc2l0b3IgcGF0dGVybiBmb3IgdHJhdmVyc2luZyBjb21waWxhdGlvbiB1bml0LiBUaGlzIGludGVyZmFjZSBkb2VzIG5vdCBkZWZpbmUgd2hhdCBzZXQgb2YgY29tcGlsYXRpb24NCi0gKiB1bml0cyB3aWxsIGJlIHRyYXZlcmVzZWQuIFRoaXMgY291bGQgYmUgYSBzaW5nbGUgamF2YSBwcm9qZWN0LCB0aGUgd2hvbGUgd29ya3NwYWNlIG9yIGp1c3QgYSBnaXZlbiBwYWNrYWdlLiBUaGUgc2V0IG9mDQotICogdHJhdmVyc2VkIGNvbXBpbGF0aW9uIHVuaXRzIGlzIGxlZnQgdXAgdG8gdGhlIGltcGxlbWVudGF0aW9uLiBOZXZlcnRoZWxlc3MgYXMgdGhlc2UgY29tcGlsYXRpb24gdW5pdHMgYXJlIGFsd2F5cyBjb250YWluZWQNCi0gKiBpbnNpZGUgYSBqYXZhIHByb2plY3QsIHRoZSA8L2M+SUNvbXBpbGF0aW9uVW5pdEhhbmRsZXIuaGFuZGxlUHJvamVjdChJSmF2YVByb2plY3QpPC9jPiBoYXMgdG8gYmUgY2FsbGVkIGV4YWN0bHkgb25jZSB0bw0KLSAqIG5vdGlmeSB0aGUgaGFuZGxlciBmb3IgZWFjaCBwcm9qZWN0IGJlaW5nIHByb2Nlc3NlZC4gVGhlIGNvbXBpbGF0aW9uIHVuaXQgaGFuZGxlciB3aWxsIGJlIGZpcnN0IG5vdGlmaWVkIHRoYXQgdGhlIHByb2Nlc3NpbmcNCi0gKiBvZiBnaXZlbiBwcm9qZWN0IGhhcyBiZWdhbiBhbmQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBpdCB3aWxsIGJlIG5vdGlmaWVkIGZvciBhbGwgYW5ub3RhdGlvbnMgaW4gdGhpcyBwcm9qZWN0IGRpc2NvdmVyZWQgYnkNCi0gKiB0aGUgZ2l2ZW4gaW1wbGVtZW50YXRpb24uIA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElDb21waWxhdGlvblVuaXRGaW5kZXINCi17DQotCS8qKg0KLQkgKiBTdGFydHMgdGhlIHRyYXZlcnNhbCBvZiBjb21waWxhdGlvbiB1bml0cw0KLQkgKiBAcGFyYW0gbW9uaXRvciAtIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIGJlIHVzZWQgZm9yIHRoZSB0cmF2ZXJzYWwuDQotCSAqIEBwYXJhbSBjdUhhbmRsZXIgLSBjb21waWxhdGlvbiB1bml0IGhhbmRsZXIgdG8gYmUgbm90aWZpZWQgZm9yIGEgZ2l2ZW4gcHJvamVjdA0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gLSB0aHJvd24gaWYgdW5leHBlY3RlZCBwcm9ibGVtIG9jY3VycmVkIHdoaWxlIHRyYXZlcnNpbmcgYW5ub3RhdGlvbnMNCi0JICovDQotCXB1YmxpYyB2b2lkIGZpbmQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQ29tcGlsYXRpb25Vbml0SGFuZGxlciBjdUhhbmRsZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JQ29tcGlsYXRpb25Vbml0SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JQ29tcGlsYXRpb25Vbml0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5M2EzMTVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotDQotLyoqDQotICogQSBsaXN0ZW5lciBmb3IgZXZlbnRzIGlzc2V1ZCBieSBhbiA8Yz5JQ29tcGlsYXRpb25Vbml0RmluZGVyPC9jPiBpbnN0YW5jZSBkdXJpbmcgY29tcGlsYXRpb24gdW5pdCB0cmF2ZXJzYWxzDQotICogDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKiANCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElDb21waWxhdGlvblVuaXRIYW5kbGVyDQotew0KLQkvKioNCi0JICogY2FsbGVkIGJ5IHRoZSA8Yz57QGxpbmsgSUNvbXBpbGF0aW9uVW5pdEZpbmRlcn08L2M+IGluc3RhbmNlIHdoZW4gaXQgaGFzIHN0YXJ0ZWQgdG8gdHJhdmVyc2UgdGhlIGFubm90YXRpb24gc2V0LiBBbGwgY2FsbHMgdG8gPGM+aGFuZGxlKC4uLik8L2M+DQotCSAqIG1ldGhvZHMgaXMgaW5zaWRlIGEgc3RhcnRlZC1maW5pc2hlZCBibG9jay4NCi0JICovDQotCXB1YmxpYyB2b2lkIHN0YXJ0ZWQoKTsNCi0NCi0JLyoqDQotCSAqIGNhbGxlZCBieSB0aGUgPGM+e0BsaW5rIElDb21waWxhdGlvblVuaXRGaW5kZXJ9PC9jPiBpbnN0YW5jZSB3aGVuIGl0IGhhcyBmaW5pc2hlZCB0byB0cmF2ZXJzZSB0aGUgYW5ub3RhdGlvbiBzZXQuDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBmaW5pc2hlZCgpOw0KLQ0KLQkvKioNCi0JICogQ2FsbGVkIHdoZW4gdGhlIDxjPntAbGluayBJQ29tcGlsYXRpb25Vbml0RmluZGVyfTwvYz4gaW5zdGFuY2UgZm91bmQgYSBjb21waWxhdGlvbiB1bml0LiBUaGlzIG1ldGhvZCBpcyBhd2xheXMgY2FsbGVkIGFmdGVyIGEgY2FsbCB0byA8Yz57QGxpbmsgI2hhbmRsZShKYXZhUHJvamVjdCkgaGFuZGxlKEphdmFQcm9qZWN0KX08L2M+Lg0KLQkgKiBUaGUgcmVwb3J0ZWQgY29tcGlsYXRpb24gdW5pdCBpcyBndWFyYW50ZWVkIHRvIGJlIGZvdW5kIGluc2lkZSB0aGUgPGM+SmF2YVByb2plY3Q8L2M+IHJlcG9ydGVkIGJ5IHRoZSBsYXN0IGNhbGwgdG8gPGM+e0BsaW5rI2hhbmRsZShKYXZhUHJvamVjdCkgaGFuZGxlKEphdmFQcm9qZWN0KX08L2M+Lg0KLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgZm9yIGVhY2ggY29tcGlsYXRpb24gdW5pdA0KLQkgKiANCi0JICogQHBhcmFtIGN1IC0NCi0JICogICAgICAgICAgICB0aGUgY29tcGlsYXRpb24gdW5pdCBmb3VuZCBieSB0aGUgZmluZGVyDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBoYW5kbGUoSUNvbXBpbGF0aW9uVW5pdCBjdSk7DQotDQotCS8qKg0KLQkgKiBDYWxsZWQgd2hlbiB0aGUgPGM+e0BsaW5rIElDb21waWxhdGlvblVuaXRGaW5kZXJ9PC9jPiBpbnN0YW5jZSBmb3VuZCBhIGphdmEgcHJvamVjdC4gVGhpcyBtZXRob2QgaXMgYWx3YXlzIGNhbGxlZCBiZWZvcmUgdGhlIDxjPntAbGluayAjaGFuZGxlKElDb21waWxhdGlvblVuaXQpfTwvYz4NCi0JICogZm9yIGFueSBjb21waWxhdGlvbiB1bml0IGZvdW5kIGluIHRoaXMgcHJvamVjdC4gVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGZvciBlYWNoIGZvdW5kIHByb2plY3QuDQotCSAqIA0KLQkgKiBAcGFyYW0ganByaiAtDQotCSAqICAgICAgICAgICAgdGhlIGphdmEgcHJvamVjdCBmb3VuZCBieSB0aGUgZmluZGVyDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBoYW5kbGUoSUphdmFQcm9qZWN0IGpwcmopOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSU1vZGVsRWxlbWVudFN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMDBmYzVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSU1vZGVsRWxlbWVudFN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Eb21VdGlsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2UuU2VydmljZU1vZGVsRGF0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXINCi17DQotCXB1YmxpYyBEb21VdGlsIHV0aWwoKTsNCi0JcHVibGljIFNlcnZpY2VNb2RlbERhdGEgc2VydmljZURhdGEoKTsJDQotCXB1YmxpYyBJTG9nZ2VyIGxvZ2dlcigpOw0KLQlwdWJsaWMgSURPTSBnZXREb21CZWluZ0xvYWRlZCgpOw0KLQlwdWJsaWMgRG9tRmFjdG9yeSBkb21GYWN0b3J5KCk7CQ0KLQlwdWJsaWMgSUphdmFNb2RlbCBqYXZhTW9kZWwoKTsJDQotCXB1YmxpYyBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSVByb2plY3RTZWxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JUHJvamVjdFNlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI1YWQ1ZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JUHJvamVjdFNlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLQ0KLS8qKg0KLSAqIFNwZWNpZmllcyB3aGF0IGphdmEgcHJvamVjdHMgd2lsbCBiZSB0cmF2ZXJzZWQgYnkgYSBnaXZlbiA8Yz5JQ29tcGlsYXRpb25Vbml0RmluZGVyPC9jPiBpbnN0YW5jZS4gSWYgYW55IG9mIHRoZSByZWdpc3RlcmVkDQotICogc2VsZWN0b3JzIGFwcHJvdmVkIHRoZSBwcm9qZWN0IGkuZS4gPGM+SVByb2plY3RTZWxlY3Rvci5hcHByb3ZlKElKYXZhUHJvamVjdCk8L2M+IHJldHVybmVkIHRydWUsIHRoZW4gdGhpcyBwcm9qZWN0IHdpbGwNCi0gKiBiZSB0cmF2ZXJzZWQuIEkuZS4gdGhlIHByb2plY3QgbmVlZHMgdG8gYmUgcmVqZWN0ZWQgYnkgYWxsIHRoZSBzZWxlY3RvcnMgaW4gb3JkZXIgbm90IHRvIGJlIHRyYXZlcnNlZC4NCi0gKiANCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZSBzaG91bGQgcmVqZWN0IGEgcHJvamVjdCB0aGF0IGl0IGhhcyBubyBrbm93bGVkZ2UgYWJvdXQuDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2plY3RTZWxlY3Rvcg0KLXsNCi0JLyoqDQotCSAqIEFwcHJvdmVzIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBmb3IgdHJhdmVyc2FsDQotCSAqIEBwYXJhbSBwcmogLSB0aGUgcHJvamVjdCB0byBhcHByb3ZlIG9yIHJlamVjdA0KLQkgKiBAcmV0dXJuIC0gdHJ1ZSBpZiB0aGUgcHJvamVjdCBzaG91bGQgYmUgdHJhdmVyc2VkIGFjY29yZGluZyB0byB0aGlzIHNlbGVjdG9yLCBmYWxzZSBvdGhlcndpc2UuDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBhcHByb3ZlKElKYXZhUHJvamVjdCBwcmopOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0pheFdzRGVmYXVsdHNDYWxjdWxhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0pheFdzRGVmYXVsdHNDYWxjdWxhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiOWQ3N2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9KYXhXc0RlZmF1bHRzQ2FsY3VsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotDQotLyoqDQotICogQ29udGFpbnMgdXRpbGl0eSBtZXRob2RzIGZvciBjYWxjdWxhdGluZyBkZWZhdWx0IHZhbHVlcyBvZiBzb21lIGF0dHJpYnV0ZXMvcHJvcGVydGllcyBpbiANCi0gKiBhbm5vdGF0aW9ucyBhbmQgRE9NIG9iamVjdHMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKYXhXc0RlZmF1bHRzQ2FsY3VsYXRvciANCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUkcgPSAiYXJnIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUVVJOID0gInJldHVybiI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1BPTlNFID0gIlJlc3BvbnNlIjsgLy8kTk9OLU5MUy0xJA0KLQkNCi0JLyoqDQotCSAqIERlZmluZXMgdGhlIFNPQVBCaW5kaW5nU3R5bGUuIElmIHRoZXJlIGlzIGEgdmFsdWUgZm9yIHN0eWxlIGF0dHJpYnV0ZSBpbiA8Y29kZT5zYkFubm90YXRpb248L2NvZGU+IHJldHVybnMgdGhhdCB2YWx1ZQ0KLQkgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUuDQotCSAqIEBwYXJhbSBzYkFubm90YXRpb24NCi0JICogQHJldHVybiB0aGUgc3R5bGUNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1N0eWxlIGRlZmluZVNCU3R5bGUoZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gc2JBbm5vdGF0aW9uKQ0KLQl7DQotCQlmaW5hbCBTdHJpbmcgdmFsdWUgPSBzYkFubm90YXRpb24hPW51bGwgPyBzYkFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShTQkFubm90YXRpb25GZWF0dXJlcy5TVFlMRV9BVFRSSUJVVEUpIDogbnVsbDsNCi0JCWlmICh2YWx1ZSE9bnVsbCAmJiBTQkFubm90YXRpb25GZWF0dXJlcy5TQl9TVFlMRV9SUEMuZW5kc1dpdGgodmFsdWUudHJpbSgpKSkgew0KLQkJCXJldHVybiBTT0FQQmluZGluZ1N0eWxlLlJQQzsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQ7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBEZWZpbmVzIHRoZSBTT0FQQmluZGluZ1VzZS4gSWYgdGhlcmUgaXMgYSB2YWx1ZSBmb3IgdXNlIGF0dHJpYnV0ZSBpbiA8Y29kZT5zYkFubm90YXRpb248L2NvZGU+IHJldHVybnMgdGhhdCB2YWx1ZQ0KLQkgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUuDQotCSAqIEBwYXJhbSBzYkFubm90YXRpb24NCi0JICogQHJldHVybiB0aGUgc3R5bGUNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1VzZSBkZWZpbmVTQlVzZShmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBzYkFubm90YXRpb24pIHsNCi0JCWZpbmFsIFN0cmluZyB2YWx1ZSA9IHNiQW5ub3RhdGlvbiE9bnVsbCA/IHNiQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlVTRV9BVFRSSUJVVEUpIDogbnVsbDsNCi0JCWlmKHZhbHVlIT1udWxsICYmIFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNCX1VTRV9FTkNPREVELmVuZHNXaXRoKHZhbHVlLnRyaW0oKSkpIHsNCi0JCQlyZXR1cm4gU09BUEJpbmRpbmdVc2UuRU5DT0RFRDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIFNPQVBCaW5kaW5nVXNlLkxJVEVSQUw7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBEZWZpbmVzIHRoZSBTT0FQQmluZGluZ1VzZS4gSWYgdGhlcmUgaXMgYSB2YWx1ZSBmb3IgcGFyYW1ldGVyU3R5bGUgYXR0cmlidXRlIGluIDxjb2RlPnNiQW5ub3RhdGlvbjwvY29kZT4gDQotCSAqIHJldHVybnMgdGhhdCB2YWx1ZSBvdGhlcndpc2UgcmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUuDQotCSAqIEBwYXJhbSBzYkFubm90YXRpb24NCi0JICogQHJldHVybiB0aGUgc3R5bGUNCi0JICovCQ0KLQlwdWJsaWMgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBkZWZpbmVTQlBhcmFtZXRlclN0eWxlKGZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHNiQW5ub3RhdGlvbikNCi0Jew0KLQkJZmluYWwgU3RyaW5nIHZhbHVlID0gc2JBbm5vdGF0aW9uIT1udWxsID8gc2JBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoU0JBbm5vdGF0aW9uRmVhdHVyZXMuUEFSQU1FVEVSX1NUWUxFX0FUVFJJQlVURSkgOiBudWxsOw0KLQkJaWYgKHZhbHVlIT1udWxsICYmIFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNCX1BBUkFNRVRFUl9TVFlMRV9CQVJFLmVuZHNXaXRoKHZhbHVlLnRyaW0oKSkpIHsNCi0JCQlyZXR1cm4gU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEOwkJDQotCX0JDQotCQ0KLQkvKioNCi0JICogRGVmaW5lcyB0aGUgZGVmYXVsdCBvcGVyYXRpb24gcGFyYW1ldGVyIG5hbWUgYWNjb3JkaW5nIHRvIEpTUi0xODEgcG9pbnQgNC40IC0gV2ViUGFyYW0gbmFtZQ0KLQkgKiBhdHRyaWJ1dGUgIA0KLQkgKiBAcGFyYW0gd2ViTWV0aG9kIHRoZSBtZXRob2QgaG9sZGluZyB0aGUgcGFyYW1ldGVyDQotCSAqIEBwYXJhbSBwYXJhbVBvc2l0aW9uIHRoZSBwYXJhbWV0ZXIgcG9zaXRpb24gaW4gbWV0aG9kIGFyZ3VtZW50cyBsaXN0IHN0YXJ0aW5nIHdpdGggMA0KLQkgKiBAcmV0dXJuIGNhbGN1bGF0ZWQgbmFtZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBjYWxjV2ViUGFyYW1EZWZhdWx0TmFtZShmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgZmluYWwgaW50IHBhcmFtUG9zaXRpb24pDQotCXsNCi0JCWlmKHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1N0eWxlKCk9PVNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQgJiYNCi0JCSAgIHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk9PVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRSkgDQotCQl7DQotCQkJcmV0dXJuIHdlYk1ldGhvZC5nZXROYW1lKCk7DQotCQl9DQotCQkNCi0JCXJldHVybiBBUkcgKyBwYXJhbVBvc2l0aW9uOyANCi0JfQ0KLQkNCi0JLyoqDQotCSAqIERlZmluZXMgdGhlIGRlZmF1bHQgb3BlcmF0aW9uIHBhcmFtZXRlciBuYW1lIGFjY29yZGluZyB0byBKU1ItMTgxIHBvaW50IDQuNCAtIFdlYlBhcmFtIG5hbWUNCi0JICogYXR0cmlidXRlIA0KLQkgKiBAcGFyYW0gd2ViUGFyYW0NCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBjYWxjV2ViUGFyYW1EZWZhdWx0TmFtZShmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0pIA0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKXdlYlBhcmFtLmVDb250YWluZXIoKTsNCi0JCXJldHVybiBjYWxjV2ViUGFyYW1EZWZhdWx0TmFtZSh3ZWJNZXRob2QsIGdldFBhcmFtUG9zaXRpb24od2ViTWV0aG9kLCB3ZWJQYXJhbSkpOwkJDQotCX0NCi0JDQotCS8qKg0KLQkgKiBDYWxjdWxhdGVzIHRoZSBwb3NpdGlvbiBvZiA8Y29kZT5wYXJhbTwvY29kZT4gaW4gPGNvZGU+bWV0aG9kPC9jb2RlPiBzaWduYXR1cmUgc3RhcnRpbmcgZnJvbSAwDQotCSAqIEBwYXJhbSB3ZWJNZXRob2QNCi0JICogQHBhcmFtIHBhcmFtDQotCSAqIEByZXR1cm4gdGhlIHBhcmFtIHBvc2l0aW9uDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+d2ViTWV0aG9kPC9jb2RlPiBkb2VzIG5vdCBjb250YWluIDxjb2RlPnBhcmFtPC9jb2RlPg0KLQkgKi8NCi0JcHJvdGVjdGVkIGludCBnZXRQYXJhbVBvc2l0aW9uKGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kLCBmaW5hbCBJV2ViUGFyYW0gcGFyYW0pDQotCXsNCi0JCWludCBwb3NpdGlvbiA9IDA7DQotCQlmb3IgKElXZWJQYXJhbSB3ZWJQYXJhbSA6IHdlYk1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkpIA0KLQkJew0KLQkJCWlmICh3ZWJQYXJhbS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscygicmV0dXJuIikpIHsvLyROT04tTkxTLTEkDQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlpZiAod2ViUGFyYW09PXBhcmFtKSB7DQotCQkJCXJldHVybiBwb3NpdGlvbjsNCi0JCQl9DQotCQkJDQotCQkJcG9zaXRpb24rKzsNCi0JCX0NCi0JCQ0KLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUGFyYW1ldGVyWyIgKyBwYXJhbS5nZXRJbXBsZW1lbnRhdGlvbigpICsgIl0gd2FzIG5vdCBmb3VuZCBpbiBtZXRob2QgWyIgKyB3ZWJNZXRob2QuZ2V0SW1wbGVtZW50YXRpb24oKSArICJdIik7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTMkDQotCX0NCi0JDQotCS8qKg0KLQkgKiBEZWZpbmVzIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBwYXJhbWV0ZXIgbmFtZSBhY2NvcmRpbmcgdG8gSlNSLTE4MSBwb2ludCA0LjQgLSBXZWJQYXJhbSB0YXJnZXQgTlMuDQotCSAqIEBwYXJhbSB3ZWJNZXRob2QgdGhlIG1ldGhvZCBob2xkaW5nIHRoZSBwYXJhbWV0ZXINCi0JICogQHBhcmFtIHdlYlBhcmFtDQotCSAqIEByZXR1cm4gY2FsY3VsYXRlZCBOUw0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBjYWxjV2ViUGFyYW1EZWZhdWx0VGFyZ2V0TlMoZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QsIGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJaWYod2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nU3R5bGUoKT09U09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCAmJg0KLQkJICAgd2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKT09U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEICYmDQotCQkgICAhd2ViUGFyYW0uaXNIZWFkZXIoKSkgDQotCQl7DQotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuICgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSl3ZWJNZXRob2QuZUNvbnRhaW5lcigpKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQga2luZCBmb3Igd2ViIHBhcmFtZXRlcnMgLSByZXR1cm5zIHtAbGluayBXZWJQYXJhbUtpbmQjSU59DQotCSAqLw0KLQlwdWJsaWMgV2ViUGFyYW1LaW5kIGdldERlZmF1bHRQYXJhbUtpbmQoKSB7DQotCQlyZXR1cm4gV2ViUGFyYW1LaW5kLklOOwkJDQotCX0NCi0JDQotCS8qKg0KLQkgKiBAcmV0dXJuIGZhbHNlIGJlY2F1c2UgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIFdlYlBhcmFtKGhlYWRlcikgaXMgZmFsc2UNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGdldERlZmF1bHRQYXJhbUluSGVkYWVyKCkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQkvKioNCi0JICogRGVmaW5lcyB0aGUgZGVmYXVsdCBvcGVyYXRpb24gcGFyYW1ldGVyIG5hbWUgYWNjb3JkaW5nIHRvIEpTUi0xODEgcG9pbnQgNC41IC0gV2ViUmVzdWx0IG5hbWUuDQotCSAqIEBwYXJhbSB3ZWJNZXRob2QgdGhlIG1ldGhvZCBob2xkaW5nIHRoZSBwYXJhbWV0ZXINCi0JICogQHJldHVybiBjYWxjdWxhdGVkIG5hbWUNCi0JICovCQ0KLQlwdWJsaWMgU3RyaW5nIGNhbGNXZWJSZXN1bHREZWZhdWx0TmFtZShmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCkgDQotCXsNCi0JCWlmKHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1N0eWxlKCk9PVNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQgJiYgDQotCQkgICB3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpPT1TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUpDQotCQl7DQotCQkJcmV0dXJuIHdlYk1ldGhvZC5nZXROYW1lKCkgKyBSRVNQT05TRTsgDQotCQl9DQotCQkNCi0JCXJldHVybiBSRVRVUk47DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9KYXhXc1dvcmtzcGFjZVJlc291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0pheFdzV29ya3NwYWNlUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTA5NWNkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0pheFdzV29ya3NwYWNlUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyLlNlcmlhbGl6ZXJBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmMuSW5pdGlhbE1vZGVsU3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYy5PbkV2ZW50TW9kZWxTeW5jaHJvbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZmFjZXRzLkZhY2V0VXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5mYWNldHMuSUZhY2V0VXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBSZXByZXNlbnRzIHRoZSByZXNvdXJjZSBmb3IgSkFYLVdTIHdlYiBzZXJ2aWNlIERPTSBtb2RlbC4gVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgbG9hZGluZyB0aGUgDQotICogbW9kZWwuIEl0IGlzIGNhcGFibGUgdG8gdXNlIHtAbGluayBJUHJvZ3Jlc3NNb25pdG9yfSB0byB0cmFjayBwcm9ncmVzcyBhbmQgY2FuY2VsIHJlcXVlc3RzLg0KLSAqIA0KLSAqIEBhdXRob3IgDQotICovDQotcHVibGljIGNsYXNzIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgZXh0ZW5kcyBOb25TdHJlYW1SZXNvdXJjZQ0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBJSmF2YU1vZGVsIGphdmFNb2RlbDsNCi0JcHJpdmF0ZSBmaW5hbCBTZXJ2aWNlTW9kZWxEYXRhIHNlcnZpY2VEYXRhOw0KLQlwcml2YXRlIGZpbmFsIE9uRXZlbnRNb2RlbFN5bmNocm9uaXplciBtb2RlbFN5bmNocm9uaXplcjsNCi0JcHJpdmF0ZSBmaW5hbCBTZXJpYWxpemVyQWRhcHRlckZhY3Rvcnkgc2VyaWFsaXplckZhY3Rvcnk7IA0KLQ0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsNCi0JDQotCXByaXZhdGUgYm9vbGVhbiBzYXZlRW5hYmxlZDsNCi0JcHJpdmF0ZSBib29sZWFuIGxvYWRDbmFjZWxlZDsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIEBwYXJhbSBqYXZhTW9kZWwNCi0JICovDQotCXB1YmxpYyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKGZpbmFsIElKYXZhTW9kZWwgamF2YU1vZGVsKQ0KLQl7DQotCQl0aGlzLmphdmFNb2RlbCA9IGphdmFNb2RlbDsNCi0JCXNlcnZpY2VEYXRhID0gbmV3IFNlcnZpY2VNb2RlbERhdGEoKTsNCi0JCW1vZGVsU3luY2hyb25pemVyID0gbmV3IE9uRXZlbnRNb2RlbFN5bmNocm9uaXplcih0aGlzLCBzZXJ2aWNlRGF0YSk7DQotCQlzYXZlRW5hYmxlZCA9IHRydWU7DQotCQlzZXJpYWxpemVyRmFjdG9yeSA9IG5ldyBTZXJpYWxpemVyQWRhcHRlckZhY3RvcnkodGhpcyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldCBwcm9ncmVzcyBtb25pdG9yIGluIGNhc2UgdGhlIHByb2Nlc3NpbmcgcHJvZ3Jlc3Mgc2hvdWxkIGJlIHRyYWNrZWQgYW5kDQotCSAqIGFsc28gaW4gY2FzZSBpdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBwcm9jZXNzaW5nIGNhbiBiZSBjYW5jZWxlZCANCi0JICogQHBhcmFtIHBtIHRoZSBtb25pdG9yIC0gY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBwbSkNCi0Jew0KLQkJdGhpcy5tb25pdG9yID0gcG07DQotCX0NCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIGxvYWRlZCBET00gaW4gY2FzZSBpdCBpcyBzdWNjZXNzZnVsbHkgbG9hZGVkLiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBpbiBjYXNlIGxvYWRpbmcgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgYXQgYWxsIG9yIGluIGNhc2UgbG9hZGluZyBoYXMgYmVlbiBjYW5jZWxlZC4gVG8gY2hlY2sgaWYgdGhlDQotCSAqIGxvYWRpbmcgaGFzIGJlZW4gY2FuY2VsZWQgY2FsbCBpc0xvYWRpbmdDYW5jZWxlZCgpLg0KLQkgKi8NCi0JcHVibGljIElET00gZ2V0RE9NKCkNCi0Jew0KLQkJaWYgKGdldENvbnRlbnRzKCkuc2l6ZSgpID09IDApIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIChJRE9NKSBnZXRDb250ZW50cygpLmdldCgwKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQWRkcyBsaXN0ZW5lciBmb3IgY2hhbmdlcyB0byBKYXZhIGVsZW1lbnRzIGluIG9yZGVyIHRvIGtlZXAgdGhlIG1vZGVsIGluIHN5bmMNCi0JICogd2l0aCB0aGVzZSBjaGFuZ2VzDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdGFydFN5bmNocm9uaXppbmcoKQ0KLQl7DQotCQlKYXZhQ29yZS5hZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKG1vZGVsU3luY2hyb25pemVyLCBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfUkVDT05DSUxFIHwgRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX0NIQU5HRSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJlbW92ZXMgbGlzdGVuZXIgZm9yIGNoYW5nZXMgdG8gSmF2YSBlbGVtZW50cy4gS2VlcCBpbiBtaW5kIHRoYXQgYWZ0ZXIgY2FsbGluZw0KLQkgKiB0aGlzIG1ldGhvZCBjaGFuZ2VzIGluIGphdmEgZWxlbWVudHMgd2lsbCBub3QgYmUgcmVmbGVjdGVkIGluIERPTSBtb2RlbA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RvcFN5bmNocm9uaXppbmcoKQ0KLQl7DQotCQlKYXZhQ29yZS5yZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKG1vZGVsU3luY2hyb25pemVyKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgbG9nZ2VyIHRvIHVzZSB3aGVuIHNvbWUgZXZlbnQgbmVlZHMgdG8gYmUgbG9nZ2VkDQotCSAqLw0KLQlwdWJsaWMgSUxvZ2dlciBsb2dnZXIoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IExvZ2dlcigpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgamF2YSBtb2RlbA0KLQkgKi8NCi0JcHVibGljIElKYXZhTW9kZWwgamF2YU1vZGVsKCkNCi0Jew0KLQkJcmV0dXJuIGphdmFNb2RlbDsNCi0JfQkNCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCB2b2lkIGRvTG9hZChmaW5hbCBNYXA8PywgPz4gb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCWxvYWRDbmFjZWxlZCA9IGZhbHNlOw0KLQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOw0KLQ0KLQkJZmluYWwgSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpDQotCQl7DQotCQkJcHVibGljIHZvaWQgcnVuKGZpbmFsIElQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JCQl7DQotCQkJCXRyeSANCi0JCQkJewkJDQotCQkJCQluZXcgSW5pdGlhbE1vZGVsU3luY2hyb25pemVyKEpheFdzV29ya3NwYWNlUmVzb3VyY2UudGhpcywgc2VydmljZURhdGEpLmxvYWQob3B0aW9ucywgc3ViTW9uaXRvcik7DQotCQkJCX0gDQotCQkJCWNhdGNoIChXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiBlKSB7DQotCQkJCQlsb2FkQ25hY2VsZWQgPSB0cnVlOw0KLQkJCQkJbG9nZ2VyKCkubG9nRXJyb3IoIkpBWCBXUyBXZWIgU2VydmljZXMgRE9NIGxvYWRpbmcgaGFzIGJlZW4gY2FuY2VsZWQgYnkgdGhlIHVzZXIsIHNvbWUgSkFYIFdTIFdlYiBTZXJ2aWNlcyBmdW5jdGlvbmFsaXRpZXMgd29uJ3QgYmUgYXZhaWxhYmxlIiwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJfQ0KLQkJCX0NCi0JCX07DQotCQkNCi0JCXRyeSB7DQotCQkJamF2YU1vZGVsKCkuZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBtb25pdG9yKTsNCi0JCX0gDQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgew0KLQkJCXRocm93IG5ldyBJT1dyYXBwZWRFeGNlcHRpb24oY2UpOw0KLQkJfQ0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlKE1hcDw/LCA/PiBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24Jew0KLQkJLy8gbm8gcHJvY2Vzc2luZyBuZWVkZWQNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgZ2V0U3luY2hyb25pemluZ0xpc3RlbmVyKCkgew0KLQkJcmV0dXJuIG1vZGVsU3luY2hyb25pemVyOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ3JlYXRlcyBjb21waWxhdGlvbiB1bml0IGZpbmRlciB0aGF0IGNyYXdscyB0aHJvdWdoIGphdmFNb2RlbCBhbmQgY2FsbHMgDQotCSAqIGNvbXBpbGF0aW9uIHVuaXQgaGFuZGxlciB0byBwcm9jZXNzIGF2YWlsYWJsZSBDVSdzIA0KLQkgKiBAcGFyYW0gak1vZGVsDQotCSAqIEBwYXJhbSBwcm9qZWN0U2VsZWN0b3JzDQotCSAqIEByZXR1cm4gbm9uIDxjb2RlPm51bGw8L2NvZGU+IHtAbGluayBJQ29tcGlsYXRpb25Vbml0RmluZGVyfSBpbnN0YW5jZSANCi0JICovDQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0RmluZGVyIG5ld0NvbXBpbGF0aW9uVW5pdEZpbmRlcihmaW5hbCBJSmF2YU1vZGVsIGpNb2RlbCwgZmluYWwgSVByb2plY3RTZWxlY3RvcltdIHByb2plY3RTZWxlY3RvcnMpDQotCXsNCi0JCXJldHVybiBuZXcgV29ya3NwYWNlQ1VGaW5kZXIoak1vZGVsLCBwcm9qZWN0U2VsZWN0b3JzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQXBwcm92ZXMgdGhhdCA8Y29kZT5wcmo8L2NvZGU+IGlzIEpBWC1XUyB3ZWIgc2VydmljZSBlbmFibGVkIA0KLQkgKiBAcGFyYW0gcHJqDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW4gY2FzZSB0aGlzIHByb2plY3QgbWlnaHQgY29udGFpbiBKQVgtV1Mgd2ViIHNlcnZpY2VzDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBhcHByb3ZlUHJvamVjdChmaW5hbCBJSmF2YVByb2plY3QgcHJqKQ0KLQl7DQotCQlmaW5hbCBJRmFjZXRVdGlscyBmYWNldFV0aWxzID0gbmV3IEZhY2V0VXRpbHMoKTsNCi0JCXRyeSB7DQotCQkJcmV0dXJuIGZhY2V0VXRpbHMuaGFzRmFjZXRXaXRoVmVyc2lvbihwcmouZ2V0UHJvamVjdCgpLCBGYWNldFV0aWxzLkVKQl8zMF9GQUNFVF9WRVJTSU9OLCBGYWNldFV0aWxzLkVKQl8zMF9GQUNFVF9JRCwgdHJ1ZSkNCi0JCQkJfHwgZmFjZXRVdGlscy5oYXNGYWNldFdpdGhWZXJzaW9uKHByai5nZXRQcm9qZWN0KCksIEZhY2V0VXRpbHMuV0VCXzI1X0ZBQ0VUX1ZFUlNJT04sIEZhY2V0VXRpbHMuV0VCXzI1X0ZBQ0VUX0lELCB0cnVlKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpDQotCQl7DQotCQkJbG9nZ2VyKCkubG9nRXJyb3IoIlVuYWJsZSB0byByZWFkIGZhY2V0IG9uIHByb2plY3QgIiArIHByai5nZXRFbGVtZW50TmFtZSgpICsgIi4gQW55IFdlYiBTZXJ2aWNlIGVsZW1lbnRzIGluIHRoaXMgcHJvamVjdCB3aWxsIG5vdCBiZSBzaG93biBpbiB0aGUgbmF2aWdhdGlvbiB0cmVlIiwgY2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDcmVhdGVzIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgSUFubm90YXRpb25JbnNwZWN0b3J9IGZvciA8Y29kZT50eXBlPC9jb2RlPg0KLQkgKiBAcGFyYW0gdHlwZQ0KLQkgKiBAcmV0dXJuIG5vbiA8Y29kZT5udWxsPC9jb2RlPiBpbnNwZWN0b3INCi0JICovDQotCXB1YmxpYyBJQW5ub3RhdGlvbkluc3BlY3RvciBuZXdBbm5vdGF0aW9uSW5zcGVjdG9yKGZpbmFsIElUeXBlIHR5cGUpDQotCXsNCi0JCXJldHVybiBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKHR5cGUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIG5vbiBlbXB0eSBhcnJheSBvZiBwcm9qZWN0cyBzZWxlY3RvcnMgcmVzcG9uc2libGUgZm9yIGZpbHRlcmluZyBwcm9jZXNzZWQgcHJvamVjdHMgDQotCSAqLw0KLQlwdWJsaWMgSVByb2plY3RTZWxlY3RvcltdIGdldFByb2plY3RTZWxlY3RvcnMoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IElQcm9qZWN0U2VsZWN0b3JbXSB7IG5ldyBJUHJvamVjdFNlbGVjdG9yKCkNCi0JCXsNCi0JCQlwdWJsaWMgYm9vbGVhbiBhcHByb3ZlKElKYXZhUHJvamVjdCBwcmopDQotCQkJew0KLQkJCQlyZXR1cm4gYXBwcm92ZVByb2plY3QocHJqKTsNCi0JCQl9DQotCQl9IH07DQotCX0NCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIHNlcmlhbGl6ZXIgZmFjdG9yeSB1c2VkIHRvIGFkYXB0IERPTSBvYmplY3RzIHdpdGggc2VyaWFsaXplciBhZGFwdGVycyAgDQotCSAqLw0KLQlwdWJsaWMgU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5IGdldFNlcmlhbGl6ZXJGYWN0b3J5KCkgew0KLQkJcmV0dXJuIHNlcmlhbGl6ZXJGYWN0b3J5Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzYXZpbmcgaXMgZW5hYmxlZA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlRW5hYmxlZCgpIHsNCi0JCXJldHVybiBzYXZlRW5hYmxlZDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogY2FsbCB0aGlzIG1ldGhvZCB0byBlbmFibGUgc2F2aW5nIG9mIG1vZGVsIG9iamVjdHMgdG8gdW5kZXJseWluZyByZXNvdXJjZXMNCi0JICovDQotCXN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBlbmFibGVTYXZpbmcoKSB7DQotCQl0aGlzLnNhdmVFbmFibGVkID0gdHJ1ZTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIGNhbGwgdGhpcyBtZXRob2QgdG8gZGlzYWJsZSBzYXZpbmcgb2YgbW9kZWwgb2JqZWN0cyB0byB1bmRlcmx5aW5nIHJlc291cmNlcw0KLQkgKi8NCi0Jc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIGRpc2FibGVTYXZpbmcoKSB7DQotCQl0aGlzLnNhdmVFbmFibGVkID0gZmFsc2U7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgdGhlIGxvYWQgb2YgRE9NIG1vZGVsIGhhcyBiZWVuIGNhbmNlbGVkDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRDbmFjZWxlZCgpIHsNCi0JCXJldHVybiBsb2FkQ25hY2VsZWQ7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBIb2xkcyBtb2RlbCBkYXRhIGhlbHBmdWwgaW4gbW9kZWwgcHJvY2Vzc2luZw0KLQkgKi8NCi0JcHVibGljIGNsYXNzIFNlcnZpY2VNb2RlbERhdGENCi0Jew0KLQkJcHJpdmF0ZSBNYXA8SVdlYlNlcnZpY2UsIFN0cmluZz4gd3Myc2VpID0gbmV3IEhhc2hNYXA8SVdlYlNlcnZpY2UsIFN0cmluZz4oKTsNCi0NCi0JCXByaXZhdGUgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxJV2ViU2VydmljZT4+IHNlaTJ3cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ29sbGVjdGlvbjxJV2ViU2VydmljZT4+KCk7DQotDQotCQlwcml2YXRlIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248SUNvbXBpbGF0aW9uVW5pdD4+IHR5cGUyaW5oZXJpdGVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPElDb21waWxhdGlvblVuaXQ+PigpOw0KLQ0KLQkJcHVibGljIHZvaWQgbWFwKElXZWJTZXJ2aWNlIHdzLCBTdHJpbmcgc2VpSW1wbCkNCi0JCXsNCi0JCQl3czJzZWkucHV0KHdzLCBzZWlJbXBsKTsNCi0JCQlnZXRJbXBsZW1lbnRpbmdXcyhzZWlJbXBsKS5hZGQod3MpOw0KLQkJfQ0KLQ0KLQkJU3RyaW5nIGdldFNlaUltcGwoSVdlYlNlcnZpY2Ugd3MpDQotCQl7DQotCQkJcmV0dXJuIHdzMnNlaS5nZXQod3MpOw0KLQkJfQ0KLQ0KLQkJcHVibGljIENvbGxlY3Rpb248SVdlYlNlcnZpY2U+IGdldEltcGxlbWVudGluZ1dzKFN0cmluZyBzZWlJbWwpDQotCQl7DQotCQkJQ29sbGVjdGlvbjxJV2ViU2VydmljZT4gd3NzID0gc2VpMndzLmdldChzZWlJbWwpOw0KLQkJCWlmICh3c3MgPT0gbnVsbCkNCi0JCQl7DQotCQkJCXdzcyA9IG5ldyBBcnJheUxpc3Q8SVdlYlNlcnZpY2U+KCk7DQotCQkJCXNlaTJ3cy5wdXQoc2VpSW1sLCB3c3MpOw0KLQkJCX0NCi0JCQlyZXR1cm4gd3NzOw0KLQkJfQ0KLQ0KLQkJcHVibGljIHZvaWQgdW5tYXAoSVdlYlNlcnZpY2Ugd3MpDQotCQl7DQotCQkJZmluYWwgU3RyaW5nIHNlaSA9IHdzMnNlaS5yZW1vdmUod3MpOw0KLQkJCWZpbmFsIENvbGxlY3Rpb248SVdlYlNlcnZpY2U+IGltcGxlbWVudGluZ1dlYlNlcnZpY2VzID0gZ2V0SW1wbGVtZW50aW5nV3Moc2VpKTsNCi0JCQlpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcy5yZW1vdmUod3MpOw0KLQkJCWlmIChpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcy5zaXplKCkgPT0gMCkNCi0JCQl7DQotCQkJCXNlaTJ3cy5yZW1vdmUoc2VpKTsNCi0JCQl9DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCByZWNvcmRIaWVyYXJjaHkoU3RyaW5nIGZxTmFtZSwgQ29sbGVjdGlvbjxJQ29tcGlsYXRpb25Vbml0PiBpbmhlcml0ZWRUeXBlcykNCi0JCXsNCi0JCQl0eXBlMmluaGVyaXRlZC5wdXQoZnFOYW1lLCBpbmhlcml0ZWRUeXBlcyk7DQotCQl9DQotDQotCQkvKioNCi0JCSAqIEBwYXJhbSBmcU5hbWUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lDQotCQkgKiBAcmV0dXJuIGNvbGxlY3Rpb24gb2YgY2xhc3NlcyB0aGF0IGFyZSBzdXBlciBmb3IgY2xhc3MgPGNvZGU+ZnFOYW1lPC9jb2RlPg0KLQkJICovDQotCQlwdWJsaWMgQ29sbGVjdGlvbjxJQ29tcGlsYXRpb25Vbml0PiBnZXRIaWVyYXJjaHkoU3RyaW5nIGZxTmFtZSkNCi0JCXsNCi0JCQlyZXR1cm4gdHlwZTJpbmhlcml0ZWQuZ2V0KGZxTmFtZSk7DQotCQl9DQotDQotCQkvKioNCi0JCSAqIENsZWFycyByZWNvcmRlciBoaWVyYXJjaHkgZm9yIGNsYXNzIHdpdGggRlFOYW1lIDxjb2RlPmZxTmFtZTwvY29kZT4NCi0JCSAqIEBwYXJhbSBmcU5hbWUNCi0JCSAqLw0KLQkJcHVibGljIHZvaWQgY2xlYXJIaWVyYXJjaHkoU3RyaW5nIGZxTmFtZSkNCi0JCXsNCi0JCQl0eXBlMmluaGVyaXRlZC5yZW1vdmUoZnFOYW1lKTsNCi0JCX0NCi0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0plZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZjEyZDJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RPTVJ1bnRpbWVFeHRlbnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRG9tTG9hZExpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZU1lc3NhZ2VzOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbTsNCi0NCi1wdWJsaWMgY2xhc3MgSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbiBpbXBsZW1lbnRzIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24NCi17DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uamVlNSI7Ly8kTk9OLU5MUy0xJA0KLQkNCi0JcHJpdmF0ZSBMaXN0PElXc0RvbUxvYWRMaXN0ZW5lcj4gbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJV3NEb21Mb2FkTGlzdGVuZXI+KCk7DQotCXByaXZhdGUgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSB3b3Jrc3BhY2VSZXNvdXJjZTsNCi0JcHJpdmF0ZSBib29sZWFuIGZpbmlzaGVkOw0KLQlwcml2YXRlIGJvb2xlYW4gc3RhcnRlZDsNCi0NCi0JcHVibGljIHZvaWQgY3JlYXRlRE9NKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uLCBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbg0KLQl7DQotCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLmJlZ2luUnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCBtb25pdG9yKTsNCi0JCXRyeSB7DQotCQkJaWYgKHdvcmtzcGFjZVJlc291cmNlID09IG51bGwgfHwgd29ya3NwYWNlUmVzb3VyY2UuaXNMb2FkQ25hY2VsZWQoKSkgewkJCQ0KLQkJCQlwZXJmb3JtTG9hZChtb25pdG9yKTsNCi0JCQl9DQotCQl9IGZpbmFsbHkgew0KLQkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkuZW5kUnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcGVyZm9ybUxvYWQoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIA0KLQl7DQotCQl3b3Jrc3BhY2VSZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlKCk7DQotCQl3b3Jrc3BhY2VSZXNvdXJjZS5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7DQotCQl0cnkgew0KLQkJCXN0YXJ0ZWQoKTsNCi0JCQl3b3Jrc3BhY2VSZXNvdXJjZS5sb2FkKG51bGwpOw0KLQkJCWlmICh3b3Jrc3BhY2VSZXNvdXJjZS5pc0xvYWRDbmFjZWxlZCgpKSB7DQotCQkJCXRocm93IGNyZWF0ZUNhbmNlbGVkRXhjZXB0aW9uKCk7DQotCQkJfQ0KLQkJfSBmaW5hbGx5IHsNCi0JCQlmaW5pc2hlZCgpOw0KLQkJfQ0KLQkJDQotCQl3b3Jrc3BhY2VSZXNvdXJjZS5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSURPTSBnZXRET00oKSB0aHJvd3MgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24NCi0Jew0KLQkJaWYgKHdvcmtzcGFjZVJlc291cmNlID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJaWYgKHdvcmtzcGFjZVJlc291cmNlLmlzTG9hZENuYWNlbGVkKCkpIHsNCi0JCQl0aHJvdyBjcmVhdGVDYW5jZWxlZEV4Y2VwdGlvbigpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gd29ya3NwYWNlUmVzb3VyY2UuZ2V0RE9NKCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIGFkZExvYWRMaXN0ZW5lcihJV3NEb21Mb2FkTGlzdGVuZXIgbGlzdGVuZXIpIA0KLQl7DQotCQludWxsQ2hlY2tQYXJhbShsaXN0ZW5lciwgImxpc3RlbmVyIik7Ly8kTk9OLU5MUy0xJA0KLQkJDQotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgew0KLQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOw0KLQkJfQ0KLQkJDQotCQlpZiAoc3RhcnRlZCkgew0KLQkJCWxpc3RlbmVyLnN0YXJ0ZWQoKTsJCQkNCi0JCX0NCi0JCQ0KLQkJaWYgKGZpbmlzaGVkKSB7DQotCQkJbGlzdGVuZXIuZmluaXNoZWQoKTsJCQkNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgcmVtb3ZlTG9hZExpc3RlbmVyKElXc0RvbUxvYWRMaXN0ZW5lciBsaXN0ZW5lcikgDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKGxpc3RlbmVyLCAibGlzdGVuZXIiKTsvLyROT04tTkxTLTEkDQotCQkNCi0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7DQotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7DQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCBJSmF2YU1vZGVsIGphdmFNb2RlbCgpIHsNCi0JCXJldHVybiBKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIGNyZWF0ZVJlc291cmNlKCkgeyANCi0JCXJldHVybiBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwoKSk7DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIGZpbmlzaGVkKCkgDQotCXsNCi0JCWZpbmlzaGVkID0gdHJ1ZTsNCi0JCWZvciAoSVdzRG9tTG9hZExpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7DQotCQkJbGlzdGVuZXIuZmluaXNoZWQoKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgdm9pZCBzdGFydGVkKCkgDQotCXsNCi0JCXN0YXJ0ZWQgPSB0cnVlOw0KLQkJZmluaXNoZWQgPSBmYWxzZTsNCi0JCWZvciAoSVdzRG9tTG9hZExpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7DQotCQkJbGlzdGVuZXIuc3RhcnRlZCgpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIGNyZWF0ZUNhbmNlbGVkRXhjZXB0aW9uKCkgew0KLQkJcmV0dXJuIG5ldyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbigiSkFYLVdTIERPTSBsb2FkaW5nIGNhbmNlbGVkIiwgSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuV29ya3NwYWNlQ1VGaW5kZXJfTE9BRElOR19DQU5DRUxFRCk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL05vblN0cmVhbVJlc291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL05vblN0cmVhbVJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmNmE1YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9Ob25TdHJlYW1SZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUltcGw7DQotDQotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vblN0cmVhbVJlc291cmNlIGV4dGVuZHMgUmVzb3VyY2VJbXBsIHsNCi0NCi0JLyoqDQotCSAqIFNpbmNlIHRoaXMgUmVzb3VyY2UgaXMgbm90IHN0cmVhbSBiYXNlZCwgdGhpcyBtZXRob2Qgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZC4NCi0JICogSWYgY2FsbGVkIGl0IHdpbGwgdGhyb3cgPGM+VW5zdXBwb3J0ZWRFeGNlcHRpb248L2M+DQotCSAqIEBwYXJhbSBhcmcwIC0gaWdub3JyZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBkb0xvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIE1hcDw/LD8+IG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlzdXBlci5kb0xvYWQoaW5wdXRTdHJlYW0sIG9wdGlvbnMpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogU2luY2UgdGhpcyBSZXNvdXJjZSBpcyBub3Qgc3RyZWFtIGJhc2VkLCB0aGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLg0KLQkgKiBJZiBjYWxsZWQgaXQgd2lsbCB0aHJvdyA8Yz5VbnN1cHBvcnRlZEV4Y2VwdGlvbjwvYz4NCi0JICogQHBhcmFtIGFyZzAgLSBpZ25vcnJlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGRvU2F2ZShPdXRwdXRTdHJlYW0gYXJnMCwgTWFwPD8sPz4gYXJnMSkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCXN1cGVyLmRvU2F2ZShhcmcwLCBhcmcxKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQWxsd2FzeSB0aHJvd3MgPGM+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2M+LiBTdHJlYW1zIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcmVzb3VyY2UuDQotCSAqIEByZXR1cm4gbm90aGluZy4gdGhpcyBtZXRob2QgYWxsd2F5cyB0aHJvd3MgPGM+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2M+DQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNDb250ZW50WmlwRW50cnkoWmlwRW50cnkgYXJnMCkgew0KLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNpbmNlIHRoaXMgcmVzb3VyY2UgZG9lc24ndCBzdXBwb3J0IHN0cmVhbXMgdGhpcyBtZXRob2Qgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZC4gQWxsd2FzeSB0aHJvd3MgPGM+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2M+Lg0KLQkgKiBAcmV0dXJuIG5vdGhpbmcuIHRoaXMgbWV0aG9kIGFsbHdheXMgdGhyb3dzIDxjPlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uPC9jPg0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBmaW5hbCBaaXBFbnRyeSBuZXdDb250ZW50WmlwRW50cnkoKSB7DQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFNpbmNlIHRoaXMgcmVzb3VyY2UgZG9lc24ndCBzdXBwb3J0IHN0cmVhbXMgdGhpcyBtZXRob2Qgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZC4gQWxsd2FzeSB0aHJvd3MgPGM+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2M+Lg0KLQkgKiBAcmV0dXJuIG5vdGhpbmcuIHRoaXMgbWV0aG9kIGFsbHdheXMgdGhyb3dzIDxjPlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uPC9jPg0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHVzZVppcCgpIHsNCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBsb2FkKE1hcDw/LD8+IG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotDQotCQlpZiAoIWlzTG9hZGVkKCkpIHsNCi0JCQlOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gc2V0TG9hZGVkKHRydWUpOw0KLQkJCWlzTG9hZGluZyA9IHRydWU7DQotCQkJaWYgKGVycm9ycyAhPSBudWxsKSB7DQotCQkJCWVycm9ycy5jbGVhcigpOw0KLQkJCX0NCi0JCQlpZiAod2FybmluZ3MgIT0gbnVsbCkgew0KLQkJCQl3YXJuaW5ncy5jbGVhcigpOw0KLQkJCX0NCi0JCQl0cnkgew0KLQkJCSAgICBNYXA8Pyw/PiBtZXJnZWRPcHRpb25zID0gbWVyZ2VNYXBzKG9wdGlvbnMsIGRlZmF1bHRMb2FkT3B0aW9ucyk7DQotCQkJCWRvTG9hZChtZXJnZWRPcHRpb25zKTsNCi0JCQl9IGZpbmFsbHkgew0KLQkJCQkNCi0JCQkJaXNMb2FkaW5nID0gZmFsc2U7DQotCQkJCWlmIChub3RpZmljYXRpb24gIT0gbnVsbCkgew0KLQkJCQkJZU5vdGlmeShub3RpZmljYXRpb24pOw0KLQkJCQl9DQotCQkJCXNldE1vZGlmaWVkKGZhbHNlKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDYWxsZWQgdG8gbG9hZCB0aGUgcmVzb3VyY2UgdXNpbmcgbm8gc3RyZWFtcy4NCi0JICoNCi0JICogQHBhcmFtIG9wdGlvbnMgLSBvcHRpb25zIHN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIuIFRoaXMgbWV0b2Qgd2lsbCBpZ25vcmUgYW55IG9wdGlvbnMgdGhhdCBpdCBkb2Vzbid0IHJlY29nbml6ZS4gVGhlIGtleXMgYW5kIHRoZSB2YWx1ZXMgY2FuIGJlIGFyYml0cmFyeSBvYmplY3RzLg0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0gdGhyb3duIGlmIGVycm9yIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgdGhlIGNvbnRlbnQgb2YgdGhpcyByZXNvdXJjZQ0KLQkgKi8NCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgZG9Mb2FkKE1hcDw/LD8+IG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbjsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBzYXZlKE1hcDw/LD8+IG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCSAgICBpZiAoZXJyb3JzICE9IG51bGwpDQotCSAgICB7DQotCSAgICAgIGVycm9ycy5jbGVhcigpOw0KLQkgICAgfQ0KLQkgICAgaWYgKHdhcm5pbmdzICE9IG51bGwpDQotCSAgICB7DQotCSAgICAgIHdhcm5pbmdzLmNsZWFyKCk7DQotCSAgICB9DQotCSAgICBNYXA8Pyw/PiBtZXJnZWRPcHRpb25zID0gbWVyZ2VNYXBzKG9wdGlvbnMsIGRlZmF1bHRTYXZlT3B0aW9ucyk7DQotCSAgICBkb1NhdmUobWVyZ2VkT3B0aW9ucyk7DQotCSAgICBzZXRNb2RpZmllZChmYWxzZSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDYWxsZWQgdG8gc2F2ZSB0aGUgcmVzb3VyY2UgdXNpbmcgbm8gc3RyZWFtcy4NCi0JICogQHBhcmFtIG9wdGlvbnMgLSBvcHRpb25zIHN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIuIFRoaXMgbWV0b2Qgd2lsbCBpZ25vcmUgYW55IG9wdGlvbnMgdGhhdCBpdCBkb2Vzbid0IHJlY29nbml6ZS4gVGhlIGtleXMgYW5kIHRoZSB2YWx1ZXMgY2FuIGJlIGFyYml0cmFyeSBvYmplY3RzLg0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0gaWYgcHJvYmxlbSBkdXJpbmcgdGhlIHNhdmluZyBvY2N1cnJlZC4NCi0JICovDQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvU2F2ZShNYXA8Pyw/PiBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb247DQotCQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1NCQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1NCQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhODFmYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9TQkFubm90YXRpb25GZWF0dXJlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotLyoqDQotICogQ29udGFpbnMgU09BUEJpbmRpbmcgYW5ub3RhdGlvbiBuYW1lLCBhdHRyaWJ1dGVzIGFuZCBwb3NzaWJsZSB2YWx1ZXMNCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFNCQW5ub3RhdGlvbkZlYXR1cmVzIA0KLXsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0JfQU5OT1RBVElPTiA9ICJqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFlMRV9BVFRSSUJVVEUgPSAic3R5bGUiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0FUVFJJQlVURSA9ICJ1c2UiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX1NUWUxFX0FUVFJJQlVURSA9ICJwYXJhbWV0ZXJTdHlsZSI7Ly8kTk9OLU5MUy0xJA0KLQkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0JfU1RZTEVfRE9DVU1FTlQgCT0gU0JfQU5OT1RBVElPTiArICIuU3R5bGUuRE9DVU1FTlQiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0JfU1RZTEVfUlBDIAkJPSBTQl9BTk5PVEFUSU9OICsgIi5TT0FQQmluZGluZy5TdHlsZS5SUEMiOy8vJE5PTi1OTFMtMSQNCi0JDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNCX1VTRV9MSVRFUkFMIAk9IFNCX0FOTk9UQVRJT04gKyAiLlVzZS5MSVRFUkFMIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNCX1VTRV9FTkNPREVEIAk9IFNCX0FOTk9UQVRJT04gKyAiLlVzZS5FTkNPREVEIjsvLyROT04tTkxTLTEkDQotCQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQl9QQVJBTUVURVJfU1RZTEVfQkFSRSAJCT0gU0JfQU5OT1RBVElPTiArICIuUGFyYW1ldGVyU3R5bGUuQkFSRSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQl9QQVJBTUVURVJfU1RZTEVfV1JBUFBFRAk9IFNCX0FOTk9UQVRJT04gKyAiLlBhcmFtZXRlclN0eWxlLldSQVBQRUQiOy8vJE5PTi1OTFMtMSQNCi0JDQotCQ0KLQlwcml2YXRlIFNCQW5ub3RhdGlvbkZlYXR1cmVzKCkgew0KLQkJLy8gbm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9XTUFubm90YXRpb25GZWF0dXJlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9XTUFubm90YXRpb25GZWF0dXJlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNDk4OWNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvV01Bbm5vdGF0aW9uRmVhdHVyZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXTUFubm90YXRpb25GZWF0dXJlcw0KLXsNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01fQU5OT1RBVElPTiA9ICJqYXZheC5qd3MuV2ViTWV0aG9kIjsvLyROT04tTkxTLTEkDQotDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNX05BTUVfQVRUUklCVVRFID0gIm9wZXJhdGlvbk5hbWUiOy8vJE5PTi1OTFMtMSQNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01fRVhDTFVERURfQVRUUklCVVRFID0gImV4Y2x1ZGUiOy8vJE5PTi1OTFMtMSQNCi0NCi0JcHJpdmF0ZSBXTUFubm90YXRpb25GZWF0dXJlcygpDQotCXsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dQQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dQQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ3YzMyZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9XUEFubm90YXRpb25GZWF0dXJlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotDQotLyoqDQotICogQ2xhc3MgdGhhdCBob2xkcyBpbmZvcm1hdGlvbiBvbiBqYXZheC5qd3MuV2ViUGFyYW0gYW5ub3RhdGlvbiBuYW1lIGFuZCBhdHRyaWJ1dGUgbmFtZXMuIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1maW5hbCBwdWJsaWMgY2xhc3MgV1BBbm5vdGF0aW9uRmVhdHVyZXMgDQotew0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUF9BTk5PVEFUSU9OID0gImphdmF4Lmp3cy5XZWJQYXJhbSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0FUVFJJQlVURSA9ICJuYW1lIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRfTkFNRV9BVFRSSUJVVEUgPSAicGFydE5hbWUiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEUgPSAidGFyZ2V0TmFtZXNwYWNlIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVfQVRUUklCVVRFID0gIm1vZGUiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0FUVFJJQlVURSA9ICJoZWFkZXIiOy8vJE5PTi1OTFMtMSQNCi0JDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9QQVJBTV9NT0RFID0gImphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9QQVJBTV9NT0RFX0lOID0gV0VCX1BBUkFNX01PREUgKyAiLklOIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9QQVJBTV9NT0RFX09VVCA9IFdFQl9QQVJBTV9NT0RFICsgIi5PVVQiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1BBUkFNX01PREVfSU5PVVQgPSBXRUJfUEFSQU1fTU9ERSArICIuSU5PVVQiOy8vJE5PTi1OTFMtMSQNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9XU0Fubm90YXRpb25GZWF0dXJlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9XU0Fubm90YXRpb25GZWF0dXJlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOWYxNWYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvV1NBbm5vdGF0aW9uRmVhdHVyZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWZpbmFsIHB1YmxpYyBjbGFzcyBXU0Fubm90YXRpb25GZWF0dXJlcw0KLXsNCi0JcHJpdmF0ZSBXU0Fubm90YXRpb25GZWF0dXJlcygpDQotCXsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU19BTk5PVEFUSU9OID0gImphdmF4Lmp3cy5XZWJTZXJ2aWNlIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQVRUUklCVVRFID0gIm5hbWUiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EUE9JTlRfSU5URVJGQUNFX0FUVFJJQlVURSA9ICJlbmRwb2ludEludGVyZmFjZSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX05BTUVfQVRUUklCVVRFID0gInNlcnZpY2VOYW1lIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfTE9DQVRJT05fQVRUUklCVVRFID0gIndzZGxMb2NhdGlvbiI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSA9ICJ0YXJnZXROYW1lc3BhY2UiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9OQU1FX0FUVFJJQlVURSA9ICJwb3J0TmFtZSI7CS8vJE5PTi1OTFMtMSQNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9Xb3Jrc3BhY2VDVUZpbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9Xb3Jrc3BhY2VDVUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZGM4ZjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvV29ya3NwYWNlQ1VGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZU1lc3NhZ2VzOw0KLQ0KLXB1YmxpYyBjbGFzcyBXb3Jrc3BhY2VDVUZpbmRlciBpbXBsZW1lbnRzIElDb21waWxhdGlvblVuaXRGaW5kZXINCi17DQotCXByaXZhdGUgZmluYWwgSUphdmFNb2RlbCBqYXZhTW9kZWw7DQotCXByaXZhdGUgZmluYWwgSVByb2plY3RTZWxlY3RvcltdIHNlbGVjdG9yczsNCi0JDQotCXB1YmxpYyBXb3Jrc3BhY2VDVUZpbmRlcihJSmF2YU1vZGVsIGphdmFNb2RlbCwgSVByb2plY3RTZWxlY3RvcltdIHNlbGVjdG9ycykgew0KLQkJaWYgKGphdmFNb2RlbCA9PSBudWxsKSB7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJqYXZhTW9kZWwiKTsvLyROT04tTkxTLTEkDQotCQl9DQotCQl0aGlzLmphdmFNb2RlbCA9IGphdmFNb2RlbDsNCi0JCWlmIChzZWxlY3RvcnMgPT0gbnVsbCkgew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigic2VsZWN0b3IiKTsvLyROT04tTkxTLTEkDQotCQl9DQotCQl0aGlzLnNlbGVjdG9ycyA9IHNlbGVjdG9yczsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgZmluZChmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIElDb21waWxhdGlvblVuaXRIYW5kbGVyIGN1SGFuZGxlcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uDQotCXsNCi0JCWN1SGFuZGxlci5zdGFydGVkKCk7DQotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJbW9uaXRvci5iZWdpblRhc2soSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuSkFYV1NfRE9NX0xPQURJTkcsIGFzc3VtZVdvcmsoKSk7DQotCQl9CQkNCi0JCXRyeSB7DQotCQkJZm9yIChJSmF2YVByb2plY3QgcHJqIDogamF2YU1vZGVsLmdldEphdmFQcm9qZWN0cygpKQ0KLQkJCXsNCi0JCQkJaWYgKG1vbml0b3IhPW51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsNCi0JCQkJCXRocm93IG5ldyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbigiSkFYLVdTIERPTSBsb2FkaW5nIGNhbmNlbGVkIiwgSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuV29ya3NwYWNlQ1VGaW5kZXJfTE9BRElOR19DQU5DRUxFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJfQ0KLQkJCQkNCi0JCQkJaWYgKGFwcHJvdmUocHJqKSkNCi0JCQkJew0KLQkJCQkJY3VIYW5kbGVyLmhhbmRsZShwcmopOw0KLQkJCQkJcGFyc2VQcm9qZWN0KHByaiwgbW9uaXRvciwgY3VIYW5kbGVyKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQljdUhhbmRsZXIuZmluaXNoZWQoKTsNCi0JCX0gZmluYWxseSB7DQotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgew0KLQkJCQltb25pdG9yLmRvbmUoKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCBpbnQgYXNzdW1lV29yaygpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBDb3VudGluZ0NVSGFuZGxlciBjb3VudGluZ0hhbmRsZXIgPSBuZXcgQ291bnRpbmdDVUhhbmRsZXIoKTsNCi0JCWZvciAoSUphdmFQcm9qZWN0IHByaiA6IGphdmFNb2RlbC5nZXRKYXZhUHJvamVjdHMoKSkgewkJDQotCQkJaWYgKGFwcHJvdmUocHJqKSkgew0KLQkJCQlwYXJzZVByb2plY3QocHJqLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBjb3VudGluZ0hhbmRsZXIpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGNvdW50aW5nSGFuZGxlci5jb3VudDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIHBhcnNlUHJvamVjdChmaW5hbCBJSmF2YVByb2plY3QgcHJqLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIElDb21waWxhdGlvblVuaXRIYW5kbGVyIGN1SGFuZGxlcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gDQotCXsNCi0JCWZvciAoSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgOiBwcmouZ2V0UGFja2FnZUZyYWdtZW50cygpKSANCi0JCXsNCi0JCQlpZiAocGFja2FnZUZyYWdtZW50LmdldEtpbmQoKSAhPSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkgew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJDQotCQkJZm9yIChJQ29tcGlsYXRpb25Vbml0IGN1IDogcGFja2FnZUZyYWdtZW50LmdldENvbXBpbGF0aW9uVW5pdHMoKSkgDQotCQkJew0KLQkJCQlpZiAobW9uaXRvciE9bnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgew0KLQkJCQkJdGhyb3cgbmV3IFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uKCJKQVgtV1MgRE9NIGxvYWRpbmcgY2FuY2VsZWQiLEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLldvcmtzcGFjZUNVRmluZGVyX0xPQURJTkdfQ0FOQ0VMRUQpOyAvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQkJDQotCQkJCWN1SGFuZGxlci5oYW5kbGUoY3UpOw0KLQkJCQkNCi0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgew0KLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgYm9vbGVhbiBhcHByb3ZlKElKYXZhUHJvamVjdCBwcmopIHsNCi0JCWZvciAoSVByb2plY3RTZWxlY3RvciBzZWxlY3RvciA6IHNlbGVjdG9ycykgew0KLQkJCWlmIChzZWxlY3Rvci5hcHByb3ZlKHByaikpIHsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQkvKioNCi0JICogVGhpcyBoYW5kbGVyIGNvdW50cyB0aGUgY29tcGlsYXRpb24gdW5pdHMgDQotCSAqICANCi0JICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLQkgKi8NCi0JcHJvdGVjdGVkIGNsYXNzIENvdW50aW5nQ1VIYW5kbGVyIGltcGxlbWVudHMgSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXIgDQotCXsNCi0JCXByaXZhdGUgaW50IGNvdW50Ow0KLQkJDQotCQlwdWJsaWMgdm9pZCBzdGFydGVkKCkgew0KLQkJCWNvdW50ID0gMDsNCi0JCX0NCi0JCQ0KLQkJcHVibGljIHZvaWQgaGFuZGxlKElDb21waWxhdGlvblVuaXQgY3UpIHsNCi0JCQljb3VudCsrOw0KLQkJfQ0KLQkJDQotCQlwdWJsaWMgdm9pZCBmaW5pc2hlZCgpIHsgLyogbm8gcHJvY2Vzc2luZyBuZWVkZWQgKi8gfQ0KLQkJcHVibGljIHZvaWQgaGFuZGxlKElKYXZhUHJvamVjdCBqcHJqKSB7IC8qIG5vIHByb2Nlc3NpbmcgbmVlZGVkICovIH0NCi0JfQkNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL0Fubm90YXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL0Fubm90YXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZWFmYWYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uaW1wbC5Bbm5vdGF0aW9uQWRhcHRlcjsNCi0NCi0vKioNCi0gKiBGYWN0b3J5IHRoYXQgYWRhcHRzIERPTSBvYmplY3RzIHRvIHtAbGluayBJQW5ub3RhdGlvbkFkYXB0ZXJ9IGludGVyZmFjZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEFubm90YXRpb25BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbA0KLXsNCi0JLyoqDQotCSAqIFNpbmdsZXRvbiAtIHVzZSB0aGlzIHN0YXRpYyBpbnN0YW5jZSB0byBhZGFwdCBvYmplY3RzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFubm90YXRpb25BZGFwdGVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBBbm5vdGF0aW9uQWRhcHRlckZhY3RvcnkoKTsNCi0JDQotCXByaXZhdGUgQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5KCkgew0KLQkJLy8gc2luZ2xldG9uDQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7DQotCQlyZXR1cm4gdHlwZSA9PSBJQW5ub3RhdGlvbkFkYXB0ZXIuY2xhc3M7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSANCi0Jew0KLQkJcmV0dXJuIG5ldyBBbm5vdGF0aW9uQWRhcHRlcigpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvYW5ub3RhdGlvbi9JQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvYW5ub3RhdGlvbi9JQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGY0Mjc1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vSUFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIHRoYXQgaG9sZHMgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBhbm5vdGF0aW9ucyBhcHBsaWVkIG9uIHRoZQ0KLSAqIGphdmEgYXJ0aWZhY3QvcyB3aGljaCBpcyByZXByZXNlbnQgYnkgdGhlIERPTSBvYmplY3QgYWRhcHRlZCB0byB0aGlzIGludGVyZmFjZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvbkFkYXB0ZXIgDQotew0KLQkvKioNCi0JICogUHJvdmlkZXMgdGhlIHtAbGluayBJQW5ub3RhdGlvbn0gZm9yIGFubm90YXRpb24gd2l0aCA8Y29kZT5hbm5GUU5hbWU8L2NvZGU+LiANCi0JICogQHBhcmFtIGFubkZRTmFtZSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGFubm90YXRpb24NCi0JICogQHJldHVybiBsb2NhdG9yIGluc3RhbmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBleGlzdGluZw0KLQkgKi8NCi0JcHVibGljIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGdldEFubm90YXRpb24oU3RyaW5nIGFubkZRTmFtZSk7DQotCQ0KLQkvKioNCi0JICogQWRkcyBhbm5vdGF0aW9uIHRvIHRoZSBsaXN0IG9mIHVzZWQgYW5ub3RhdGlvbnMuDQotCSAqIDxjb2RlPmFubm90YXRpb248L2NvZGU+IGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIHRoZSBsb2NhdG9yIGZvciB0aGlzIGFubm90YXRpb24NCi0JICogaXMgcmVtb3ZlZC4NCi0JICogQHBhcmFtIGFubkZRTmFtZSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGFubm90YXRpb24NCi0JICogQHBhcmFtIGFubm90YXRpb24gdGggYW5ub3RhdGlvbiBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkQW5ub3RhdGlvbihTdHJpbmcgYW5uRlFOYW1lLCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL2ltcGwvQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvYW5ub3RhdGlvbi9pbXBsL0Fubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkNmZiYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL2ltcGwvQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uaW1wbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uSUFubm90YXRpb25BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtOw0KLQ0KLS8qKg0KLSAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJTG9jYXRvckFkYXB0ZXJ9Lg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElBbm5vdGF0aW9uQWRhcHRlcg0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50Pj4gYW5ub3RhdGlvbkxvY2F0b3JzOw0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgQW5ub3RhdGlvbkFkYXB0ZXIoKSB7DQotCQlhbm5vdGF0aW9uTG9jYXRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+PigpOw0KLQl9DQotCQ0KLQlwdWJsaWMgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gZ2V0QW5ub3RhdGlvbihmaW5hbCBTdHJpbmcgYW5ub3RhdGlvbkZRTmFtZSkgDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKGFubm90YXRpb25GUU5hbWUsICJhbm5vdGF0aW9uRlFOYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQkJcmV0dXJuIGFubm90YXRpb25Mb2NhdG9ycy5nZXQoYW5ub3RhdGlvbkZRTmFtZSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgYWRkQW5ub3RhdGlvbihmaW5hbCBTdHJpbmcgYW5uRlFOYW1lLCBmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uKSANCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0oYW5uRlFOYW1lLCAiYW5uRlFOYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQkJYW5ub3RhdGlvbkxvY2F0b3JzLnB1dChhbm5GUU5hbWUsIGFubm90YXRpb24pOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7DQotCQlyZXR1cm4gSUFubm90YXRpb25BZGFwdGVyLmNsYXNzID09IHR5cGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9NZXRob2RQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9NZXRob2RQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmM2I3NGI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvZGVmYXVsdHMvTWV0aG9kUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmRlZmF1bHRzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5RGVmYXVsdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLQ0KLS8qKg0KLSAqIEFkYXB0ZXIgdGhhdCBnaXZlcyBkZWZhdWx0IHZhbHVlcyBmb3Ige0BsaW5rIElXZWJNZXRob2R9IG9iamVjdHMNCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIE1ldGhvZFByb3BlcnR5RGVmYXVsdHNBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBJUHJvcGVydHlEZWZhdWx0cw0KLXsNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiBJUHJvcGVydHlEZWZhdWx0cy5jbGFzcyA9PSB0eXBlOw0KLQl9DQotCQ0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHQoZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIA0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKWdldFRhcmdldCgpOyANCi0JCXN3aXRjaChmZWF0dXJlLmdldEZlYXR1cmVJRCgpKQ0KLQkJew0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19OQU1FOg0KLQkJCXJldHVybiBnZXRNZXRob2ROYW1lKHdlYk1ldGhvZCk7DQotCQl9CQ0KLQkJDQotCQlyZXR1cm4gd2ViTWV0aG9kLmVHZXQoZmVhdHVyZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWV0aG9kTmFtZShmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCkNCi0Jew0KLQkJaW50IHBvcyA9IHdlYk1ldGhvZC5nZXRJbXBsZW1lbnRhdGlvbigpLmluZGV4T2YoJygnKTsNCi0JCWlmIChwb3MgPiAtMSkgew0KLQkJCXJldHVybiB3ZWJNZXRob2QuZ2V0SW1wbGVtZW50YXRpb24oKS5zdWJzdHJpbmcoMCwgcG9zKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHdlYk1ldGhvZC5nZXRJbXBsZW1lbnRhdGlvbigpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvZGVmYXVsdHMvUGFyYW1ldGVyUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvZGVmYXVsdHMvUGFyYW1ldGVyUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2JiOWUxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1BhcmFtZXRlclByb3BlcnR5RGVmYXVsdHNBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5kZWZhdWx0czsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eURlZmF1bHRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc0RlZmF1bHRzQ2FsY3VsYXRvcjsNCi0NCi0vKioNCi0gKiBDbGFzcyB0aGF0IGRlZmluZXMgd2hpY2ggcHJvcGVydGllcyBmb3Ige0BsaW5rIElXZWJQYXJhbX0gYXJlIGVkaXRhYmxlDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJQcm9wZXJ0eURlZmF1bHRzQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSVByb3BlcnR5RGVmYXVsdHMNCi17DQotCXByaXZhdGUgZmluYWwgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IgZGVmQ2FsYyA9IG5ldyBKYXhXc0RlZmF1bHRzQ2FsY3VsYXRvcigpOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiBJUHJvcGVydHlEZWZhdWx0cy5jbGFzcyA9PSB0eXBlOw0KLQl9DQotCQ0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpDQotCXsNCi0JCWFzc2VydCBnZXRUYXJnZXQoKSBpbnN0YW5jZW9mIElXZWJQYXJhbTsNCi0JCQ0KLQkJZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtID0gKElXZWJQYXJhbSlnZXRUYXJnZXQoKTsNCi0JCQ0KLQkJc3dpdGNoKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkpIA0KLQkJew0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX05BTUU6DQotCQkJcmV0dXJuIGRlZkNhbGMoKS5jYWxjV2ViUGFyYW1EZWZhdWx0TmFtZSh3ZWJQYXJhbSk7CQkJDQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fUEFSVF9OQU1FOg0KLQkJCXJldHVybiBkZWZDYWxjKCkuY2FsY1dlYlBhcmFtRGVmYXVsdE5hbWUod2ViUGFyYW0pOwkJCQ0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJcmV0dXJuIGRlZkNhbGMoKS5jYWxjV2ViUGFyYW1EZWZhdWx0VGFyZ2V0TlMoKElXZWJNZXRob2Qpd2ViUGFyYW0uZUNvbnRhaW5lcigpLCB3ZWJQYXJhbSk7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fSEVBREVSOg0KLQkJCXJldHVybiBkZWZDYWxjKCkuZ2V0RGVmYXVsdFBhcmFtSW5IZWRhZXIoKTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19LSU5EOg0KLQkJCXJldHVybiBkZWZDYWxjKCkuZ2V0RGVmYXVsdFBhcmFtS2luZCgpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gd2ViUGFyYW0uZUdldChmZWF0dXJlKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yIGRlZkNhbGMoKSB7DQotCQlyZXR1cm4gZGVmQ2FsYzsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9Qcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzgyYmU1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuZGVmYXVsdHM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlEZWZhdWx0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5Eb21BZGFwdGVyRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIGZhY3RvcnkgZm9yIGFkYXB0ZXJzIGltcGxlbWVudGluZyB7QGxpbmsgSVByb3BlcnR5U3RhdGV9IGludGVyZmFjZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFByb3BlcnR5RGVmYXVsdHNBZGFwdGVyRmFjdG9yeSBleHRlbmRzIERvbUFkYXB0ZXJGYWN0b3J5DQotew0KLQkvKioNCi0JICogU2luZ2xldG9uIGluc3RhbmNlIGZvciB0aGlzIGFkYXB0ZXIgZmFjdG9yeSANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5IElOU1RBTkNFID0gbmV3IFByb3BlcnR5RGVmYXVsdHNBZGFwdGVyRmFjdG9yeSgpOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eURlZmF1bHRzLmNsYXNzID09IG9iamVjdDsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJTZXJ2aWNlQWRhcHRlcigpIHsNCi0JCXJldHVybiBuZXcgV3NQcm9wZXJ0eURlZmF1bHRzQWRhcHRlcigpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IFNlaVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyKCk7DQotCX0JDQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYk1ldGhvZEFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IE1ldGhvZFByb3BlcnR5RGVmYXVsdHNBZGFwdGVyKCk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViUGFyYW1BZGFwdGVyKCl7DQotCQlyZXR1cm4gbmV3IFBhcmFtZXRlclByb3BlcnR5RGVmYXVsdHNBZGFwdGVyKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9TZWlQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9TZWlQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOWNjYTdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvZGVmYXVsdHMvU2VpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmRlZmF1bHRzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5RGVmYXVsdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuSmF4V3NVdGlsczsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIHRoYXQgcHJvdmlkZXMgZGVmYXVsdCB2YWx1ZXMgZm9yIHtAbGluayBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlfSBwcm9wZXJ0aWVzIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2VpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElQcm9wZXJ0eURlZmF1bHRzIA0KLXsNCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSANCi0Jew0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlnZXRUYXJnZXQoKTsNCi0JCQ0KLQkJc3dpdGNoKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkpDQotCQl7DQotCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19OQU1FOg0KLQkJCXJldHVybiBKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0dHlwZU5hbWUoc2VpLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQlyZXR1cm4gSmF4V3NVdGlscy5jb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeUZRTmFtZShzZWkuZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQl9CQkJDQotCQkNCi0JCXJldHVybiBzZWkuZUdldChmZWF0dXJlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiBJUHJvcGVydHlEZWZhdWx0cy5jbGFzcyA9PSB0eXBlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvZGVmYXVsdHMvV3NQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9Xc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3YWM5NDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9Xc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5kZWZhdWx0czsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eURlZmF1bHRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5KYXhXc1V0aWxzOw0KLQ0KLXB1YmxpYyBjbGFzcyBXc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBJUHJvcGVydHlEZWZhdWx0cyANCi17DQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzID0gKElXZWJTZXJ2aWNlKWdldFRhcmdldCgpOw0KLQkJDQotCQlzd2l0Y2goZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSkNCi0JCXsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX05BTUU6IA0KLQkJCXJldHVybiBKYXhXc1V0aWxzLmdldERlZmF1bHRTZXJ2aWNlTmFtZSh3cy5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRToNCi0JCQlyZXR1cm4gSmF4V3NVdGlscy5nZXREZWZhdWx0UG9ydE5hbWUod3MuZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCXJldHVybiBKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5RlFOYW1lKHdzLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gd3MuZUdldChmZWF0dXJlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiBJUHJvcGVydHlEZWZhdWx0cy5jbGFzcyA9PSB0eXBlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9BYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMDE2ODE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9BYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUFubm90YXRpb25TZXJpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5QYXJhbVZhbHVlQ29tcGFyYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25Xcml0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIEJhc2UgY2xhc3MgZm9yIERPTSBhZGFwdGVycyB0aGF0IGxpc3RlbiB0byBjaGFuZ2VzIGluIERPTSBvYmplY3RzIGFuZCBhcHBsaWVzIGl0DQotICogdG8gdGhlIHVuZGVybHlpbmcgamF2YSBjbGFzcy4gRXh0ZW5kZXJzIHNob3VsZCBpbXBsZW1lbnQgPGNvZGU+Z2V0QW5ub3RhdGlvbigpPC9jb2RlPg0KLSAqIG1ldGhvZCB0byBwcm92aWRlIHRoZSB7QGxpbmsgSUFubm90YXRpb259IGluc3RhbmNlIHRvIGJlIHNhdmVkIHRvIGphdmEgY2xhc3MuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBJQW5ub3RhdGlvblNlcmlhbGl6ZXINCi17DQotCXByaXZhdGUgZmluYWwgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZTsNCi0JcHJpdmF0ZSBmaW5hbCBEb21VdGlsIHV0aWwgPSBuZXcgRG9tVXRpbCgpOw0KLQlwcml2YXRlIGZpbmFsIEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yIGRlZkNhbGMgPSBuZXcgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IoKTsNCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiBAcGFyYW0gcmVzb3VyY2UNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPnJlc291cmNlPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JcHVibGljIEFic3RyYWN0U2VyaWFsaXplckFkYXB0ZXIoZmluYWwgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSkgDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShyZXNvdXJjZSwgInJlc291cmNlIik7Ly8kTk9OLU5MUy0xJA0KLQkJDQotCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpDQotCXsNCi0JCWlmICghcmVzb3VyY2UuaXNTYXZlRW5hYmxlZCgpIHx8IG1zZy5pc1RvdWNoKCkpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCWlmIChtc2cuZ2V0RXZlbnRUeXBlKCkgIT0gTm90aWZpY2F0aW9uLlNFVCAmJiBtc2cuZ2V0RXZlbnRUeXBlKCkgIT0gTm90aWZpY2F0aW9uLlVOU0VUKSB7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJDQotCQlpZiAoY2hlY2tWYWx1ZShtc2cpKSB7DQotCQkJc2F2ZShtc2cpOw0KLQkJfQ0KLQl9DQotCQ0KLQkvKioNCi0JICogRGVmYXVsdCB2YWx1ZSBjaGVjayAtIHdvcmtzIG9ubHkgZm9yIFN0cmluZyB2YWx1ZXMsIHRyaW1zIHRoZQ0KLQkgKiBuZXcgdmFsdWUgY2hlY2tzIGZvciA8Y29kZT5udWxsPC9jb2RlPiBhbmQgaWYgaXQgaXMgbm90IG51bGwgcHV0cyB0aGUNCi0JICogdmFsdWUgdG8gdGhlIG9iamVjdCBhbmQgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+DQotCSAqIEBwYXJhbSBtc2cNCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbiBjYXNlIHRoZSB2YWx1ZSBpcyB2YWxpZA0KLQkgKi8NCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tWYWx1ZShmaW5hbCBOb3RpZmljYXRpb24gbXNnKQ0KLQl7DQotCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KWdldFRhcmdldCgpOw0KLQkJZmluYWwgU3RyaW5nIG5ld1ZhbHVlID0gZ2V0TmV3U3RyaW5nVmFsdWUobXNnKTsNCi0JCWlmIChuZXdWYWx1ZT09bnVsbCkgewkJCQ0KLQkJCXJldHVybiByZXZlcnRWYWx1ZShvYmosIG1zZyk7DQotCQl9DQotCQkNCi0JCS8vIHRoaXMgY2FsbCBpcyBuZWVkZWQgY2F1c2UgbmV3VmFsdWUgbWlnaHQgYmUgdHJpbW1lZA0KLQkJcHV0VmFsdWUob2JqLCAoRVN0cnVjdHVyYWxGZWF0dXJlKW1zZy5nZXRGZWF0dXJlKCksIG5ld1ZhbHVlKTsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzYXZlKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpDQotCXsNCi0JCWJvb2xlYW4gcHJvY2Vzc2VkID0gZmFsc2U7DQotCQl0cnkgew0KLQkJCWZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKCk7DQotCQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJCQ0KLQkJCWlmIChhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKT09MCAmJiAhaXNBbm5vdGF0aW9uUmVxdWlyZWQoKSkgew0KLQkJCQlnZXRBbm5vdGF0aW9uV3JpdGVyKCkucmVtb3ZlKGFubm90YXRpb24pOw0KLQkJCX0gZWxzZSB7DQotCQkJCWdldEFubm90YXRpb25Xcml0ZXIoKS51cGRhdGUoYW5ub3RhdGlvbik7DQotCQkJfQ0KLQkJCXByb2Nlc3NlZCA9IHRydWU7DQotCQl9IA0KLQkJY2F0Y2ggKEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24gZSkgew0KLQkJCWxvZ2dlcigpLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCX0gDQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJbG9nZ2VyKCkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfQ0KLQkJZmluYWxseSB7DQotCQkJaWYoIXByb2Nlc3NlZCkgew0KLQkJCQlyZXZlcnRWYWx1ZSgoRU9iamVjdClnZXRUYXJnZXQoKSwgbXNnKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCBhYnN0cmFjdCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBnZXRBbm5vdGF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsNCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNBbm5vdGF0aW9uUmVxdWlyZWQoKTsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKQ0KLQl7DQotCSAgICByZXR1cm4gSUFubm90YXRpb25TZXJpYWxpemVyLmNsYXNzPT10eXBlOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSgpCXsNCi0JCXJldHVybiByZXNvdXJjZTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIERvbVV0aWwgdXRpbCgpIHsNCi0JCXJldHVybiB1dGlsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IgZGVmQ2FsYygpCXsNCi0JCXJldHVybiBkZWZDYWxjOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbldyaXRlciBnZXRBbm5vdGF0aW9uV3JpdGVyKCkNCi0Jew0KLQkJcmV0dXJuIEFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgSVBhcmFtVmFsdWVQYWlyIGNyZWF0ZVBhcmFtVmFsdWUoU3RyaW5nIHBhcmFtLCBTdHJpbmcgdmFsdWUpDQotCXsNCi0JCWZpbmFsIElWYWx1ZSBpVmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSh2YWx1ZSk7DQotCQlyZXR1cm4gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZShwYXJhbSwgaVZhbHVlKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElQYXJhbVZhbHVlUGFpciBjcmVhdGVQYXJhbVZhbHVlKFN0cmluZyBwYXJhbSwgYm9vbGVhbiB2YWx1ZSkNCi0Jew0KLQkJZmluYWwgSVZhbHVlIGlWYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUJvb2xlYW5WYWx1ZSh2YWx1ZSk7DQotCQlyZXR1cm4gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZShwYXJhbSwgaVZhbHVlKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElUeXBlIGZpbmRUeXBlKGZpbmFsIEVPYmplY3Qgb2JqZWN0LCBmaW5hbCBTdHJpbmcgdHlwZUZRTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlFT2JqZWN0IHdlYlByb2plY3QgPSBvYmplY3QuZUNvbnRhaW5lcigpOw0KLQkJd2hpbGUoISh3ZWJQcm9qZWN0IGluc3RhbmNlb2YgSVdlYlNlcnZpY2VQcm9qZWN0KSAmJiB3ZWJQcm9qZWN0IT1udWxsKSB7DQotCQkJd2ViUHJvamVjdCA9IHdlYlByb2plY3QuZUNvbnRhaW5lcigpOw0KLQkJfQ0KLQkJDQotCQlpZiAod2ViUHJvamVjdD09bnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQ0KLQkJZmluYWwgU3RyaW5nIHByb2plY3ROYW1lID0gKChJV2ViU2VydmljZVByb2plY3Qpd2ViUHJvamVjdCkuZ2V0TmFtZSgpOw0KLQkJZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gcmVzb3VyY2UuamF2YU1vZGVsKCkuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpOwkJDQotCQlyZXR1cm4gamF2YVByb2plY3QuZmluZFR5cGUodHlwZUZRTmFtZSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZWFkcyB0aGUgbmV3IHN0cmluZyB2YWx1ZSBmcm9tIDxjb2RlPm1zZzwvY29kZT4uIA0KLQkgKiBAcGFyYW0gbXNnDQotCSAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHZhbHVlIGlzIGVtcHR5IHN0cmluZyBvciA8Y29kZT5udWxsPC9jb2RlPiwgb3RoZXJ3aXNlIHRoZSB0cmltbWVkIHN0cmluZyB2YWx1ZS4NCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmV3U3RyaW5nVmFsdWUoZmluYWwgTm90aWZpY2F0aW9uIG1zZykgDQotCXsNCi0JCWZpbmFsIFN0cmluZyBuZXdWYWx1ZSA9IChtc2cuZ2V0TmV3U3RyaW5nVmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiBtc2cuZ2V0TmV3U3RyaW5nVmFsdWUoKS50cmltKCk7DQotCQlpZiAobmV3VmFsdWUgIT0gbnVsbCAmJiBuZXdWYWx1ZS5sZW5ndGgoKSA+IDApIHsNCi0JCQlyZXR1cm4gbmV3VmFsdWU7DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV2ZXJ0cyB0aGUgY3VycmVudCB2YWx1ZSBmb3IgdGhlIGNoYW5nZWQgZmVhdHVyZSB0byB0aGUgb2xkIHZhbHVlIGFuZCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPg0KLQkgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmUgcmV2ZXJ0ZWQNCi0JICogQHBhcmFtIG1zZyB0aGUgbWVzc2FnZQ0KLQkgKiBAcmV0dXJuIGFsd2F5cyByZXR1cm5zIGZhbHNlDQotCSAqLw0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXZlcnRWYWx1ZShmaW5hbCBFT2JqZWN0IG9iaiwgZmluYWwgTm90aWZpY2F0aW9uIG1zZykNCi0Jew0KLQkJcHV0VmFsdWUob2JqLCAoRVN0cnVjdHVyYWxGZWF0dXJlKW1zZy5nZXRGZWF0dXJlKCksIG1zZy5nZXRPbGRWYWx1ZSgpKTsNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFB1dHMgdGhlIDxjb2RlPm5ld1ZhbHVlPC9jb2RlPiB0byB0aGUgY2hhbmdlZCBmZWF0dXJlLg0KLQkgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmUgdXBkYXRlZA0KLQkgKiBAcGFyYW0gbXNnIHRoZSBub3RpZmljYXRpb24gbWVzc2FnZQ0KLQkgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIG5ldyB2YWx1ZSB0byBiZSBwdXQNCi0JICovDQotCXByb3RlY3RlZCB2b2lkIHB1dFZhbHVlKGZpbmFsIEVPYmplY3Qgb2JqLCBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgZmluYWwgT2JqZWN0IG5ld1ZhbHVlKQ0KLQl7DQotCQl0cnkgew0KLQkJCW9iai5lU2V0RGVsaXZlcihmYWxzZSk7DQotCQkJb2JqLmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOw0KLQkJfSBmaW5hbGx5IHsNCi0JCQlvYmouZVNldERlbGl2ZXIodHJ1ZSk7DQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCBUcmVlU2V0PElQYXJhbVZhbHVlUGFpcj4gY3JlYXRlUGFyYW1WYWx1ZVNvcnRlZFRyZWVTZXQoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IFRyZWVTZXQ8SVBhcmFtVmFsdWVQYWlyPihuZXcgUGFyYW1WYWx1ZUNvbXBhcmF0b3IoKSk7DQotCX0NCi0JDQotCXByaXZhdGUgSUxvZ2dlciBsb2dnZXIoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IExvZ2dlcigpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9NZXRob2RTZXJpYWxpemVyQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL01ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4NzVmN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL01ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XTUFubm90YXRpb25GZWF0dXJlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotDQotLyoqDQotICogQWRhcHRlciBmb3Ige0BsaW5rIElXZWJNZXRob2R9IHNlcmlhbGl6YXRpb24uIExpc3RlbnMgZm9yIHByb3BlcnR5IGNoYW5nZSBub3RpZmljYXRpb25zIGFuZCANCi0gKiBzZXJpYWxpemVzIHRoZSBuZXcgb2JqZWN0IGNvbnRlbnQgdG8gdGhlIHVuZGVybHlpbmcgamF2YSBjbGFzcy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIE1ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlcg0KLXsNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIEBwYXJhbSByZXNvdXJjZSB0aGUgRE9NIHJlc291cmNlIA0KLQkgKi8NCi0JcHVibGljIE1ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyKEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UpIHsNCi0JCXN1cGVyKHJlc291cmNlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBib29sZWFuIGlzQW5ub3RhdGlvblJlcXVpcmVkKCkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gZ2V0QW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsJCQ0KLQkJYXNzZXJ0IGdldFRhcmdldCgpIGluc3RhbmNlb2YgSVdlYk1ldGhvZDsNCi0NCi0JCWZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kID0gKElXZWJNZXRob2QpZ2V0VGFyZ2V0KCk7DQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXdlYk1ldGhvZC5lQ29udGFpbmVyKCk7DQotCQlpZiAoc2VpID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCWZpbmFsIElUeXBlIHNlaVR5cGUgPSBmaW5kVHlwZShzZWksIHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kID0gdXRpbCgpLmZpbmRNZXRob2Qoc2VpVHlwZSwgd2ViTWV0aG9kKTsJCQ0KLQkJaWYgKG1ldGhvZD09bnVsbCkgew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIklNZXRob2QgZm9yIERPTSBtZXRob2Qgd2FzIG5vdCBmb3VuZCIpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKFdNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0FOTk9UQVRJT04sIG1ldGhvZCwgZGVmaW5lUGFyYW1WYWx1ZXMod2ViTWV0aG9kLCBtZXRob2QpKTsJDQotCX0NCi0JDQotCXByaXZhdGUgU2V0PElQYXJhbVZhbHVlUGFpcj4gZGVmaW5lUGFyYW1WYWx1ZXMoZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QsIGZpbmFsIElNZXRob2QgbWV0aG9kKQ0KLQl7DQotCQlmaW5hbCBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlUGFpcnMgPSBjcmVhdGVQYXJhbVZhbHVlU29ydGVkVHJlZVNldCgpOw0KLQkJaWYgKHdlYk1ldGhvZC5nZXROYW1lKCkhPW51bGwgJiYgIXdlYk1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpKSkgew0KLQkJCXBhcmFtVmFsdWVQYWlycy5hZGQoY3JlYXRlUGFyYW1WYWx1ZShXTUFubm90YXRpb25GZWF0dXJlcy5XTV9OQU1FX0FUVFJJQlVURSwgd2ViTWV0aG9kLmdldE5hbWUoKSkpOw0KLQkJfQ0KLQkJDQotCQlpZiAod2ViTWV0aG9kLmlzRXhjbHVkZWQoKSkgew0KLQkJCXBhcmFtVmFsdWVQYWlycy5hZGQoY3JlYXRlUGFyYW1WYWx1ZShXTUFubm90YXRpb25GZWF0dXJlcy5XTV9FWENMVURFRF9BVFRSSUJVVEUsIHRydWUpKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHBhcmFtVmFsdWVQYWlyczsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrVmFsdWUoZmluYWwgTm90aWZpY2F0aW9uIG1zZykNCi0Jew0KLQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKW1zZy5nZXRGZWF0dXJlKCk7DQotCQlpZiAoZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSE9RG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX05BTUUpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlpZiAoIXN1cGVyLmNoZWNrVmFsdWUobXNnKSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1BhcmFtZXRlclNlcmlhbGl6ZXJBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvUGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU3YjFhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvUGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLkhFQURFUl9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuTkFNRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuUEFSVF9OQU1FX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5UQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLklBbm5vdGF0aW9uQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuSmVlNURvbVV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIENsYXNzIHRoYXQgc2VyaWFsaXplcyB7QGxpbmsgSVdlYlBhcmFtfSBvYmplY3RzIHRvIFdlYlBhcmFtIGFubm90YXRpb24gaW4gdW5kZXJseWluZyBqYXZhDQotICogY2xhc3MuIENoZWNrcyB0aGUgYXR0cmlidXRlIHZhbHVlcyBhbmQgb21pdHMgdGhlIGRlZmF1bHRzLg0KLSAqICANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFBhcmFtZXRlclNlcmlhbGl6ZXJBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlcg0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBKZWU1RG9tVXRpbHMgamVlNVV0aWxzID0gSmVlNURvbVV0aWxzLmdldEluc3RhbmNlKCk7DQotCQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogQHBhcmFtIHJlc291cmNlDQotCSAqLw0KLQlwdWJsaWMgUGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSkgew0KLQkJc3VwZXIocmVzb3VyY2UpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbXNnKSANCi0Jew0KLQkJaWYgKCFyZXNvdXJjZSgpLmlzU2F2ZUVuYWJsZWQoKSkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKW1zZy5nZXRGZWF0dXJlKCk7DQotCQlpZiAoZmVhdHVyZS5nZXRGZWF0dXJlSUQoKT09RG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX05BTUUpIA0KLQkJew0KLQkJCXRyeSB7DQotCQkJCWNoYW5nZVBhcnROYW1lKG1zZyk7DQotCQkJfSANCi0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsNCi0JCQkJKG5ldyBMb2dnZXIoKSkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCX0NCi0JCX0JDQotCQkNCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZVBhcnROYW1lKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtID0gKElXZWJQYXJhbSlnZXRUYXJnZXQoKTsNCi0JCWlmIChqZWU1VXRpbHMuaXNQYXJ0TmFtZVVzZWQod2ViUGFyYW0pKSANCi0JCXsNCi0JCQlmaW5hbCBJQW5ub3RhdGlvbkFkYXB0ZXIgYW5uQWRhcHRlciA9IChJQW5ub3RhdGlvbkFkYXB0ZXIgKUFubm90YXRpb25BZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdCh3ZWJQYXJhbSwgSUFubm90YXRpb25BZGFwdGVyLmNsYXNzKTsNCi0JCQlmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm4gPSBhbm5BZGFwdGVyLmdldEFubm90YXRpb24oV1BBbm5vdGF0aW9uRmVhdHVyZXMuV1BfQU5OT1RBVElPTik7DQotCQkJaWYgKGFubiE9bnVsbCAmJiBhbm4uZ2V0UHJvcGVydHlWYWx1ZShXUEFubm90YXRpb25GZWF0dXJlcy5QQVJUX05BTUVfQVRUUklCVVRFKSE9bnVsbCkgew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlpZiAoY2hlY2tWYWx1ZShtc2cpKSB7DQotCQkJcHV0VmFsdWUod2ViUGFyYW0sIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fUEFSVF9OQU1FLCBtc2cuZ2V0TmV3VmFsdWUoKSk7DQotCQl9DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fubm90YXRpb25SZXF1aXJlZCgpIHsNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBnZXRBbm5vdGF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtID0gKElXZWJQYXJhbSlnZXRUYXJnZXQoKTsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kID0gKElXZWJNZXRob2Qpd2ViUGFyYW0uZUNvbnRhaW5lcigpOw0KLQkJaWYgKHdlYk1ldGhvZD09bnVsbCB8fCB3ZWJNZXRob2QuZUNvbnRhaW5lcigpPT1udWxsKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotCQkNCi0JCWZpbmFsIElUeXBlIHNlaVR5cGUgPSBmaW5kVHlwZSh3ZWJNZXRob2QsICgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSl3ZWJNZXRob2QuZUNvbnRhaW5lcigpKS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kID0gdXRpbCgpLmZpbmRNZXRob2Qoc2VpVHlwZSwgd2ViTWV0aG9kKTsNCi0JCQ0KLQkJcmV0dXJuIEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oV1BfQU5OT1RBVElPTiwgDQotCQkJCW1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKHdlYlBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkpLA0KLQkJCQlkZWZpbmVQYXJhbVZhbHVlcyh3ZWJQYXJhbSwgd2ViTWV0aG9kKSk7CQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgU2V0PElQYXJhbVZhbHVlUGFpcj4gZGVmaW5lUGFyYW1WYWx1ZXMoZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtLCBmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCkNCi0Jew0KLQkJZmluYWwgU2V0PElQYXJhbVZhbHVlUGFpcj4gdmFsdWVQYWlycyA9IGNyZWF0ZVBhcmFtVmFsdWVTb3J0ZWRUcmVlU2V0KCk7DQotCQkNCi0JCWlmICh3ZWJQYXJhbS5nZXRLaW5kKCkhPVdlYlBhcmFtS2luZC5JTikgew0KLQkJCXZhbHVlUGFpcnMuYWRkKGNyZWF0ZU1vZGVWYWx1ZVBhaXIod2ViUGFyYW0pKTsNCi0JCX0NCi0JCQ0KLQkJaWYgKHdlYlBhcmFtLmlzSGVhZGVyKCkpIHsNCi0JCQl2YWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKEhFQURFUl9BVFRSSUJVVEUsIHRydWUpKTsNCi0JCX0NCi0NCi0JCWZpbmFsIFN0cmluZyBkZWZOYW1lID0gZGVmQ2FsYygpLmNhbGNXZWJQYXJhbURlZmF1bHROYW1lKHdlYlBhcmFtKTsNCi0JCWlmIChqZWU1VXRpbHMuaXNOYW1lUmVxdWlyZWQod2ViUGFyYW0pIHx8IA0KLQkJCSghd2ViUGFyYW0uZ2V0TmFtZSgpLmVxdWFscyhkZWZOYW1lKSAmJiBqZWU1VXRpbHMuaXNOYW1lVXNlZCh3ZWJQYXJhbSkpKSANCi0JCXsNCi0JCQl2YWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKE5BTUVfQVRUUklCVVRFLCB3ZWJQYXJhbS5nZXROYW1lKCkpKTsNCi0JCX0NCi0JCQ0KLQkJaWYgKGplZTVVdGlscy5pc1BhcnROYW1lVXNlZCh3ZWJQYXJhbSkgJiYgIXdlYlBhcmFtLmdldFBhcnROYW1lKCkuZXF1YWxzKGRlZk5hbWUpKSB7DQotCQkJdmFsdWVQYWlycy5hZGQoY3JlYXRlUGFyYW1WYWx1ZShQQVJUX05BTUVfQVRUUklCVVRFLCB3ZWJQYXJhbS5nZXRQYXJ0TmFtZSgpKSk7DQotCQl9DQotDQotCQlpZiAod2ViUGFyYW0uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkhPW51bGwpIA0KLQkJew0KLQkJCWZpbmFsIFN0cmluZyBkZWZOcyA9IGRlZkNhbGMoKS5jYWxjV2ViUGFyYW1EZWZhdWx0VGFyZ2V0TlMod2ViTWV0aG9kLCB3ZWJQYXJhbSk7DQotCQkJaWYgKHdlYlBhcmFtLmdldFRhcmdldE5hbWVzcGFjZSgpLnRyaW0oKS5sZW5ndGgoKSAhPSAwICYmICF3ZWJQYXJhbS5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoZGVmTnMpKSB7DQotCQkJCXZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEUsIHdlYlBhcmFtLmdldFRhcmdldE5hbWVzcGFjZSgpKSk7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gdmFsdWVQYWlyczsNCi0JfQkNCi0JDQotCXByb3RlY3RlZCBJUGFyYW1WYWx1ZVBhaXIgY3JlYXRlTW9kZVZhbHVlUGFpcihmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0pIA0KLQl7DQotCQlJVmFsdWUgdmFsdWUgPSBudWxsOw0KLQkJc3dpdGNoICh3ZWJQYXJhbS5nZXRLaW5kKCkpIA0KLQkJew0KLQkJY2FzZSBPVVQ6DQotCQkJdmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoV1BBbm5vdGF0aW9uRmVhdHVyZXMuV0VCX1BBUkFNX01PREVfT1VUKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgSU5PVVQ6DQotCQkJdmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoV1BBbm5vdGF0aW9uRmVhdHVyZXMuV0VCX1BBUkFNX01PREVfSU5PVVQpOw0KLQkJCWJyZWFrOw0KLQkJZGVmYXVsdDoNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoV1BBbm5vdGF0aW9uRmVhdHVyZXMuTU9ERV9BVFRSSUJVVEUsIHZhbHVlKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUGFyYW1XaXRoU2FtZU5hbWUoZmluYWwgSVdlYlBhcmFtIHBhcmFtLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkNCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZClwYXJhbS5lQ29udGFpbmVyKCk7DQotCQlmb3IgKElXZWJQYXJhbSB3ZWJQYXJhbSA6IHdlYk1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkpIA0KLQkJew0KLQkJCWlmKHdlYlBhcmFtPT1wYXJhbSkgew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJDQotCQkJaWYod2ViUGFyYW0uZ2V0TmFtZSgpLmVxdWFscyhuZXdOYW1lKSkgew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrVmFsdWUoZmluYWwgTm90aWZpY2F0aW9uIG1zZykgDQotCXsNCi0JCWlmKCgoRVN0cnVjdHVyYWxGZWF0dXJlKW1zZy5nZXRGZWF0dXJlKCkpLmdldEZlYXR1cmVJRCgpPT1Eb21QYWNrYWdlLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UpIHsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHN1cGVyLmNoZWNrVmFsdWUobXNnKTsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvU2VpU2VyaWFsaXplckFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9TZWlTZXJpYWxpemVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhM2JiYTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9TZWlTZXJpYWxpemVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW07DQotDQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuSmF4V3NVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotDQotLyoqDQotICogQWRhcHRlciB0aGF0IG9uIHtAbGluayBJV2ViU2VydmljZX0gb2JqZWN0IGNoYW5nZSBzYXZlcyB0aGUgYW5ub3RhdGlvbiB0byANCi0gKiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0LiBVc2VzIHtAbGluayBKYXhXc1dvcmtzcGFjZVJlc291cmNlfSB0byBkZWZpbmUgDQotICogaWYgc2F2ZSBvcGVyYXRpb24gaXMgZW5hYmxlZC4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFNlaVNlcmlhbGl6ZXJBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlcg0KLXsNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIEBwYXJhbSByZXNvdXJjZQ0KLQkgKi8NCi0JcHVibGljIFNlaVNlcmlhbGl6ZXJBZGFwdGVyKEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UpIHsNCi0JCXN1cGVyKHJlc291cmNlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBib29sZWFuIGlzQW5ub3RhdGlvblJlcXVpcmVkKCkgew0KLQkJcmV0dXJuIHRydWU7DQotCX0JDQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gZ2V0QW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gCQ0KLQl7DQotCQlhc3NlcnQgZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLQ0KLQkJcmV0dXJuIGNyZWF0ZUlBbm5vdGF0aW9uKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKWdldFRhcmdldCgpLCByZXNvdXJjZSgpLmphdmFNb2RlbCgpKTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gY3JlYXRlSUFubm90YXRpb24oZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIGZpbmFsIElKYXZhTW9kZWwgamF2YU1vZGVsKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQludWxsQ2hlY2tQYXJhbShzZWksICJzZWkiKTsvLyROT04tTkxTLTEkDQotCQludWxsQ2hlY2tQYXJhbShqYXZhTW9kZWwsICJqYXZhTW9kZWwiKTsvLyROT04tTkxTLTEkDQotCQkNCi0JCWlmIChzZWkuaXNJbXBsaWNpdCgpKSANCi0JCXsNCi0JCQlpZiAoc2VpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuc2l6ZSgpID09IDApIHsNCi0JCQkJLy8gdGhlIGltcGxpY2l0IFNFSSBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcHJvamVjdA0KLQkJCQlyZXR1cm4gbnVsbDsNCi0JCQl9DQotCQkJDQotCQkJcmV0dXJuIG5ldyBXc1NlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlKCkpLmNyZWF0ZUlBbm5vdGF0aW9uKHNlaS5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLmdldCgwKSwgamF2YU1vZGVsKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgSVR5cGUgdHlwZSA9IGZpbmRUeXBlKHNlaSwgc2VpLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJaWYgKHR5cGUgPT0gbnVsbCkgew0KLQkJCS8vIHRoZSBleHBsaWNpdCBTRUkgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gdGhlIHByb2plY3QNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0NCi0JCWZpbmFsIFNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVQYWlycyA9IGNyZWF0ZVBhcmFtVmFsdWVTb3J0ZWRUcmVlU2V0KCk7DQotDQotCQlpZiAoc2VpLmdldE5hbWUoKSE9bnVsbCAmJiAhc2VpLmdldE5hbWUoKS5lcXVhbHMoSmF4V3NVdGlscy5nZXREZWZhdWx0UG9ydHR5cGVOYW1lKHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpKSkpIHsNCi0JCQlwYXJhbVZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoV1NBbm5vdGF0aW9uRmVhdHVyZXMuTkFNRV9BVFRSSUJVVEUsIHNlaS5nZXROYW1lKCkpKTsNCi0JCX0NCi0JCWlmIChzZWkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkhPW51bGwgJiYgIXNlaS5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoSmF4V3NVdGlscy5jb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2UodHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpKSkpIHsNCi0JCQlwYXJhbVZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoV1NBbm5vdGF0aW9uRmVhdHVyZXMuVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEUsIHNlaS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbihXU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OLCB0eXBlLCBwYXJhbVZhbHVlUGFpcnMpOwkNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0ZmJiM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1NlcmlhbGl6ZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW07DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQW5ub3RhdGlvblNlcmlhbGl6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5Eb21BZGFwdGVyRmFjdG9yeTsNCi0vKioNCi0gKiBGYWN0b3J5IGZvciBzZXJpYWxpemF0aW9uIGFkYXB0ZXJzLiBUaGlzIGZhY3RvcnkgaXMgaW5zdGFudGlhdGVkIG9uIGNvbnN0cnVjdGlvbiBieSANCi0gKiB7QGxpbmsgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZX0gYW5kIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IHVzZSB0aGUgc2FtZSBpbnN0YW5jZQ0KLSAqIGluIGNhc2UgeW91IG5lZWQgdGhpcyBmYWN0b3J5Lg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgRG9tQWRhcHRlckZhY3RvcnkNCi17DQotCXByaXZhdGUgZmluYWwgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZTsNCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciANCi0JICogQHBhcmFtIHJlc291cmNlDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5yZXNvdXJjZTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4NCi0JICovDQotCXB1YmxpYyBTZXJpYWxpemVyQWRhcHRlckZhY3RvcnkoZmluYWwgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSkgDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKHJlc291cmNlLCAicmVzb3VyY2UiKTsvLyROT04tTkxTLTEkDQotCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViU2VydmljZUFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IFdzU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IFNlaVNlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJNZXRob2RBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG5ldyBNZXRob2RTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViUGFyYW1BZGFwdGVyKCkgew0KLQkJcmV0dXJuIG5ldyBQYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKQ0KLQl7DQotCQlyZXR1cm4gSUFubm90YXRpb25TZXJpYWxpemVyLmNsYXNzID09IHR5cGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1dzU2VyaWFsaXplckFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9Xc1NlcmlhbGl6ZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRlMWQ1YzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1dzU2VyaWFsaXplckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkpheFdzVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbTsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIHRoYXQgb24ge0BsaW5rIElXZWJTZXJ2aWNlfSBvYmplY3QgY2hhbmdlIHNhdmVzIHRoZSBhbm5vdGF0aW9uIHRvIA0KLSAqIHRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXQuIFVzZXMge0BsaW5rIEpheFdzV29ya3NwYWNlUmVzb3VyY2V9IHRvIGRlZmluZSANCi0gKiBpZiBzYXZlIG9wZXJhdGlvbiBpcyBlbmFibGVkLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgV3NTZXJpYWxpemVyQWRhcHRlciBleHRlbmRzIEFic3RyYWN0U2VyaWFsaXplckFkYXB0ZXINCi17DQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciANCi0JICogQHBhcmFtIHJlc291cmNlDQotCSAqLw0KLQlwdWJsaWMgV3NTZXJpYWxpemVyQWRhcHRlcihKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKSANCi0Jew0KLQkJc3VwZXIocmVzb3VyY2UpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBbm5vdGF0aW9uUmVxdWlyZWQoKSB7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQkJDQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gZ2V0QW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCWFzc2VydCBnZXRUYXJnZXQoKSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlOw0KLQkJDQotCQlyZXR1cm4gY3JlYXRlSUFubm90YXRpb24oKElXZWJTZXJ2aWNlKWdldFRhcmdldCgpLCByZXNvdXJjZSgpLmphdmFNb2RlbCgpKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGNyZWF0ZUlBbm5vdGF0aW9uKGZpbmFsIElXZWJTZXJ2aWNlIHdzLCBmaW5hbCBJSmF2YU1vZGVsIGphdmFNb2RlbCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQludWxsQ2hlY2tQYXJhbSh3cywgIndzIik7Ly8kTk9OLU5MUy0xJA0KLQkJbnVsbENoZWNrUGFyYW0oamF2YU1vZGVsLCAiamF2YU1vZGVsIik7Ly8kTk9OLU5MUy0xJA0KLQkJDQotCQlmaW5hbCBJVHlwZSB0eXBlID0gZmluZFR5cGUod3MsIHdzLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJaWYgKHR5cGU9PW51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZVBhaXJzID0gY3JlYXRlUGFyYW1WYWx1ZVNvcnRlZFRyZWVTZXQoKTsNCi0JCQ0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSB3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKTsNCi0JCWlmIChzZWkhPW51bGwpIA0KLQkJewkJCQ0KLQkJCWlmIChzZWkuaXNJbXBsaWNpdCgpKSANCi0JCQl7DQotCQkJCVN0cmluZyBzZWlOYW1lID0gc2VpLmdldE5hbWUoKTsNCi0JCQkJaWYgKCFKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0dHlwZU5hbWUoc2VpLmdldEltcGxlbWVudGF0aW9uKCkpLmVxdWFscyhzZWlOYW1lKSkgew0KLQkJCQkJcGFyYW1WYWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFdTQW5ub3RhdGlvbkZlYXR1cmVzLk5BTUVfQVRUUklCVVRFLCB3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKS5nZXROYW1lKCkpKTsNCi0JCQkJfQ0KLQkJCX0gZWxzZSB7DQotCQkJCXBhcmFtVmFsdWVQYWlycy5hZGQoY3JlYXRlUGFyYW1WYWx1ZShXU0Fubm90YXRpb25GZWF0dXJlcy5FTkRQT0lOVF9JTlRFUkZBQ0VfQVRUUklCVVRFLCB3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKS5nZXRJbXBsZW1lbnRhdGlvbigpKSk7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlpZiAod3MuZ2V0TmFtZSgpIT1udWxsICYmIA0KLQkJCSF3cy5nZXROYW1lKCkuZXF1YWxzKEpheFdzVXRpbHMuZ2V0RGVmYXVsdFNlcnZpY2VOYW1lKHdzLmdldEltcGxlbWVudGF0aW9uKCkpKSkgDQotCQl7DQotCQkJcGFyYW1WYWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFdTQW5ub3RhdGlvbkZlYXR1cmVzLlNFUlZJQ0VfTkFNRV9BVFRSSUJVVEUsIHdzLmdldE5hbWUoKSkpOw0KLQkJfQkJCQkNCi0JCWlmICh3cy5nZXRQb3J0TmFtZSgpIT1udWxsICYmIA0KLQkJCSF3cy5nZXRQb3J0TmFtZSgpLmVxdWFscyhKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0TmFtZSh3cy5nZXRJbXBsZW1lbnRhdGlvbigpKSkpIA0KLQkJew0KLQkJCXBhcmFtVmFsdWVQYWlycy5hZGQoY3JlYXRlUGFyYW1WYWx1ZShXU0Fubm90YXRpb25GZWF0dXJlcy5QT1JUX05BTUVfQVRUUklCVVRFLCB3cy5nZXRQb3J0TmFtZSgpKSk7DQotCQl9DQotCQlpZiAod3MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkhPW51bGwgJiYgDQotCQkJIXdzLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSh0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCkpKSkgDQotCQl7DQotCQkJcGFyYW1WYWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFdTQW5ub3RhdGlvbkZlYXR1cmVzLlRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFLCB3cy5nZXRUYXJnZXROYW1lc3BhY2UoKSkpOw0KLQkJfQ0KLQkJaWYgKHdzLmdldFdzZGxMb2NhdGlvbigpIT1udWxsKSB7DQotCQkJcGFyYW1WYWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFdTQW5ub3RhdGlvbkZlYXR1cmVzLldTRExfTE9DQVRJT05fQVRUUklCVVRFLCB3cy5nZXRXc2RsTG9jYXRpb24oKSkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbihXU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OLCB0eXBlLCBwYXJhbVZhbHVlUGFpcnMpOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvTWV0aG9kUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvTWV0aG9kUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWZhODU4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL01ldGhvZFByb3BlcnR5U3RhdGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLQ0KLS8qKg0KLSAqIERlZmluZXMgdGhlIHN0YXRlIG9mIHdlYiBtZXRob2QgcHJvcGVydGllcy4gSW4gY2FzZSB0aGUgbWV0aG9kIGlzIHBhcnQgb2YNCi0gKiBvdXRzaWRlLWluIHdlYiBzZXJ2aWNlIGFsbCBwcm9wZXJ0aWVzIGFyZSBpbW11dGFibGUuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNZXRob2RQcm9wZXJ0eVN0YXRlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSVByb3BlcnR5U3RhdGUgDQotew0KLQlwdWJsaWMgYm9vbGVhbiBpc0NoYW5nZWFibGUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIA0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIG1ldGhvZCA9IChJV2ViTWV0aG9kKWdldFRhcmdldCgpOyANCi0JCWlmIChpc091dGlkZUluV3MobWV0aG9kKSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCQ0KLQkJc3dpdGNoKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkpDQotCQl7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX05BTUU6DQotCQkJcmV0dXJuIHRydWU7DQotCQl9CQkNCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlwcml2YXRlIGJvb2xlYW4gaXNPdXRpZGVJbldzKGZpbmFsIElXZWJNZXRob2QgbWV0aG9kKQ0KLQl7DQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKW1ldGhvZC5lQ29udGFpbmVyKCk7DQotCQlpZiAoc2VpPT1udWxsKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJDQotCQlmb3IgKElXZWJTZXJ2aWNlIHdlYlNlcnZpY2UgOiBzZWkuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKSkgew0KLQkJCWlmICh3ZWJTZXJ2aWNlLmdldFdzZGxMb2NhdGlvbigpIT1udWxsKSB7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eVN0YXRlLmNsYXNzID09IHR5cGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9QYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9QYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMDJlYTczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvUGFyYW1ldGVyUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlTdGF0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5KZWU1RG9tVXRpbHM7DQotDQotLyoqDQotICogQ2xhc3MgdGhhdCBkZWZpbmVzIHdoaWNoIHByb3BlcnRpZXMgZm9yIHtAbGluayBJV2ViUGFyYW19IGFyZSBlZGl0YWJsZQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyUHJvcGVydHlTdGF0ZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElQcm9wZXJ0eVN0YXRlDQotew0KLQlwdWJsaWMgYm9vbGVhbiBpc0NoYW5nZWFibGUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIAkNCi0Jew0KLQkJYXNzZXJ0IGdldFRhcmdldCgpIGluc3RhbmNlb2YgSVdlYlBhcmFtOw0KLQkJDQotCQlmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0gPSAoSVdlYlBhcmFtKWdldFRhcmdldCgpOw0KLQkJaWYgKHdlYlBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKCJyZXR1cm4iKSkgey8vJE5PTi1OTFMtMSQNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCWlmIChpc091dHNpZGVJbldlYlNlcnZpY2Uod2ViUGFyYW0pKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJDQotCQlzd2l0Y2goZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSkgDQotCQl7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fTkFNRToNCi0JCQlyZXR1cm4gaXNOYW1lQ2hhbmdlYWJsZSh3ZWJQYXJhbSk7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fUEFSVF9OQU1FOg0KLQkJCXJldHVybiBpc1BhcnROYW1lQ2hhbmdlYWJsZSh3ZWJQYXJhbSk7CQkJDQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQlyZXR1cm4gaXNUYXJnZXROU0NoYW5nZWFibGUod2ViUGFyYW0pOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCXByb3RlY3RlZCBib29sZWFuIGlzUGFydE5hbWVDaGFuZ2VhYmxlKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCk7CQkNCi0JCQ0KLQkJcmV0dXJuICh3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdTdHlsZSgpPT1TT0FQQmluZGluZ1N0eWxlLlJQQyAmJg0KLQkJCQl3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdVc2UoKT09U09BUEJpbmRpbmdVc2UuTElURVJBTCAmJg0KLQkJCQl3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpPT1TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05hbWVDaGFuZ2VhYmxlKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCk7CQkNCi0JCWlmIChpc0RvY3VtZW50TGl0ZXJhbFdyYXBwZWQod2ViTWV0aG9kKSkgew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlpZiAoSmVlNURvbVV0aWxzLmdldEluc3RhbmNlKCkuaXNOYW1lUmVxdWlyZWQod2ViUGFyYW0pKSB7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQkNCi0JCXJldHVybiB3ZWJQYXJhbS5pc0hlYWRlcigpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhcmdldE5TQ2hhbmdlYWJsZShmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0pDQotCXsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kID0gKElXZWJNZXRob2Qpd2ViUGFyYW0uZUNvbnRhaW5lcigpOwkJDQotCQlpZiAoaXNEb2N1bWVudExpdGVyYWxXcmFwcGVkKHdlYk1ldGhvZCkpIHsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHdlYlBhcmFtLmlzSGVhZGVyKCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBib29sZWFuIGlzRG9jdW1lbnRMaXRlcmFsV3JhcHBlZChmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCkNCi0Jew0KLQkJcmV0dXJuICEod2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nU3R5bGUoKT09U09BUEJpbmRpbmdTdHlsZS5SUEMgfHwNCi0JCQkJd2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nVXNlKCk9PVNPQVBCaW5kaW5nVXNlLkVOQ09ERUQgfHwNCi0JCQkJd2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKT09U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNPdXRzaWRlSW5XZWJTZXJ2aWNlKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSl3ZWJQYXJhbS5lQ29udGFpbmVyKCkuZUNvbnRhaW5lcigpOwkJDQotCQlyZXR1cm4gRG9tVXRpbC5JTlNUQU5DRS5pc091dHNpZGVJbldlYlNlcnZpY2Uoc2VpKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiBJUHJvcGVydHlTdGF0ZS5jbGFzcyA9PSB0eXBlOw0KLQl9CQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1Byb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9Qcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzU3ODVmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1Byb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3RhdGU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlTdGF0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuRG9tQWRhcHRlckZhY3Rvcnk7DQotDQotLyoqDQotICogQWRhcHRlciBmYWN0b3J5IGZvciBhZGFwdGVycyBpbXBsZW1lbnRpbmcge0BsaW5rIElQcm9wZXJ0eVN0YXRlfSBpbnRlcmZhY2UuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBEb21BZGFwdGVyRmFjdG9yeQ0KLXsNCi0JLyoqDQotCSAqIFNpbmdsZXRvbiBpbnN0YW5jZSBmb3IgdGhpcyBhZGFwdGVyIGZhY3RvcnkgDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBQcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnkoKTsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsNCi0JCXJldHVybiBJUHJvcGVydHlTdGF0ZS5jbGFzcyA9PSBvYmplY3Q7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViU2VydmljZUFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IFdzUHJvcGVydHlTdGF0ZUFkYXB0ZXIoKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG5ldyBTZWlQcm9wZXJ0eVN0YXRlQWRhcHRlcigpOw0KLQl9CQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJNZXRob2RBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG5ldyBNZXRob2RQcm9wZXJ0eVN0YXRlQWRhcHRlcigpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYlBhcmFtQWRhcHRlcigpew0KLQkJcmV0dXJuIG5ldyBQYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlcigpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvU2VpUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvU2VpUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmJjYzZjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1NlaVByb3BlcnR5U3RhdGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi0NCi0vKioNCi0gKiB7QGxpbmsgSVByb3BlcnR5U3RhdGV9IGFkYXB0ZXIgZm9yIHtAbGluayBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlfSBvYmplY3RzLg0KLSAqICANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFNlaVByb3BlcnR5U3RhdGVBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBJUHJvcGVydHlTdGF0ZQ0KLXsNCi0JcHVibGljIGJvb2xlYW4gaXNDaGFuZ2VhYmxlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSANCi0Jew0KLQkJaWYgKCEoZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlnZXRUYXJnZXQoKTsNCi0JCWlmIChpc091dHNpZGVJbldzKHNlaSkpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCXN3aXRjaChmZWF0dXJlLmdldEZlYXR1cmVJRCgpKQ0KLQkJew0KLQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fTkFNRToNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJcmV0dXJuICFzZWkuaXNJbXBsaWNpdCgpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNPdXRzaWRlSW5XcyhJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSkgDQotCXsJCQ0KLQkJZm9yIChJV2ViU2VydmljZSB3ZWJTZXJ2aWNlIDogc2VpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkpIHsNCi0JCQlpZiAod2ViU2VydmljZS5nZXRXc2RsTG9jYXRpb24oKSE9bnVsbCkgew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiBJUHJvcGVydHlTdGF0ZS5jbGFzcyA9PSB0eXBlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvV3NQcm9wZXJ0eVN0YXRlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9Xc1Byb3BlcnR5U3RhdGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3MDNlYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9Xc1Byb3BlcnR5U3RhdGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotDQotLyoqDQotICoge0BsaW5rIElQcm9wZXJ0eVN0YXRlfSBhZGFwdGVyIGZvciB7QGxpbmsgSVdlYlNlcnZpY2V9IG9iamVjdHMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXc1Byb3BlcnR5U3RhdGVBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBJUHJvcGVydHlTdGF0ZQ0KLXsNCi0JcHVibGljIGJvb2xlYW4gaXNDaGFuZ2VhYmxlKGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSANCi0Jew0KLQkJaWYgKCEoZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBJV2ViU2VydmljZSkpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlpZiAoaXNPdXRzaWRlSW5XcygoSVdlYlNlcnZpY2UpZ2V0VGFyZ2V0KCkpKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJDQotCQlzd2l0Y2goZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSkNCi0JCXsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX05BTUU6IA0KLQkJCXJldHVybiB0cnVlOw0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fUE9SVF9OQU1FOg0KLQkJCXJldHVybiB0cnVlOw0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc091dHNpZGVJbldzKGZpbmFsIElXZWJTZXJ2aWNlIHdzKSANCi0Jew0KLQkJcmV0dXJuIHdzLmdldFdzZGxMb2NhdGlvbigpICE9IG51bGw7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7DQotCQlyZXR1cm4gSVByb3BlcnR5U3RhdGUuY2xhc3MgPT0gdHlwZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvQWJzdHJhY3RNZXRob2RTeW5jaHJvbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9BYnN0cmFjdE1ldGhvZFN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NWQzZDJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9BYnN0cmFjdE1ldGhvZFN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuU0JBbm5vdGF0aW9uRmVhdHVyZXMuU0JfQU5OT1RBVElPTjsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XTUFubm90YXRpb25GZWF0dXJlcy5XTV9BTk5PVEFUSU9OOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0VYQ0xVREVEX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XTUFubm90YXRpb25GZWF0dXJlcy5XTV9OQU1FX0FUVFJJQlVURTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklBbm5vdGF0aW9uU2VyaWFsaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5TQkFubm90YXRpb25GZWF0dXJlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotDQotDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWV0aG9kU3luY2hyb25pemVyIGV4dGVuZHMgRWxlbWVudFN5bmNocm9uaXplckltcGwNCi17DQotCXByaXZhdGUgUGFyYW1ldGVyU3luY2hyb25pemVyIHBhcmFtZXRlclN5bmNocm9uaXplciA9IG5ldyBQYXJhbWV0ZXJTeW5jaHJvbml6ZXIodGhpcyk7DQotCQ0KLQlwcm90ZWN0ZWQgaW50ZXJmYWNlIElNZXRob2RWaXNpdG9yDQotCXsNCi0JCXZvaWQgdmlzaXQoSU1ldGhvZCBtZXRob2QsIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsNCi0JfQ0KLQ0KLQlwdWJsaWMgQWJzdHJhY3RNZXRob2RTeW5jaHJvbml6ZXIoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQpDQotCXsNCi0JCXN1cGVyKHBhcmVudCk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmlzaXRFeHBvc2FibGVNZXRob2RzKElNZXRob2RWaXNpdG9yIHZpc2l0b3IsIElUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLQ0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZU1ldGhvZHMoZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIGZpbmFsIElUeXBlIHNlaVR5cGUsIGZpbmFsIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBDb2xsZWN0aW9uPElXZWJNZXRob2Q+IG1lcmdlZE1ldGhvZHMgPSBuZXcgTGlua2VkTGlzdDxJV2ViTWV0aG9kPigpOw0KLQkJZmluYWwgSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5ID0gc2VpVHlwZS5uZXdTdXBlcnR5cGVIaWVyYXJjaHkobnVsbCk7DQotCQlmaW5hbCBJTWV0aG9kVmlzaXRvciB2aXNpdG9yID0gbmV3IElNZXRob2RWaXNpdG9yKCkNCi0JCXsNCi0JCQlwdWJsaWMgdm9pZCB2aXNpdChJTWV0aG9kIG1ldGhvZCwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCQkJew0KLQkJCQlmaW5hbCBJV2ViTWV0aG9kIHdtID0gb2J0YWluSW5zdGFuY2Uoc2VpLCBtZXRob2QpOw0KLQkJCQlpZiAobWVyZ2VkTWV0aG9kcy5jb250YWlucyh3bSkpDQotCQkJCXsNCi0JCQkJCS8qKg0KLQkJCQkJICogY2hlY2sgd2hldGhlciB0aGlzIG1ldGhvZCBoYXMgYmVlbiBwcm9jZXNzZWQgaW4gc29tZSBvZiB0aGUgY2hpbGQgY2xhc3Nlcy4gSWYgc28NCi0JCQkJCSAqIHNraXAgaXQgYW5kIGNvbnRpbnVlLiBPbmx5IHRoZSBtZXRob2QgaW4gdGhlIGxhc3QgY2hpbGQgZGVjbGFyaW5nIHRoaXMgbWV0aG9kIG5lZWRzDQotCQkJCQkgKiB0byBiZSBwcm9jZXNzZWQgYmVjYXVzZSBlYWNoIGNoaWxkIGlzIG92ZXJyaWRpbmcgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBldmVyeSBvdmVycmlkZW4NCi0JCQkJCSAqIG1ldGhvZC4NCi0JCQkJCSAqLw0KLQkJCQkJcmV0dXJuOw0KLQkJCQl9DQotCQkJCW1lcmdlTWV0aG9kKHdtLCBtZXRob2QsIGluc3BlY3Rvcik7DQotCQkJCW1lcmdlZE1ldGhvZHMuYWRkKHdtKTsNCi0JCQl9DQotCQl9Ow0KLQkJdmlzaXRFeHBvc2FibGVNZXRob2RzKHZpc2l0b3IsIGhpZXJhcmNoeSwgaW5zcGVjdG9yKTsNCi0JCXJlbW92ZUxlZnRNZXRob2RzKHNlaSwgbWVyZ2VkTWV0aG9kcyk7DQotDQotCX0NCi0NCi0JcHJpdmF0ZSBJV2ViTWV0aG9kIG9idGFpbkluc3RhbmNlKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpLCBJTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmb3IgKElXZWJNZXRob2Qgd20gOiBzZWkuZ2V0V2ViTWV0aG9kcygpKQ0KLQkJew0KLQkJCWlmICh1dGlsKCkuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkuZXF1YWxzKHdtLmdldEltcGxlbWVudGF0aW9uKCkpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHdtOw0KLQkJCX0NCi0JCX0NCi0JCWZpbmFsIElXZWJNZXRob2QgbmV3V2ViTWV0aG9kID0gZG9tRmFjdG9yeSgpLmNyZWF0ZUlXZWJNZXRob2QoKTsNCi0JCXNlaS5nZXRXZWJNZXRob2RzKCkuYWRkKG5ld1dlYk1ldGhvZCk7DQotCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKG5ld1dlYk1ldGhvZCwgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fSU1QTEVNRU5UQVRJT04sIHV0aWwoKS5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQlyZXR1cm4gbmV3V2ViTWV0aG9kOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBtZXJnZU1ldGhvZChJV2ViTWV0aG9kIHdtLCBJTWV0aG9kIG0sIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjxJTWV0aG9kPiB3bUFubm90YXRpb24gPSBpbnNwZWN0b3IuaW5zcGVjdE1ldGhvZChtLCBXTV9BTk5PVEFUSU9OKTsNCi0JCWZpbmFsIGJvb2xlYW4gZXhjbHVkZWQ7DQotCQlmaW5hbCBTdHJpbmcgbmFtZTsNCi0JCWlmICh3bUFubm90YXRpb24gPT0gbnVsbCkNCi0JCXsNCi0JCQlleGNsdWRlZCA9IGZhbHNlOw0KLQkJCW5hbWUgPSBtLmdldEVsZW1lbnROYW1lKCk7DQotCQl9IGVsc2UNCi0JCXsNCi0JCQlleGNsdWRlZCA9IHdtQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdNX0VYQ0xVREVEX0FUVFJJQlVURSkgPT0gbnVsbCA/IGZhbHNlIDogQm9vbGVhbi5wYXJzZUJvb2xlYW4od21Bbm5vdGF0aW9uDQotCQkJCQkJCQkJCQkuZ2V0UHJvcGVydHlWYWx1ZShXTV9FWENMVURFRF9BVFRSSUJVVEUpKTsNCi0JCQluYW1lID0gd21Bbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoV01fTkFNRV9BVFRSSUJVVEUpID09IG51bGwgPyBtLmdldEVsZW1lbnROYW1lKCkgOiB3bUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXTV9OQU1FX0FUVFJJQlVURSk7DQotCQl9DQotCQlpZiAoIW5hbWUuZXF1YWxzKHdtLmdldE5hbWUoKSkpDQotCQl7DQotCQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZSh3bSwgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fTkFNRSwgbmFtZSk7DQotCQl9DQotCQlpZiAoZXhjbHVkZWQgIT0gd20uaXNFeGNsdWRlZCgpKQ0KLQkJew0KLQkJCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUod20sIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX0VYQ0xVREVELCBleGNsdWRlZCk7DQotCQl9DQotCQltZXJnZVNvYXBCaW5kaW5nKHdtLCBtLCBpbnNwZWN0b3IpOw0KLQkJcGFyYW1ldGVyU3luY2hyb25pemVyLnN5bmNocm9uaXplUGFyYW1ldGVycyh3bSwgbSwgaW5zcGVjdG9yKTsNCi0JCQ0KLQkJcmVzb3VyY2UoKS5nZXRTZXJpYWxpemVyRmFjdG9yeSgpLmFkYXB0KHdtLCBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MpOw0KLQkJYWRhcHRUb0xvY2F0aW9uSW50ZXJmYWNlKHdtLCBXTV9BTk5PVEFUSU9OLCB3bUFubm90YXRpb24pOw0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgbWVyZ2VTb2FwQmluZGluZyhmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgZmluYWwgSU1ldGhvZCBtZXRob2QsIGZpbmFsIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjxJTWV0aG9kPiBzYkFubm90YXRpb24gPSBpbnNwZWN0b3IuaW5zcGVjdE1ldGhvZChtZXRob2QsIFNCX0FOTk9UQVRJT04pOw0KLQkJZmluYWwgSUFubm90YXRpb248SVR5cGU+IHNlaVNiQW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0VHlwZShTQl9BTk5PVEFUSU9OKTsNCi0JCQ0KLQkJZmluYWwgU09BUEJpbmRpbmdTdHlsZSBzdHlsZSA9IGRlZmluZVNCU3R5bGUoc2JBbm5vdGF0aW9uLCBzZWlTYkFubm90YXRpb24pOw0KLQkJaWYgKHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1N0eWxlKCkgIT0gc3R5bGUpIHsNCi0JCQl3ZWJNZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShzdHlsZSk7DQotCQl9DQotCQkNCi0JCWZpbmFsIFNPQVBCaW5kaW5nVXNlIHVzZSA9IGRlZmluZVNCVXNlKHNiQW5ub3RhdGlvbiwgc2VpU2JBbm5vdGF0aW9uKTsNCi0JCWlmICh3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdVc2UoKSAhPSB1c2UpIHsNCi0JCQl3ZWJNZXRob2Quc2V0U29hcEJpbmRpbmdVc2UodXNlKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBwYXJhbVN0eWxlID1kZWZpbmVTQlBhcmFtZXRlclN0eWxlKHNiQW5ub3RhdGlvbiwgc2VpU2JBbm5vdGF0aW9uKTsNCi0JCWlmICh3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpICE9IHBhcmFtU3R5bGUpIHsNCi0JCQl3ZWJNZXRob2Quc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShwYXJhbVN0eWxlKTsNCi0JCX0NCi0JCQ0KLQkJYWRhcHRUb0xvY2F0aW9uSW50ZXJmYWNlKHdlYk1ldGhvZCwgU0JfQU5OT1RBVElPTiwgc2JBbm5vdGF0aW9uKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTT0FQQmluZGluZ1N0eWxlIGRlZmluZVNCU3R5bGUoZmluYWwgSUFubm90YXRpb248SU1ldGhvZD4gbWV0aG9kU0JBbm5vdGF0aW9uLCBmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZT4gc2VpU2JBbm5vdGF0aW9uKQ0KLQl7DQotCQlmaW5hbCBTdHJpbmcgdmFsdWUgPSBtZXRob2RTQkFubm90YXRpb24hPW51bGwgPyBtZXRob2RTQkFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShTQkFubm90YXRpb25GZWF0dXJlcy5TVFlMRV9BVFRSSUJVVEUpIDogbnVsbDsNCi0JCWlmKHZhbHVlPT1udWxsKSB7DQotCQkJcmV0dXJuIGRlZkNhbGMoKS5kZWZpbmVTQlN0eWxlKHNlaVNiQW5ub3RhdGlvbik7DQotCQl9DQotCQkNCi0JCWlmIChTQkFubm90YXRpb25GZWF0dXJlcy5TQl9TVFlMRV9SUEMuZW5kc1dpdGgodmFsdWUpKSB7DQotCQkJcmV0dXJuIFNPQVBCaW5kaW5nU3R5bGUuUlBDOw0KLQkJfSANCi0JCQ0KLQkJaWYoU0JBbm5vdGF0aW9uRmVhdHVyZXMuU0JfU1RZTEVfRE9DVU1FTlQuZW5kc1dpdGgodmFsdWUpKSB7DQotCQkJcmV0dXJuIFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQ7DQotCQl9DQotCQkJDQotCQlyZXR1cm4gZGVmQ2FsYygpLmRlZmluZVNCU3R5bGUoc2VpU2JBbm5vdGF0aW9uKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTT0FQQmluZGluZ1VzZSBkZWZpbmVTQlVzZShmaW5hbCBJQW5ub3RhdGlvbjxJTWV0aG9kPiBtZXRob2RTQkFubm90YXRpb24sIGZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiBzZWlTYkFubm90YXRpb24pIA0KLQl7DQotCQlmaW5hbCBTdHJpbmcgdmFsdWUgPSBtZXRob2RTQkFubm90YXRpb24hPW51bGwgPyBtZXRob2RTQkFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShTQkFubm90YXRpb25GZWF0dXJlcy5VU0VfQVRUUklCVVRFKSA6IG51bGw7DQotCQlpZiAodmFsdWU9PW51bGwpIHsJCQ0KLQkJCXJldHVybiBkZWZDYWxjKCkuZGVmaW5lU0JVc2Uoc2VpU2JBbm5vdGF0aW9uKTsNCi0JCX0NCi0JCQ0KLQkJaWYgKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNCX1VTRV9FTkNPREVELmVuZHNXaXRoKHZhbHVlKSkgew0KLQkJCXJldHVybiBTT0FQQmluZGluZ1VzZS5FTkNPREVEOw0KLQkJfQ0KLQkJDQotCQlpZiAoU0JBbm5vdGF0aW9uRmVhdHVyZXMuU0JfVVNFX0xJVEVSQUwuZW5kc1dpdGgodmFsdWUpKSB7DQotCQkJcmV0dXJuIFNPQVBCaW5kaW5nVXNlLkxJVEVSQUw7DQotCQl9DQotCQkNCi0JCXJldHVybiBkZWZDYWxjKCkuZGVmaW5lU0JVc2Uoc2VpU2JBbm5vdGF0aW9uKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIGRlZmluZVNCUGFyYW1ldGVyU3R5bGUoZmluYWwgSUFubm90YXRpb248SU1ldGhvZD4gbWV0aG9kU0JBbm5vdGF0aW9uLCBmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZT4gc2VpU2JBbm5vdGF0aW9uKQ0KLQl7DQotCQlmaW5hbCBTdHJpbmcgdmFsdWUgPSBtZXRob2RTQkFubm90YXRpb24hPW51bGwgPyBtZXRob2RTQkFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShTQkFubm90YXRpb25GZWF0dXJlcy5QQVJBTUVURVJfU1RZTEVfQVRUUklCVVRFKSA6IG51bGw7DQotCQlpZiAodmFsdWU9PW51bGwpIHsNCi0JCQlyZXR1cm4gZGVmQ2FsYygpLmRlZmluZVNCUGFyYW1ldGVyU3R5bGUoc2VpU2JBbm5vdGF0aW9uKTsNCi0JCX0NCi0JCQ0KLQkJaWYgKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNCX1BBUkFNRVRFUl9TVFlMRV9CQVJFLmVuZHNXaXRoKHZhbHVlKSkgew0KLQkJCXJldHVybiBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkU7DQotCQl9DQotCQkNCi0JCWlmIChTQkFubm90YXRpb25GZWF0dXJlcy5TQl9QQVJBTUVURVJfU1RZTEVfV1JBUFBFRC5lbmRzV2l0aCh2YWx1ZSkpIHsNCi0JCQlyZXR1cm4gU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEOw0KLQkJfQkJDQotCQkNCi0JCXJldHVybiBkZWZDYWxjKCkuZGVmaW5lU0JQYXJhbWV0ZXJTdHlsZShzZWlTYkFubm90YXRpb24pOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCByZW1vdmVMZWZ0TWV0aG9kcyhJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSwgQ29sbGVjdGlvbjxJV2ViTWV0aG9kPiBtZXJnZWRNZXRob2RzKQ0KLQl7DQotCQlmaW5hbCBJdGVyYXRvcjxJV2ViTWV0aG9kPiBpdGVyID0gc2VpLmdldFdlYk1ldGhvZHMoKS5pdGVyYXRvcigpOw0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCWlmICghbWVyZ2VkTWV0aG9kcy5jb250YWlucyhpdGVyLm5leHQoKSkpDQotCQkJew0KLQkJCQlpdGVyLnJlbW92ZSgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL0Fic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWMyMzMzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQ29tcGlsYXRpb25Vbml0SGFuZGxlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5TZXJ2aWNlTW9kZWxEYXRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplciBpbXBsZW1lbnRzIElNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXINCi17DQotCXByaXZhdGUgZmluYWwgU2VpU3luY2hyb25pemVyIHNlaUxvYWRlcjsNCi0NCi0JcHJpdmF0ZSBmaW5hbCBXc1N5bmNocm9uaXplciB3c0xvYWRlcjsNCi0NCi0JcHJpdmF0ZSBmaW5hbCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlOw0KLQ0KLQlwcml2YXRlIElET00gZG9tQmVpbmdMb2FkZWQ7DQotDQotCXByaXZhdGUgZmluYWwgU2VydmljZU1vZGVsRGF0YSBzZXJ2aWNlRGF0YTsNCi0NCi0JcHJpdmF0ZSBmaW5hbCBEb21VdGlsIHV0aWw7DQotDQotCXB1YmxpYyBBYnN0cmFjdE1vZGVsU3luY2hyb25pemVyKEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UsIFNlcnZpY2VNb2RlbERhdGEgc2VydmljZURhdGEpDQotCXsNCi0JCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsNCi0JCXRoaXMudXRpbCA9IG5ldyBEb21VdGlsKCk7DQotCQl0aGlzLnNlcnZpY2VEYXRhID0gc2VydmljZURhdGE7DQotCQl0aGlzLnNlaUxvYWRlciA9IG5ldyBTZWlTeW5jaHJvbml6ZXIodGhpcyk7DQotCQl0aGlzLndzTG9hZGVyID0gbmV3IFdzU3luY2hyb25pemVyKHRoaXMpOw0KLQl9DQotDQotCXB1YmxpYyBEb21GYWN0b3J5IGRvbUZhY3RvcnkoKQ0KLQl7DQotCQlyZXR1cm4gRG9tRmFjdG9yeS5lSU5TVEFOQ0U7DQotCX0NCi0NCi0JcHVibGljIElET00gZ2V0RG9tQmVpbmdMb2FkZWQoKQ0KLQl7DQotCQlpZiAoZG9tQmVpbmdMb2FkZWQgPT0gbnVsbCkNCi0JCXsNCi0JCQlkb21CZWluZ0xvYWRlZCA9IGRvbUZhY3RvcnkoKS5jcmVhdGVJRE9NKCk7DQotCQl9DQotCQlyZXR1cm4gZG9tQmVpbmdMb2FkZWQ7DQotCX0NCi0NCi0JcHVibGljIElKYXZhTW9kZWwgamF2YU1vZGVsKCkNCi0Jew0KLQkJcmV0dXJuIHJlc291cmNlLmphdmFNb2RlbCgpOw0KLQl9DQotDQotCXB1YmxpYyBJTG9nZ2VyIGxvZ2dlcigpDQotCXsNCi0JCXJldHVybiByZXNvdXJjZS5sb2dnZXIoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSgpDQotCXsNCi0JCXJldHVybiByZXNvdXJjZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU2VydmljZU1vZGVsRGF0YSBzZXJ2aWNlRGF0YSgpDQotCXsNCi0JCXJldHVybiBzZXJ2aWNlRGF0YTsNCi0JfQ0KLQ0KLQlwdWJsaWMgRG9tVXRpbCB1dGlsKCkNCi0Jew0KLQkJcmV0dXJuIHV0aWw7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NvbXBpbGF0aW9uVW5pdChmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRyeSB7DQotCQkJcmVzb3VyY2UuZGlzYWJsZVNhdmluZygpOw0KLQkJCQ0KLQkJCWlmIChjdS5maW5kUHJpbWFyeVR5cGUoKSA9PSBudWxsIHx8ICEoY3UuZmluZFByaW1hcnlUeXBlKCkuaXNJbnRlcmZhY2UoKSB8fCBjdS5maW5kUHJpbWFyeVR5cGUoKS5pc0NsYXNzKCkpKQ0KLQkJCXsNCi0JCQkJaWYgKGxvZ2dlcigpLmlzRGVidWcoKSkNCi0JCQkJew0KLQkJCQkJbG9nZ2VyKCkubG9nRGVidWcoIm5vIHByaW1hcnkgdHlwZSBpbiBjb21waWxhdGlvbiB1bml0IiArIGN1LmdldFBhdGgoKS50b09TU3RyaW5nKCkpOy8vJE5PTi1OTFMtMSQNCi0JCQkJfQ0KLQkJCQlyZXR1cm47DQotCQkJfSANCi0JCQkJCQkNCi0JCQlmaW5hbCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IgPSByZXNvdXJjZSgpLm5ld0Fubm90YXRpb25JbnNwZWN0b3IoY3UuZmluZFByaW1hcnlUeXBlKCkpOw0KLQkJCWZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24gPSBpbnNwZWN0b3IuaW5zcGVjdFR5cGUoV1NfQU5OT1RBVElPTik7DQotCQkJaWYgKHdzQW5ub3RhdGlvbiA9PSBudWxsKQ0KLQkJCXsNCi0JCQkJaWYgKGxvZ2dlcigpLmlzRGVidWcoKSkNCi0JCQkJew0KLQkJCQkJbG9nZ2VyKCkubG9nRGVidWcoIm5vICIgKyBXU19BTk5PVEFUSU9OICsgIiBhbm5vdGF0aW9uIGZvdW5kIG9uIHR5cGUgIiArIGN1LmZpbmRQcmltYXJ5VHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJA0KLQkJCQl9DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQkJDQotCQkJcmVjb3JkSGllcmFyY2h5KGN1LmZpbmRQcmltYXJ5VHlwZSgpKTsNCi0JCQkNCi0JCQlpZiAod3NBbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCkuaXNJbnRlcmZhY2UoKSkNCi0JCQl7DQotCQkJCS8vIGhhbmRsZSBjbGFzcyBjaGFuZ2VkIHRvIGludGVyZmFjZQ0KLQkJCQlyZW1vdmVXc01vZGVsRWxlbWVudHMod3NQcm9qZWN0LCB3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgZmFsc2UpOw0KLQkJCQkNCi0JCQkJc2VpTG9hZGVyLnN5bmNocm9uaXplSW50ZXJmYWNlKHdzUHJvamVjdCwgd3NBbm5vdGF0aW9uLCBpbnNwZWN0b3IpOw0KLQkJCX0gZWxzZSBpZiAod3NBbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCkuaXNDbGFzcygpKQ0KLQkJCXsNCi0JCQkJLy8gaGFuZGxlIGludGVyZmFjZSBjaGFuZ2VkIHRvIGNsYXNzDQotCQkJCXJlbW92ZVNlaU1vZGVsRWxlbWVudHMod3NQcm9qZWN0LCB3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgZmFsc2UsIHRydWUpOw0KLQkJCQkNCi0JCQkJLy8gaWYgdGhlIGFubm90YXRpb24gaGFzIGNoYW5nZWQgYW5kIGVuZHBvaW50SW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIHRoZSBleGlzdGluZw0KLQkJCQkvLyBTRUkgaW4gdGhlIHByb2plY3Qgc2hvdWxkIGJlIHJlbW92ZWQNCi0JCQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSB3c0xvYWRlci5zeW5jaHJvbml6ZVdlYlNlcnZpY2Uod3NQcm9qZWN0LCB3c0Fubm90YXRpb24sIGluc3BlY3Rvcik7DQotCQkJCWlmICh3cyE9bnVsbCAmJiAod3MuZ2V0U2VydmljZUVuZHBvaW50KCk9PW51bGwgfHwgIXdzLmdldFNlcnZpY2VFbmRwb2ludCgpLmlzSW1wbGljaXQoKSkpIHsNCi0JCQkJCXJlbW92ZVNlaU1vZGVsRWxlbWVudHMod3NQcm9qZWN0LCB3cy5nZXRJbXBsZW1lbnRhdGlvbigpLCBmYWxzZSwgZmFsc2UpOw0KLQkJCQl9DQotCQkJfSBlbHNlDQotCQkJew0KLQkJCQlpZiAobG9nZ2VyKCkuaXNEZWJ1ZygpKQ0KLQkJCQl7DQotCQkJCQlsb2dnZXIoKS5sb2dEZWJ1ZygiYW5ub3RhdGlvbiAiICsgV1NfQU5OT1RBVElPTiArICIgaXMgcHV0IG9uIHR5cGUgIi8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkDQotCQkJCQkJCQkJKyB3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKQ0KLQkJCQkJCQkJCSsgIndoaWNoIGlzIG5laXRoZXIgaW50ZXJmYWNlLCBub3IgYSBjbGFzcy4gSWdub3JyaW5nISIpOy8vJE5PTi1OTFMtMSQNCi0JCQkJfQ0KLQkJCX0JCQkNCi0JCX0gZmluYWxseSB7DQotCQkJcmVzb3VyY2UuZW5hYmxlU2F2aW5nKCk7DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZW1vdmVzIHdlYiBzZXJ2aWNlcyBmcm9tIHRoZSBtb2RlbC4NCi0JICogQHBhcmFtIHdzUHJvamVjdA0KLQkgKiBAcGFyYW0gaW1wbEJhc2VOYW1lDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVXc01vZGVsRWxlbWVudHMoZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCwgZmluYWwgU3RyaW5nIGltcGxCYXNlTmFtZSwgZmluYWwgYm9vbGVhbiBpc0ZvclBhY2thZ2UpIA0KLQl7DQotCQlmaW5hbCBJdGVyYXRvcjxJV2ViU2VydmljZT4gd3NJdGVyID0gd3NQcm9qZWN0LmdldFdlYlNlcnZpY2VzKCkuaXRlcmF0b3IoKTsNCi0JCXdoaWxlICh3c0l0ZXIuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCWZpbmFsIElXZWJTZXJ2aWNlIHdzID0gd3NJdGVyLm5leHQoKTsNCi0JCQlpZiAod3MuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoaW1wbEJhc2VOYW1lKSB8fCANCi0JCQkJKGlzRm9yUGFja2FnZSAmJiB3cy5nZXRJbXBsZW1lbnRhdGlvbigpLnN0YXJ0c1dpdGgoaW1wbEJhc2VOYW1lKSkpDQotCQkJew0KLQkJCQlzZXJ2aWNlRGF0YSgpLmNsZWFySGllcmFyY2h5KHdzLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJCQl3c0l0ZXIucmVtb3ZlKCk7DQotCQkJCWlmICh3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKSAhPSBudWxsKQ0KLQkJCQl7DQotCQkJCQl3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKS5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLnJlbW92ZSh3cyk7DQotCQkJCX0NCi0JCQkJc2VydmljZURhdGEoKS51bm1hcCh3cyk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQkvKioNCi0JICogUmVtb3ZlcyBTRUkncyB3aXRoIDxjb2RlPmltcGxCYXNlTmFtZTwvY29kZT4gaW1wbGVtZW50YXRpb24gZnJvbSB0aGUgbW9kZWwuDQotCSAqIEBwYXJhbSB3c1Byb2plY3QNCi0JICogQHBhcmFtIGltcGxCYXNlTmFtZQ0KLQkgKiBAcGFyYW0gb25seUV4cGxpY2l0IGlmIDxjb2RlPnRydWU8L2NvZGU+IGltcGxpY2l0IGludGVyZmFjZXMgYXJlIG5vdCByZW1vdmVkIGZyb20gbW9kZWwsIG90aGVyd2lzZSBib3RoIGFyZSByZW1vdmVkLg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VpTW9kZWxFbGVtZW50cyhmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBmaW5hbCBTdHJpbmcgaW1wbEJhc2VOYW1lLCBmaW5hbCBib29sZWFuIGlzRm9yUGFja2FnZSwgZmluYWwgYm9vbGVhbiBvbmx5RXhwbGljaXQpIA0KLQl7DQotCQlmaW5hbCBJdGVyYXRvcjxJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPiBzZWlJdGVyID0gd3NQcm9qZWN0LmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKS5pdGVyYXRvcigpOw0KLQkJd2hpbGUgKHNlaUl0ZXIuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gc2VpSXRlci5uZXh0KCk7DQotCQkJaWYgKHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhpbXBsQmFzZU5hbWUpIHx8DQotCQkJCShpc0ZvclBhY2thZ2UgJiYgc2VpLmdldEltcGxlbWVudGF0aW9uKCkuc3RhcnRzV2l0aChpbXBsQmFzZU5hbWUpKSkNCi0JCQl7DQotCQkJCWlmICgob25seUV4cGxpY2l0ICYmIHNlaS5pc0ltcGxpY2l0KCkpKSB7DQotCQkJCQljb250aW51ZTsNCi0JCQkJfQ0KLQkJCQlzZXJ2aWNlRGF0YSgpLmNsZWFySGllcmFyY2h5KHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCQkJc2VpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuY2xlYXIoKTsNCi0JCQkJc2VpSXRlci5yZW1vdmUoKTsNCi0JCQl9DQotCQl9DQotCX0JDQotDQotCXZvaWQgcmVjb3JkSGllcmFyY2h5KElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgQ29sbGVjdGlvbjxJQ29tcGlsYXRpb25Vbml0PiBjb21waWxhdGlvblVuaXRzID0gbmV3IExpbmtlZExpc3Q8SUNvbXBpbGF0aW9uVW5pdD4oKTsNCi0JCQ0KLQkJZm9yIChJVHlwZSBzdXBlclR5cGUgOiB0eXBlLm5ld1N1cGVydHlwZUhpZXJhcmNoeShudWxsKS5nZXRBbGxTdXBlcnR5cGVzKHR5cGUpKSB7DQotCQkJY29tcGlsYXRpb25Vbml0cy5hZGQoc3VwZXJUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpKTsNCi0JCX0NCi0JCQkNCi0JCXNlcnZpY2VEYXRhKCkucmVjb3JkSGllcmFyY2h5KHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksIGNvbXBpbGF0aW9uVW5pdHMpOw0KLQl9DQotDQotDQotCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3QgY3JlYXRlUHJvamVjdChmaW5hbCBJSmF2YVByb2plY3QganByaikNCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHRoaXNQcm9qZWN0ID0gZG9tRmFjdG9yeSgpLmNyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdCgpOw0KLQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZSh0aGlzUHJvamVjdCwgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRSwganByai5nZXRFbGVtZW50TmFtZSgpKTsNCi0NCi0JCXV0aWwoKS5hZGRUb0NvbGxlY3Rpb25GZWF0dXJlKGdldERvbUJlaW5nTG9hZGVkKCksIERvbVBhY2thZ2UuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFMsIHRoaXNQcm9qZWN0KTsNCi0JCXJldHVybiB0aGlzUHJvamVjdDsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgY2xhc3MgTG9hZGVyQ29tcGlsYXRpb25Vbml0SGFuZGxlciBpbXBsZW1lbnRzIElDb21waWxhdGlvblVuaXRIYW5kbGVyDQotCXsNCi0JCXB1YmxpYyB2b2lkIHN0YXJ0ZWQoKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJcHVibGljIHZvaWQgZmluaXNoZWQoKQ0KLQkJew0KLQkJCXJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5hZGQoZ2V0RG9tQmVpbmdMb2FkZWQoKSk7DQotCQl9DQotDQotCQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdDsNCi0NCi0JCXB1YmxpYyB2b2lkIGhhbmRsZShmaW5hbCBJSmF2YVByb2plY3QganByaikNCi0JCXsNCi0JCQl3c1Byb2plY3QgPSBjcmVhdGVQcm9qZWN0KGpwcmopOw0KLQkJfQ0KLQ0KLQkJcHVibGljIHZvaWQgaGFuZGxlKGZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpDQotCQl7DQotCQkJdHJ5DQotCQkJew0KLQkJCQlwcm9jZXNzQ29tcGlsYXRpb25Vbml0KHdzUHJvamVjdCwgY3UpOw0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpDQotCQkJew0KLQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5hYmxlIHRvIHBhcnNlIHRoZSBjb250ZW50IG9mIGNvbXBpbGF0aW9uIHVuaXQiICsgY3UuZ2V0UGF0aCgpLnRvT1NTdHJpbmcoKSwgam1lKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvRWxlbWVudFN5bmNocm9uaXplckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9FbGVtZW50U3luY2hyb25pemVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZjgxOTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9FbGVtZW50U3luY2hyb25pemVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzRGVmYXVsdHNDYWxjdWxhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2UuU2VydmljZU1vZGVsRGF0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5JQW5ub3RhdGlvbkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi0NCi1jbGFzcyBFbGVtZW50U3luY2hyb25pemVySW1wbCBpbXBsZW1lbnRzIElNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXINCi17DQotDQotCXByaXZhdGUgZmluYWwgSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQ7DQotCXByaXZhdGUgZmluYWwgRG9tVXRpbCB1dGlsOw0KLQlwcml2YXRlIGZpbmFsIEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yIGRlZmF1bHRzQ2FsY3VsYXRvcjsNCi0JDQotCUVsZW1lbnRTeW5jaHJvbml6ZXJJbXBsKElNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXIgcGFyZW50KQ0KLQl7DQotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsNCi0JCXV0aWwgPSBuZXcgRG9tVXRpbCgpOw0KLQkJZGVmYXVsdHNDYWxjdWxhdG9yID0gbmV3IEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yKCk7DQotCX0NCi0JDQotCXB1YmxpYyBEb21VdGlsIHV0aWwoKSB7DQotCQlyZXR1cm4gdXRpbDsNCi0JfQ0KLQkNCi0JcHVibGljIEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yIGRlZkNhbGMoKSB7DQotCQlyZXR1cm4gZGVmYXVsdHNDYWxjdWxhdG9yOw0KLQl9DQotCQ0KLQlwdWJsaWMgU2VydmljZU1vZGVsRGF0YSBzZXJ2aWNlRGF0YSgpDQotCXsNCi0JCXJldHVybiBwYXJlbnQuc2VydmljZURhdGEoKTsNCi0JfQ0KLQkNCi0JcHVibGljIElMb2dnZXIgbG9nZ2VyKCkNCi0Jew0KLQkJcmV0dXJuIHBhcmVudC5sb2dnZXIoKTsNCi0JfQ0KLQkNCi0JcHVibGljIElET00gZ2V0RG9tQmVpbmdMb2FkZWQoKQ0KLQl7DQotCQlyZXR1cm4gcGFyZW50LmdldERvbUJlaW5nTG9hZGVkKCk7DQotCX0NCi0JDQotCXB1YmxpYyBEb21GYWN0b3J5IGRvbUZhY3RvcnkoKQ0KLQl7DQotCQlyZXR1cm4gcGFyZW50LmRvbUZhY3RvcnkoKTsNCi0JfQ0KLQkNCi0JcHVibGljIElKYXZhTW9kZWwgamF2YU1vZGVsKCkNCi0Jew0KLQkJcmV0dXJuIHBhcmVudC5qYXZhTW9kZWwoKTsNCi0JfQ0KLQkNCi0JcHVibGljIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UoKQ0KLQl7DQotCQlyZXR1cm4gcGFyZW50LnJlc291cmNlKCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIGFkYXB0VG9Mb2NhdGlvbkludGVyZmFjZShmaW5hbCBFT2JqZWN0IG9iamVjdCwgZmluYWwgU3RyaW5nIGFubkZRTmFtZSwgZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbikNCi0Jew0KLQkJZmluYWwgSUFubm90YXRpb25BZGFwdGVyIGxvY2F0b3IgPSAoSUFubm90YXRpb25BZGFwdGVyKUFubm90YXRpb25BZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChvYmplY3QsIElBbm5vdGF0aW9uQWRhcHRlci5jbGFzcyk7DQotCQlsb2NhdG9yLmFkZEFubm90YXRpb24oYW5uRlFOYW1lLCBhbm5vdGF0aW9uKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvSW5pdGlhbE1vZGVsU3luY2hyb25pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvSW5pdGlhbE1vZGVsU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRiYjAxYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL0luaXRpYWxNb2RlbFN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2UuU2VydmljZU1vZGVsRGF0YTsNCi0NCi1wdWJsaWMgY2xhc3MgSW5pdGlhbE1vZGVsU3luY2hyb25pemVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplcg0KLXsNCi0JcHVibGljIEluaXRpYWxNb2RlbFN5bmNocm9uaXplcihKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlLCBTZXJ2aWNlTW9kZWxEYXRhIHNlcnZpY2VEYXRhKQ0KLQl7DQotCQlzdXBlcihyZXNvdXJjZSwgc2VydmljZURhdGEpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGxvYWQoTWFwPD8sPz4gb3B0aW9ucywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24NCi0Jew0KLQkJdHJ5IHsNCi0JCQlyZXNvdXJjZSgpLmRpc2FibGVTYXZpbmcoKTsJCQkNCi0JCQlyZXNvdXJjZSgpLm5ld0NvbXBpbGF0aW9uVW5pdEZpbmRlcihyZXNvdXJjZSgpLmphdmFNb2RlbCgpLCByZXNvdXJjZSgpLmdldFByb2plY3RTZWxlY3RvcnMoKSkuDQotCQkJCWZpbmQobW9uaXRvciwgbmV3IExvYWRlckNvbXBpbGF0aW9uVW5pdEhhbmRsZXIoKSk7DQotCQl9IGZpbmFsbHkgew0KLQkJCXJlc291cmNlKCkuZW5hYmxlU2F2aW5nKCk7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL09uRXZlbnRNb2RlbFN5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL09uRXZlbnRNb2RlbFN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MmVjZTFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9PbkV2ZW50TW9kZWxTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT047DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQ29tcGlsYXRpb25Vbml0RmluZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSVByb2plY3RTZWxlY3RvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5Xb3Jrc3BhY2VDVUZpbmRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2UuU2VydmljZU1vZGVsRGF0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBPbkV2ZW50TW9kZWxTeW5jaHJvbml6ZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsU3luY2hyb25pemVyIGltcGxlbWVudHMgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXINCi17DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgSURPTSBnZXREb21CZWluZ0xvYWRlZCgpDQotCXsNCi0JCXJldHVybiByZXNvdXJjZSgpLmdldERPTSgpOw0KLQl9DQotDQotCXB1YmxpYyBPbkV2ZW50TW9kZWxTeW5jaHJvbml6ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSwgU2VydmljZU1vZGVsRGF0YSBzZXJ2aWNlRGF0YSkNCi0Jew0KLQkJc3VwZXIocmVzb3VyY2UsIHNlcnZpY2VEYXRhKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChmaW5hbCBFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQlpZiAobG9nZ2VyKCkuaXNEZWJ1ZygpKQ0KLQkJCXsNCi0JCQkJbG9nZ2VyKCkubG9nRGVidWcoIkVsZW1lbnRDaGFuZ2VkRXZlbnQgaGFzIGJlZW4gZGVsaXZlcmVkLiBFdmVudCBkZXRhaWxzOiAiICsgZXZlbnQudG9TdHJpbmcoKSk7Ly8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCQkNCi0JCQkvLyBubyBwcm9jZXNzaW5nIGlmIERPTSBsb2FkIGhhcyBiZWVuIGNhbmNlbGVkDQotCQkJaWYgKHJlc291cmNlKCkuaXNMb2FkQ25hY2VsZWQoKSkgew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJCQ0KLQkJCXJlc291cmNlKCkuZGlzYWJsZVNhdmluZygpOw0KLQkJCQ0KLQkJCS8vIGhhbmRsZXMgRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX1JFQ09OQ0lMRSAtIHRoZSBjYXNlIHdoZW4gdGhlIGVkaXRvciBzZW5kcyByZWNvbmNpbGUgZXZlbnQNCi0JCQlpZiAoZXZlbnQuZ2V0VHlwZSgpID09IEVsZW1lbnRDaGFuZ2VkRXZlbnQuUE9TVF9SRUNPTkNJTEUpDQotCQkJew0KLQkJCQloYW5kbGVSZWNvbmNpbGVFdmVudChldmVudCk7DQotCQkJfQ0KLQ0KLQkJCS8vIGhhbmRsZXMgRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX0NIQU5HRSAtIHRoZSBjYXNlIHdoZW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgaGFzIGJlZW4gY2hhbmdlZA0KLQkJCWlmIChldmVudC5nZXREZWx0YSgpLmdldEVsZW1lbnQoKSAhPSByZXNvdXJjZSgpLmphdmFNb2RlbCgpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCQkNCi0JCQlhc3NlcnQgKGV2ZW50LmdldERlbHRhKCkuZ2V0RmxhZ3MoKSAmIChJSmF2YUVsZW1lbnREZWx0YS5GX0NISUxEUkVOIHwgSUphdmFFbGVtZW50RGVsdGEuRl9DT05URU5UKSkgIT0gMDsNCi0JCQlmb3IgKElKYXZhRWxlbWVudERlbHRhIGNoaWxkIDogZXZlbnQuZ2V0RGVsdGEoKS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpDQotCQkJew0KLQkJCQlpZiAoY2hpbGQuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KQ0KLQkJCQl7DQotCQkJCQloYW5kbGVDaGFuZ2VkUHJvamVjdChjaGlsZCk7DQotCQkJCX0NCi0JCQl9DQotCQl9IA0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsNCi0JCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5hYmxlIHRvIHN5bmNocm9uaXplIFdlYiBTZXJ2aWNlIG1vZGVsIHVwb24gamF2YSBlbGVtZW50IGRlbHRhICIrIGV2ZW50LmdldERlbHRhKCksIGNlKTsgLy8kTk9OLU5MUy0xJA0KLQkJfSANCi0JCWNhdGNoIChXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiBlKSB7DQotCQkJbG9nZ2VyKCkubG9nRXJyb3IoIlVuYWJsZSB0byBzeW5jaHJvbml6ZSBXZWIgU2VydmljZSBtb2RlbCB1cG9uIGphdmEgZWxlbWVudCBkZWx0YSAiICsgZXZlbnQuZ2V0RGVsdGEoKSwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0gDQotCQlmaW5hbGx5IHsNCi0JCQlyZXNvdXJjZSgpLmVuYWJsZVNhdmluZygpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGVFdmVudChmaW5hbCBFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmKCEoZXZlbnQuZ2V0RGVsdGEoKS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0ICkpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCWludCByZXF1aXJlZEZsYWdzID0gSUphdmFFbGVtZW50RGVsdGEuRl9DT05URU5UIHwgSUphdmFFbGVtZW50RGVsdGEuRl9DSElMRFJFTjsNCi0JCQ0KLQkJaWYgKChldmVudC5nZXREZWx0YSgpLmdldEZsYWdzKCkgJiByZXF1aXJlZEZsYWdzKSA9PSAwKSB7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQ0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSA9IChJQ29tcGlsYXRpb25Vbml0KWV2ZW50LmdldERlbHRhKCkuZ2V0RWxlbWVudCgpOw0KLQkJaWYgKCFyZXNvdXJjZSgpLmFwcHJvdmVQcm9qZWN0KGN1LmdldEphdmFQcm9qZWN0KCkpKSB7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQ0KLQkJaWYgKGlzSmF2YVJlc291cmNlKGN1KSkgew0KLQkJCWhhbmRsZUNoYW5nZWRDb250ZW50Q29tcGlsYXRpb25Vbml0KGN1KTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBib29sZWFuIGlzSmF2YVJlc291cmNlKElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IGN1Ow0KLQkJd2hpbGUgKChqYXZhRWxlbWVudCA9IGphdmFFbGVtZW50LmdldFBhcmVudCgpKSAhPSBudWxsKSANCi0JCXsNCi0JCQlpZiAoIWphdmFFbGVtZW50LmV4aXN0cygpKSB7DQotCQkJCXJldHVybiBmYWxzZTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCQ0KLQl2b2lkIGhhbmRsZUNoYW5nZWRQcm9qZWN0KElKYXZhRWxlbWVudERlbHRhIHByb2plY3REZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uDQotCXsNCi0JCWFzc2VydCAocHJvamVjdERlbHRhLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCk7DQotCQ0KLQkJaWYgKCgoKHByb2plY3REZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9DTE9TRUQpICE9IDApIHx8IHByb2plY3REZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCkNCi0JCQkmJiBudWxsICE9IHV0aWwoKS5maW5kUHJvamVjdEJ5TmFtZShnZXREb21CZWluZ0xvYWRlZCgpLCBwcm9qZWN0RGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCkpKQ0KLQkJew0KLQkJCS8vaWYgdGhlIHByb2plY3QgaGFzIGJlZW4gY2xvc2VkIHRoZW4gaXQncyBmYWNldCdzIGNvdWxkIG5vdCBiZSByZWFkLiBUaHVzIHRoZSBhcHByb3ZlIG1ldGhvZA0KLQkJCS8vd2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlLiBUaGF0J3Mgd2h5IHdlIGNoZWNrIGlmIHRoZSBwcm9qZWN0IGhhcyBhbHJlYWR5IGJlZW4gaW4gdGhlIA0KLQkJCWhhbmRsZUNsb3NlZFByb2plY3QocHJvamVjdERlbHRhKTsNCi0JCX0NCi0JCWlmICghcmVzb3VyY2UoKS5hcHByb3ZlUHJvamVjdCgoSUphdmFQcm9qZWN0KXByb2plY3REZWx0YS5nZXRFbGVtZW50KCkpKQ0KLQkJew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCWlmICgoKHByb2plY3REZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9PUEVORUQpICE9IDApIHx8IHByb2plY3REZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQURERUQpDQotCQl7DQotCQkJaGFuZGxlT3BlbmVkUHJvamVjdChwcm9qZWN0RGVsdGEpOw0KLQkJfQ0KLQkNCi0JCWZvciAoSUphdmFFbGVtZW50RGVsdGEgY2hpbGREZWx0YSA6IHByb2plY3REZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpDQotCQl7DQotCQkJaWYgKCEoY2hpbGREZWx0YS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkpDQotCQkJew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJaWYgKChjaGlsZERlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0FEREVEX1RPX0NMQVNTUEFUSCkgIT0gMCkNCi0JCQl7DQotCQkJCWhhbmRsZUNsb3NlZFByb2plY3QocHJvamVjdERlbHRhKTsNCi0JCQkJaGFuZGxlT3BlbmVkUHJvamVjdChwcm9qZWN0RGVsdGEpOw0KLQkJCX0NCi0JCQlpZiAoKGNoaWxkRGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfUkVNT1ZFRF9GUk9NX0NMQVNTUEFUSCkgIT0gMCkNCi0JCQl7DQotCQkJCWhhbmRsZUNsb3NlZFByb2plY3QocHJvamVjdERlbHRhKTsNCi0JCQkJaGFuZGxlT3BlbmVkUHJvamVjdChwcm9qZWN0RGVsdGEpOw0KLQkJCX0NCi0JCQlpZiAoKGNoaWxkRGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0hJTERSRU4pICE9IDApDQotCQkJew0KLQkJCQlyZWN1cnNldmlseUhhbmRsZVJlbW92ZWRQYWNrYWdlcyhjaGlsZERlbHRhKTsNCi0JCQkJcmVjdXJzZXZpbHlIYW5kbGVBZGRlZFBhY2thZ2VzKGNoaWxkRGVsdGEpOw0KLQkJCQlyZWN1cnNldmlseUhhbmRsZUNvbXBpbGF0aW9uVW5pdHMoY2hpbGREZWx0YSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCByZWN1cnNldmlseUhhbmRsZUFkZGVkUGFja2FnZXMoSUphdmFFbGVtZW50RGVsdGEgcm9vdERlbHRhKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByaiA9IGZpbmRQcm9qZWN0QnlEZWx0YShyb290RGVsdGEpOw0KLQkJaWYgKHdzUHJqID09IG51bGwpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCWZvciAoSUphdmFFbGVtZW50RGVsdGEgY2hpbGREZWx0YSA6IHJvb3REZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpDQotCQl7DQotCQkJaWYgKGNoaWxkRGVsdGEuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCAmJiBjaGlsZERlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRCkNCi0JCQl7DQotCQkJCWZvciAoSUNvbXBpbGF0aW9uVW5pdCBjdSA6ICgoSVBhY2thZ2VGcmFnbWVudCljaGlsZERlbHRhLmdldEVsZW1lbnQoKSkuZ2V0Q29tcGlsYXRpb25Vbml0cygpKQ0KLQkJCQl7DQotCQkJCQlwcm9jZXNzQ29tcGlsYXRpb25Vbml0KHdzUHJqLCBjdSk7DQotCQkJCX0NCi0JCQkJcmVjdXJzZXZpbHlIYW5kbGVBZGRlZFBhY2thZ2VzKGNoaWxkRGVsdGEpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0IGZpbmRQcm9qZWN0QnlEZWx0YShJSmF2YUVsZW1lbnREZWx0YSByb290RGVsdGEpIHsNCi0JCXJldHVybiB1dGlsKCkuZmluZFByb2plY3RCeU5hbWUoZ2V0RG9tQmVpbmdMb2FkZWQoKSwgcm9vdERlbHRhLmdldEVsZW1lbnQoKS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgcmVjdXJzZXZpbHlIYW5kbGVSZW1vdmVkUGFja2FnZXMoSUphdmFFbGVtZW50RGVsdGEgcm9vdERlbHRhKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCQ0KLQkJZm9yIChJSmF2YUVsZW1lbnREZWx0YSBjaGlsZERlbHRhIDogcm9vdERlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkNCi0JCXsNCi0JCQlpZiAoY2hpbGREZWx0YS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KQ0KLQkJCXsNCi0JCQkJaWYgKGNoaWxkRGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQpDQotCQkJCXsNCi0JCQkJCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByaiA9IGZpbmRQcm9qZWN0QnlEZWx0YShyb290RGVsdGEpOw0KLQkJCQkJaWYgKHdzUHJqICE9IG51bGwpIHsNCi0JCQkJCQlyZW1vdmVNb2RlbEVsZW1lbnRzKHdzUHJqLCBjaGlsZERlbHRhLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpLCB0cnVlKTsNCi0JCQkJCX0NCi0JCQkJfSBlbHNlDQotCQkJCXsNCi0JCQkJCXJlY3Vyc2V2aWx5SGFuZGxlUmVtb3ZlZFBhY2thZ2VzKGNoaWxkRGVsdGEpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBoYW5kbGVPcGVuZWRQcm9qZWN0KElKYXZhRWxlbWVudERlbHRhIHByb2plY3REZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uDQotCXsNCi0JCWFzc2VydCBwcm9qZWN0RGVsdGEuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0Ow0KLQkJZmluYWwgSUphdmFQcm9qZWN0IGNoYW5nZWRQcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgcHJvamVjdERlbHRhLmdldEVsZW1lbnQoKTsNCi0JCW5ld1Byb2plY3RDVUZpbmRlcihjaGFuZ2VkUHJvamVjdCkuZmluZChudWxsLCBuZXcgTG9hZGVyQ29tcGlsYXRpb25Vbml0SGFuZGxlcigpKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2xvc2VkUHJvamVjdChJSmF2YUVsZW1lbnREZWx0YSBwcm9qZWN0RGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWFzc2VydCBwcm9qZWN0RGVsdGEuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0Ow0KLQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqID0gdXRpbCgpLmZpbmRQcm9qZWN0QnlOYW1lKGdldERvbUJlaW5nTG9hZGVkKCksIHByb2plY3REZWx0YS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQlpZiAod3NQcmo9PW51bGwpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCWZvciAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgOiB3c1Byai5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkpDQotCQl7DQotCQkJc2VpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuY2xlYXIoKTsNCi0JCX0NCi0JCWZvciAoSVdlYlNlcnZpY2Ugd3MgOiB3c1Byai5nZXRXZWJTZXJ2aWNlcygpKQ0KLQkJew0KLQkJCXNlcnZpY2VEYXRhKCkudW5tYXAod3MpOw0KLQkJfQ0KLQkJZ2V0RG9tQmVpbmdMb2FkZWQoKS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5yZW1vdmUod3NQcmopOw0KLQl9DQotDQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdEZpbmRlciBuZXdQcm9qZWN0Q1VGaW5kZXIoZmluYWwgSUphdmFQcm9qZWN0IHByaikNCi0Jew0KLQkJcmV0dXJuIG5ldyBXb3Jrc3BhY2VDVUZpbmRlcihyZXNvdXJjZSgpLmphdmFNb2RlbCgpLCBuZXcgSVByb2plY3RTZWxlY3RvcltdIHsgbmV3IElQcm9qZWN0U2VsZWN0b3IoKQ0KLQkJew0KLQkJCXB1YmxpYyBib29sZWFuIGFwcHJvdmUoSUphdmFQcm9qZWN0IHRvQXBwcm92ZSkNCi0JCQl7DQotCQkJCXJldHVybiBwcmouZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHModG9BcHByb3ZlLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJCX0NCi0JCX0gfSk7DQotCX0NCi0NCi0JLy8gaGFuZGxlcyBjb21waWxhdGlvbiB1bml0cyAtIHNraXBzIHdvcmtpbmcgY29waWVzDQotCXByaXZhdGUgdm9pZCByZWN1cnNldmlseUhhbmRsZUNvbXBpbGF0aW9uVW5pdHMoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpDQotCXsNCi0JCWlmIChkZWx0YS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KQ0KLQkJew0KLQkJCWZpbmFsIElDb21waWxhdGlvblVuaXQgY3UgPSAoSUNvbXBpbGF0aW9uVW5pdCkgZGVsdGEuZ2V0RWxlbWVudCgpOw0KLQkJCWlmICh1dGlsKCkuZmluZFByb2plY3RCeU5hbWUoZ2V0RG9tQmVpbmdMb2FkZWQoKSwgY3UuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKT09bnVsbCkNCi0JCQl7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQkJDQotCQkJdHJ5DQotCQkJew0KLQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLkFEREVEICYmIChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9NT1ZFRF9GUk9NKSA9PSAwKQ0KLQkJCQl7DQotCQkJCQloYW5kbGVBZGRlZENvbXBpbGF0aW9uVW5pdChjdSk7DQotCQkJCX0NCi0JCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEICYmIChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9NT1ZFRF9UTykgPT0gMCkNCi0JCQkJew0KLQkJCQkJaGFuZGxlUmVtb3ZlZENvbXBpbGF0aW9uVW5pdChjdSk7DQotCQkJCX0NCi0JCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEICYmIChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9NT1ZFRF9UTykgIT0gMCkNCi0JCQkJew0KLQkJCQkJaGFuZGxlTW92ZWRUb0NvbXBpbGF0aW9uVW5pdChjdSwgKElDb21waWxhdGlvblVuaXQpIGRlbHRhLmdldE1vdmVkVG9FbGVtZW50KCkpOw0KLQkJCQl9DQotCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCAmJiANCi0JCQkJCSgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfUFJJTUFSWV9SRVNPVVJDRSkgIT0gMCkgfHwNCi0JCQkJCSgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfUFJJTUFSWV9XT1JLSU5HX0NPUFkpICE9IDApKQ0KLQkJCQl7DQotCQkJCQloYW5kbGVDaGFuZ2VkQ29udGVudENvbXBpbGF0aW9uVW5pdChjdSk7DQotCQkJCX0NCi0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKQ0KLQkJCXsNCi0JCQkJbG9nZ2VyKCkubG9nRXJyb3IoIlVuYWJsZSB0byBwYXJzZSB0aGUgY29udGVudCBvZiBjb21waWxhdGlvbiB1bml0IiArIGRlbHRhLmdldEVsZW1lbnQoKSwgam1lKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCX0gZWxzZQ0KLQkJew0KLQkJCWZvciAoSUphdmFFbGVtZW50RGVsdGEgY2hpbGREZWx0YSA6IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkNCi0JCQl7DQotCQkJCXJlY3Vyc2V2aWx5SGFuZGxlQ29tcGlsYXRpb25Vbml0cyhjaGlsZERlbHRhKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNoYW5nZWRDb250ZW50Q29tcGlsYXRpb25Vbml0KElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVR5cGUgdHlwZSA9IGN1LmZpbmRQcmltYXJ5VHlwZSgpOwkNCi0JCWZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uID0gdHlwZT09bnVsbCA/IG51bGwgOiByZXNvdXJjZSgpLm5ld0Fubm90YXRpb25JbnNwZWN0b3IodHlwZSkuaW5zcGVjdFR5cGUoV1NfQU5OT1RBVElPTik7DQotCQlpZiAodHlwZSA9PSBudWxsIHx8IGFubm90YXRpb24gPT0gbnVsbCkNCi0JCXsNCi0JCQl1cGRhdGVTdWJjbGFzc2luZ1dTRWxlbWVudHMoY3UpOw0KLQkJCWhhbmRsZVJlbW92ZWRDb21waWxhdGlvblVuaXQoY3UpOw0KLQkJfSBlbHNlDQotCQl7DQotCQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCA9IHV0aWwoKS5maW5kUHJvamVjdEJ5TmFtZShnZXREb21CZWluZ0xvYWRlZCgpLCBjdS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJCWFzc2VydCB3c1Byb2plY3QgIT0gbnVsbDsNCi0JCQlwcm9jZXNzQ29tcGlsYXRpb25Vbml0KHdzUHJvamVjdCwgY3UpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCB1cGRhdGVTdWJjbGFzc2luZ1dTRWxlbWVudHMoSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmb3IgKElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByaiA6IGdldERvbUJlaW5nTG9hZGVkKCkuZ2V0V2ViU2VydmljZVByb2plY3RzKCkpDQotCQl7DQotCQkJZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcmogPSBqYXZhTW9kZWwoKS5nZXRKYXZhUHJvamVjdCh3c1Byai5nZXROYW1lKCkpOw0KLQkJCWZvciAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgOiB3c1Byai5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkpDQotCQkJew0KLQkJCQlpZihzZXJ2aWNlRGF0YSgpLmdldEhpZXJhcmNoeShzZWkuZ2V0SW1wbGVtZW50YXRpb24oKSk9PW51bGwpIHsNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQl9DQotCQkJCWlmIChzZXJ2aWNlRGF0YSgpLmdldEhpZXJhcmNoeShzZWkuZ2V0SW1wbGVtZW50YXRpb24oKSkuY29udGFpbnMoY3UpKQ0KLQkJCQl7DQotCQkJCQlwcm9jZXNzQ29tcGlsYXRpb25Vbml0KHdzUHJqLCBqYXZhUHJqLmZpbmRUeXBlKHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRDb21waWxhdGlvblVuaXQoKSk7DQotCQkJCX0NCi0JCQl9DQotCQkJZm9yIChJV2ViU2VydmljZSB3cyA6IHdzUHJqLmdldFdlYlNlcnZpY2VzKCkpDQotCQkJew0KLQkJCQlpZihzZXJ2aWNlRGF0YSgpLmdldEhpZXJhcmNoeSh3cy5nZXRJbXBsZW1lbnRhdGlvbigpKT09bnVsbCkgew0KLQkJCQkJY29udGludWU7DQotCQkJCX0NCi0JCQkJaWYgKHNlcnZpY2VEYXRhKCkuZ2V0SGllcmFyY2h5KHdzLmdldEltcGxlbWVudGF0aW9uKCkpLmNvbnRhaW5zKGN1KSkNCi0JCQkJew0KLQkJCQkJcHJvY2Vzc0NvbXBpbGF0aW9uVW5pdCh3c1ByaiwgamF2YVByai5maW5kVHlwZSh3cy5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRDb21waWxhdGlvblVuaXQoKSk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUFkZGVkQ29tcGlsYXRpb25Vbml0KElDb21waWxhdGlvblVuaXQgYWRkZWRDVSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcmogPSB1dGlsKCkuZmluZFByb2plY3RCeU5hbWUoZ2V0RG9tQmVpbmdMb2FkZWQoKSwgYWRkZWRDVS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJdGhpcy5wcm9jZXNzQ29tcGlsYXRpb25Vbml0KHdzUHJqLCBhZGRlZENVKTsNCi0JfQ0KLQ0KLQl2b2lkIGhhbmRsZU1vdmVkVG9Db21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBmcm9tQ1UsIElDb21waWxhdGlvblVuaXQgdG9DVSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJSmF2YVdlYlNlcnZpY2VFbGVtZW50IHdzRWxlbSA9IGd1ZXNzQ29udGFpbmVkV1NFbGVtZW50KGZyb21DVSk7DQotCQlpZiAod3NFbGVtID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQ0KLQkJZmluYWwgYm9vbGVhbiBmcU5hbWVDaGFuZ2VkID0gIXRvQ1UuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoZnJvbUNVLmdldEVsZW1lbnROYW1lKCkpDQotCQkJCQkJCQkJCXx8ICF0b0NVLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKGZyb21DVS5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCWlmIChmcU5hbWVDaGFuZ2VkKQ0KLQkJew0KLQkJCWhhbmRsZVJlbW92ZWRDb21waWxhdGlvblVuaXQoZnJvbUNVKTsNCi0JCQloYW5kbGVBZGRlZENvbXBpbGF0aW9uVW5pdCh0b0NVKTsNCi0JCX0gZWxzZQ0KLQkJLy8gdGhlbiBhc3N1bWUgdGhhdCB0aGUgcHJvamVjdCBvbmx5IGhhcyBjaGFuZ2VkLg0KLQkJew0KLQkJCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB0b1ByaiA9IHV0aWwoKS5maW5kUHJvamVjdEJ5TmFtZShnZXREb21CZWluZ0xvYWRlZCgpLCB0b0NVLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQkJaWYgKHdzRWxlbSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlKQ0KLQkJCXsNCi0JCQkJdG9QcmouZ2V0V2ViU2VydmljZXMoKS5hZGQoKElXZWJTZXJ2aWNlKSB3c0VsZW0pOw0KLQkJCX0gZWxzZQ0KLQkJCXsNCi0JCQkJdG9QcmouZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLmFkZCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkgd3NFbGVtKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVJlbW92ZWRDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCByZW1DVSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcmogPSB1dGlsKCkuZmluZFByb2plY3RCeU5hbWUoZ2V0RG9tQmVpbmdMb2FkZWQoKSwgcmVtQ1UuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCXJlbW92ZU1vZGVsRWxlbWVudHMod3NQcmosIGd1ZXNzUHJpbWFyeVR5cGVOYW1lKHJlbUNVKSwgZmFsc2UpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCByZW1vdmVNb2RlbEVsZW1lbnRzKElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByaiwgU3RyaW5nIGltcGxCYXNlTmFtZSwgYm9vbGVhbiBpc0ZvclBhY2thZ2UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKHdzUHJqID09IG51bGwpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotCQlyZW1vdmVXc01vZGVsRWxlbWVudHMod3NQcmosIGltcGxCYXNlTmFtZSwgaXNGb3JQYWNrYWdlKTsNCi0JCXJlbW92ZVNlaU1vZGVsRWxlbWVudHMod3NQcmosIGltcGxCYXNlTmFtZSwgaXNGb3JQYWNrYWdlLCBmYWxzZSk7DQotCX0NCi0JDQotCXByaXZhdGUgSUphdmFXZWJTZXJ2aWNlRWxlbWVudCBndWVzc0NvbnRhaW5lZFdTRWxlbWVudChJQ29tcGlsYXRpb25Vbml0IGN1KQ0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcmogPSB1dGlsKCkuZmluZFByb2plY3RCeU5hbWUoZ2V0RG9tQmVpbmdMb2FkZWQoKSwgY3UuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCXJldHVybiB1dGlsKCkuZmluZEphdmFXZWJTZXJ2aWNlRWxlbUJ5SW1wbE5hbWUod3NQcmosIGd1ZXNzUHJpbWFyeVR5cGVOYW1lKGN1KSk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIFN0cmluZyBndWVzc1ByaW1hcnlUeXBlTmFtZShJQ29tcGlsYXRpb25Vbml0IGN1KQ0KLQl7DQotCQlmaW5hbCBTdHJpbmcgcGFyZW50TmFtZSA9IGN1LmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCk7DQotCQlmaW5hbCBTdHJpbmdCdWlsZGVyIGFzc3VtZWRQcmltYXJ5VHlwZU5hbWUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOw0KLQkJaWYgKHBhcmVudE5hbWUubGVuZ3RoKCkgPiAwKSB7DQotCQkJYXNzdW1lZFByaW1hcnlUeXBlTmFtZSAuYXBwZW5kKHBhcmVudE5hbWUpLmFwcGVuZCgnLicpOw0KLQkJfQ0KLQkJcmV0dXJuIGFzc3VtZWRQcmltYXJ5VHlwZU5hbWUuYXBwZW5kKGN1LmdldEVsZW1lbnROYW1lKCkpLg0KLQkJCWRlbGV0ZShhc3N1bWVkUHJpbWFyeVR5cGVOYW1lLmxhc3RJbmRleE9mKCIuamF2YSIpLCBhc3N1bWVkUHJpbWFyeVR5cGVOYW1lLmxlbmd0aCgpKS50b1N0cmluZygpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvUGFyYW1ldGVyU3luY2hyb25pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvUGFyYW1ldGVyU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY1NTkwM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1BhcmFtZXRlclN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuSEVBREVSX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5NT0RFX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5OQU1FX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5QQVJUX05BTUVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLlRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLldQX0FOTk9UQVRJT047DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUFubm90YXRpb25TZXJpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsNCi0NCi0vKioNCi0gKiBDbGFzcyB0aGF0IHN5bmNocm9uaXplcyB0aGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIElXZWJNZXRob2R9IG9iamVjdDsNCi0gKiANCi0gKiBAYXV0aG9yIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJTeW5jaHJvbml6ZXIgZXh0ZW5kcyBFbGVtZW50U3luY2hyb25pemVySW1wbA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVFVSTl9QQVJBTV9OQU1FCT0gInJldHVybiI7Ly8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9MREVSX0NMQVNTX05BTUUgPSAiSG9sZGVyIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9MREVSX0NMQVNTX0ZRTkFNRSA9ICJqYXZheC54bWwud3MuSG9sZGVyIjsvLyROT04tTkxTLTEkDQotCQ0KLQlwdWJsaWMgUGFyYW1ldGVyU3luY2hyb25pemVyKElNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXIgcGFyZW50KQ0KLQl7DQotCQlzdXBlcihwYXJlbnQpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplUGFyYW1ldGVycyhJV2ViTWV0aG9kIHdtLCBJTWV0aG9kIG1ldGhvZCwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIENvbGxlY3Rpb248SVdlYlBhcmFtPiBtZXJnZWRQYXJhbXMgPSBuZXcgTGlua2VkTGlzdDxJV2ViUGFyYW0+KCk7DQotCQlpZiAoIVNpZ25hdHVyZS5TSUdfVk9JRC5lcXVhbHMobWV0aG9kLmdldFJldHVyblR5cGUoKSkpDQotCQl7DQotCQkJZmluYWwgSVdlYlBhcmFtIHJldFBhcmFtID0gb2J0YWluSW5zdGFuY2Uod20sIFJFVFVSTl9QQVJBTV9OQU1FKTsNCi0JCQltZXJnZVBhcmFtKHJldFBhcmFtLCAwLCB3bSwgbWV0aG9kLCBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCBpbnNwZWN0b3IpOw0KLQkJCW1lcmdlZFBhcmFtcy5hZGQocmV0UGFyYW0pOw0KLQkJfQ0KLQkJZmluYWwgU3RyaW5nW10gbmFtZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsNCi0JCWZpbmFsIFN0cmluZ1tdIHR5cGVTaWduYXR1cmVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7IA0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykNCi0JCXsNCi0JCQlmaW5hbCBJV2ViUGFyYW0gcGFyYW0gPSBvYnRhaW5JbnN0YW5jZSh3bSwgbmFtZXNbaV0pOw0KLQkJCW1lcmdlUGFyYW0ocGFyYW0sIGksIHdtLCBtZXRob2QsIHR5cGVTaWduYXR1cmVzW2ldLCBpbnNwZWN0b3IpOw0KLQkJCW1lcmdlZFBhcmFtcy5hZGQocGFyYW0pOw0KLQkJfQ0KLQkJd20uZ2V0UGFyYW1ldGVycygpLnJldGFpbkFsbChtZXJnZWRQYXJhbXMpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBtZXJnZVBhcmFtKElXZWJQYXJhbSB3ZWJQYXJhbSwgaW50IHBvcywgSVdlYk1ldGhvZCB3ZWJNZXRob2QsIElNZXRob2QgbWV0aG9kLCBTdHJpbmcgdHlwZVNpZ24sIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW0gPSBtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcih3ZWJQYXJhbS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWFzc2VydCB0eXBlUGFyYW0hPSBudWxsOw0KLQkJDQotCQlmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gd3BBbm5vdGF0aW9uID0gaXNXZWJSZXN1bHQod2ViUGFyYW0pID8gbnVsbCA6IGluc3BlY3Rvci5pbnNwZWN0UGFyYW0odHlwZVBhcmFtLCBXUF9BTk5PVEFUSU9OKTsNCi0JCQkJDQotCQlpZiAoISB0eXBlU2lnbi5lcXVhbHMod2ViUGFyYW0uZ2V0VHlwZU5hbWUoKSkpIHsNCi0JCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKHdlYlBhcmFtLCBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1RZUEVfTkFNRSwgdHlwZVNpZ24pOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBXZWJQYXJhbUtpbmQga2luZCA9IGlzV2ViUmVzdWx0KHdlYlBhcmFtKSA/IFdlYlBhcmFtS2luZC5PVVQgOiBjYWxjS2luZCh3cEFubm90YXRpb24sIG1ldGhvZCwgdHlwZVNpZ24pOw0KLQkJaWYgKCFraW5kLmVxdWFscyh3ZWJQYXJhbS5nZXRLaW5kKCkpKSB7DQotCQkJd2ViUGFyYW0uc2V0S2luZChraW5kKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgYm9vbGVhbiBpc0hlYWRlciA9IGNhbGNIZWFkZXIod3BBbm5vdGF0aW9uKTsNCi0JCWlmICh3ZWJQYXJhbS5pc0hlYWRlcigpIF4gaXNIZWFkZXIpIHsNCi0JCQl3ZWJQYXJhbS5zZXRIZWFkZXIoaXNIZWFkZXIpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTdHJpbmcgbmFtZSA9IGlzV2ViUmVzdWx0KHdlYlBhcmFtKSA/IGRlZkNhbGMoKS5jYWxjV2ViUmVzdWx0RGVmYXVsdE5hbWUod2ViTWV0aG9kKSA6IGNhbGNOYW1lKHdwQW5ub3RhdGlvbiwgd2ViTWV0aG9kLCBwb3MpOw0KLQkJaWYgKCFuYW1lLmVxdWFscyh3ZWJQYXJhbS5nZXROYW1lKCkpKSB7DQotCQkJd2ViUGFyYW0uc2V0TmFtZShuYW1lKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgU3RyaW5nIHBhcnROYW1lID0gY2FsY1BhcnROYW1lKHdwQW5ub3RhdGlvbiwgbmFtZSk7DQotCQlpZiAoIXBhcnROYW1lLmVxdWFscyh3ZWJQYXJhbS5nZXRQYXJ0TmFtZSgpKSkgew0KLQkJCXdlYlBhcmFtLnNldFBhcnROYW1lKHBhcnROYW1lKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGNhbGNUYXJnZXROYW1lc3BhY2Uod3BBbm5vdGF0aW9uLCB3ZWJNZXRob2QsIHdlYlBhcmFtKTsNCi0JCWlmICghdGFyZ2V0TmFtZXNwYWNlLmVxdWFscyh3ZWJQYXJhbS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpIHsNCi0JCQl3ZWJQYXJhbS5zZXRUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsNCi0JCX0JCQ0KLQkJDQotCQlyZXNvdXJjZSgpLmdldFNlcmlhbGl6ZXJGYWN0b3J5KCkuYWRhcHQod2ViUGFyYW0sIElBbm5vdGF0aW9uU2VyaWFsaXplci5jbGFzcyk7CQkNCi0JCWFkYXB0VG9Mb2NhdGlvbkludGVyZmFjZSh3ZWJQYXJhbSwgV1BfQU5OT1RBVElPTiwgd3BBbm5vdGF0aW9uKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBib29sZWFuIGlzV2ViUmVzdWx0KGZpbmFsIElXZWJQYXJhbSBwYXJhbSkNCi0Jew0KLQkJcmV0dXJuIHBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKFJFVFVSTl9QQVJBTV9OQU1FKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKGZpbmFsIElNZXRob2QgbWV0aG9kLCBmaW5hbCBTdHJpbmcgdHlwZVNpZ25hdHVyZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uDQotCXsNCi0JCWlmIChTaWduYXR1cmUuZ2V0VHlwZVNpZ25hdHVyZUtpbmQodHlwZVNpZ25hdHVyZSkgPT0gU2lnbmF0dXJlLkJBU0VfVFlQRV9TSUdOQVRVUkUpDQotCQl7DQotCQkJcmV0dXJuIFNpZ25hdHVyZS50b1N0cmluZyh0eXBlU2lnbmF0dXJlKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgU3RyaW5nW11bXSByZXNvbHZlZFR5cGVzID0gbWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKS5yZXNvbHZlVHlwZShTaWduYXR1cmUudG9TdHJpbmcodHlwZVNpZ25hdHVyZSkpOw0KLQkJaWYgKHJlc29sdmVkVHlwZXMgPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJZmluYWwgU3RyaW5nIHBhY2sgPSByZXNvbHZlZFR5cGVzWzBdWzBdOw0KLQkJZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9IHJlc29sdmVkVHlwZXNbMF1bMV07DQotCQlpZiAocGFjayAhPSBudWxsICYmIHBhY2subGVuZ3RoKCkgIT0gMCkNCi0JCXsNCi0JCQlyZXR1cm4gcGFjayArICIuIiArIGNsYXNzTmFtZTsvLyROT04tTkxTLTEkDQotCQl9IGVsc2UNCi0JCXsNCi0JCQlyZXR1cm4gY2xhc3NOYW1lOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgV2ViUGFyYW1LaW5kIGNhbGNLaW5kKGZpbmFsIElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBwYXJtQW5ub3RhdGlvbiwgZmluYWwgSU1ldGhvZCBtZXRob2QsIGZpbmFsIFN0cmluZyB0eXBlU2lnbmF0dXJlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0Jew0KLQkJaWYgKHBhcm1Bbm5vdGF0aW9uICE9IG51bGwgJiYgcGFybUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShNT0RFX0FUVFJJQlVURSkgIT0gbnVsbCkNCi0JCXsNCi0JCQlmaW5hbCBTdHJpbmcgbW9kZSA9IHBhcm1Bbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoTU9ERV9BVFRSSUJVVEUpOw0KLQkJCWlmIChXUEFubm90YXRpb25GZWF0dXJlcy5XRUJfUEFSQU1fTU9ERV9JTk9VVC5lbmRzV2l0aChtb2RlKSkNCi0JCQl7DQotCQkJCXJldHVybiBXZWJQYXJhbUtpbmQuSU5PVVQ7DQotCQkJfQ0KLQkJCWlmIChXUEFubm90YXRpb25GZWF0dXJlcy5XRUJfUEFSQU1fTU9ERV9JTi5lbmRzV2l0aChtb2RlKSkNCi0JCQl7DQotCQkJCXJldHVybiBXZWJQYXJhbUtpbmQuSU47DQotCQkJfQ0KLQkJCWlmIChXUEFubm90YXRpb25GZWF0dXJlcy5XRUJfUEFSQU1fTU9ERV9PVVQuZW5kc1dpdGgobW9kZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gV2ViUGFyYW1LaW5kLk9VVDsNCi0JCQl9DQotCQl9IA0KLQkJDQotCQlpZiAoaXNQb3NzaWJseUhvbGRlckNsYXNzKHR5cGVTaWduYXR1cmUpKSB7DQotCQkJZmluYWwgU3RyaW5nIHR5cGVGUU5hbWUgPSByZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKG1ldGhvZCwgdHlwZVNpZ25hdHVyZSk7DQotCQkJaWYgKHR5cGVGUU5hbWUuc3RhcnRzV2l0aChIT0xERVJfQ0xBU1NfRlFOQU1FKSkgew0KLQkJCQlyZXR1cm4gV2ViUGFyYW1LaW5kLklOT1VUOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIFdlYlBhcmFtS2luZC5JTjsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEFkZGVkIGR1ZSB0byBwZXJmb3JtYW5jZSBpc3N1ZXMgQ1NOIDAxMjAwNjE1MzIgMDAwMjI1NjkyNSAyMDA5Lg0KLQkgKiBUaGUgaWRlYSBpcyB0aGF0IGJlZm9yZSBjYWxsaW5nIHtAbGluayAjcmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZShJTWV0aG9kLCBTdHJpbmcpfQ0KLQkgKiB3ZSBjaGVjayBpZiB0aGUgY2xhc3MgaXMgcG90ZW50aWFsbHkgSG9sZGVyLg0KLQkgKi8NCi0JcHJpdmF0ZSBib29sZWFuIGlzUG9zc2libHlIb2xkZXJDbGFzcyhmaW5hbCBTdHJpbmcgdHlwZVNpZ25hdHVyZSkgewkNCi0JCWZpbmFsIFN0cmluZyBlcmFzdXRlVHlwZU5hbWUgPSBTaWduYXR1cmUuZ2V0U2lnbmF0dXJlU2ltcGxlTmFtZShTaWduYXR1cmUuZ2V0VHlwZUVyYXN1cmUodHlwZVNpZ25hdHVyZSkpOw0KLQkJaWYgKEhPTERFUl9DTEFTU19OQU1FLmVxdWFscyhlcmFzdXRlVHlwZU5hbWUpKSB7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTdHJpbmcgY2FsY05hbWUoSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IHBhcm1Bbm5vdGF0aW9uLCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgaW50IHBhcmFtUG9zaXRpb24pDQotCXsNCi0JCWlmIChwYXJtQW5ub3RhdGlvbiAhPSBudWxsICYmIHBhcm1Bbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoTkFNRV9BVFRSSUJVVEUpICE9IG51bGwpIHsNCi0JCQlyZXR1cm4gcGFybUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShOQU1FX0FUVFJJQlVURSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBkZWZDYWxjKCkuY2FsY1dlYlBhcmFtRGVmYXVsdE5hbWUod2ViTWV0aG9kLCBwYXJhbVBvc2l0aW9uKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTdHJpbmcgY2FsY1BhcnROYW1lKGZpbmFsIElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiB3cEFubm90YXRpb24sIGZpbmFsIFN0cmluZyBuYW1lKSANCi0Jew0KLQkJaWYgKHdwQW5ub3RhdGlvbiE9bnVsbCAmJiB3cEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShQQVJUX05BTUVfQVRUUklCVVRFKSE9bnVsbCkgew0KLQkJCXJldHVybiB3cEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShQQVJUX05BTUVfQVRUUklCVVRFKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG5hbWU7DQotCX0NCi0JDQotCXByaXZhdGUgYm9vbGVhbiBjYWxjSGVhZGVyKGZpbmFsIElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiB3cEFubm90YXRpb24pDQotCXsNCi0JCWlmICh3cEFubm90YXRpb24hPW51bGwgJiYgd3BBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoSEVBREVSX0FUVFJJQlVURSkhPW51bGwpIHsNCi0JCQlyZXR1cm4gQm9vbGVhbi5wYXJzZUJvb2xlYW4od3BBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoSEVBREVSX0FUVFJJQlVURSkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCXByaXZhdGUgU3RyaW5nIGNhbGNUYXJnZXROYW1lc3BhY2UoZmluYWwgSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IHdwQW5ub3RhdGlvbiwgZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QsIGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJaWYgKHdwQW5ub3RhdGlvbiE9bnVsbCAmJiB3cEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShUQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSkhPW51bGwpIHsNCi0JCQlyZXR1cm4gd3BBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEUpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZGVmQ2FsYygpLmNhbGNXZWJQYXJhbURlZmF1bHRUYXJnZXROUyh3ZWJNZXRob2QsIHdlYlBhcmFtKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJV2ViUGFyYW0gb2J0YWluSW5zdGFuY2UoSVdlYk1ldGhvZCB3bSwgU3RyaW5nIGltcGwpDQotCXsNCi0JCWZpbmFsIElXZWJQYXJhbSBleGlzdGluZyA9IGZpbmRXZWJQYXJhbUJ5SW1wbE5hbWUod20sIGltcGwpOw0KLQkJaWYgKGV4aXN0aW5nICE9IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGV4aXN0aW5nOw0KLQkJfQ0KLQkJZmluYWwgSVdlYlBhcmFtIG5ld1BhcmFtID0gZG9tRmFjdG9yeSgpLmNyZWF0ZUlXZWJQYXJhbSgpOw0KLQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZShuZXdQYXJhbSwgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19JTVBMRU1FTlRBVElPTiwgaW1wbCk7DQotCQl3bS5nZXRQYXJhbWV0ZXJzKCkuYWRkKG5ld1BhcmFtKTsNCi0JCXJldHVybiBuZXdQYXJhbTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJV2ViUGFyYW0gZmluZFdlYlBhcmFtQnlJbXBsTmFtZShmaW5hbCBJV2ViTWV0aG9kIHdtLCBmaW5hbCBTdHJpbmcgaW1wbCkNCi0Jew0KLQkJZm9yIChJV2ViUGFyYW0gcGFyYW0gOiB3bS5nZXRQYXJhbWV0ZXJzKCkpDQotCQl7DQotCQkJaWYgKGltcGwuZXF1YWxzKHBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHBhcmFtOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9TZWlNZXJnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9TZWlNZXJnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTBjZTgyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvU2VpTWVyZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5TQkFubm90YXRpb25GZWF0dXJlcy5TQl9BTk5PVEFUSU9OOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLk5BTUVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLlRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT047DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JTW9kZWxFbGVtZW50U3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuSmF4V3NVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotDQotLyoqDQotICogU3luY2hyb25pemVyIHRoYXQgbWVyZ2VzIGNvbnRlbnQgb2Yge0BsaW5rIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2V9IHdpdGggdGhlIGN1cnJlbnQgY29udGVudCBvZiANCi0gKiB0aGUgY2xhc3MgaW1wbGVtZW50aW5nIGl0LiAgDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZWlNZXJnZXIgZXh0ZW5kcyBFbGVtZW50U3luY2hyb25pemVySW1wbA0KLXsNCi0JcHJpdmF0ZSBBYnN0cmFjdE1ldGhvZFN5bmNocm9uaXplciBtZXRob2RTeW5jaHJvbml6ZXI7DQotCQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogQHBhcmFtIHBhcmVudA0KLQkgKiBAcGFyYW0gbWV0aG9kU3luYyB0aGUgc3luY2hyb25pemVyIHRoYXQgdGFrZXMgY2FyZSBmb3IgdGhlIFNFSSBtZXRob2RzDQotCSAqLw0KLQlwdWJsaWMgU2VpTWVyZ2VyKElNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXIgcGFyZW50LCBBYnN0cmFjdE1ldGhvZFN5bmNocm9uaXplciBtZXRob2RTeW5jKSANCi0Jew0KLQkJc3VwZXIocGFyZW50KTsNCi0JCW51bGxDaGVja1BhcmFtKG1ldGhvZFN5bmMpOw0KLQkJdGhpcy5tZXRob2RTeW5jaHJvbml6ZXIgPSBtZXRob2RTeW5jOw0KLQl9DQotCQkNCi0JcHJvdGVjdGVkIHZvaWQgbWVyZ2UoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24sIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBTdHJpbmcgc2VpTmFtZSA9IHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKE5BTUVfQVRUUklCVVRFKSA9PSBudWxsID8gDQotCQkJCUpheFdzVXRpbHMuZ2V0RGVmYXVsdFBvcnR0eXBlTmFtZSh3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkgOiB3c0Fubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShOQU1FX0FUVFJJQlVURSk7DQotCQkJCQ0KLQkJaWYgKCFzZWlOYW1lLmVxdWFscyhzZWkuZ2V0TmFtZSgpKSkgew0KLQkJCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUoc2VpLCBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fTkFNRSwgc2VpTmFtZSk7DQotCQl9DQotCQkJCQ0KLQkJLy8gYWRkIHRhcmdldE5hbWVzcGFjZQ0KLQkJZmluYWwgU3RyaW5nIHRhcmdldE5zID0gZXh0cmFjdFRhcmdldE5hbWVzcGFjZSh3c0Fubm90YXRpb24pOw0KLQkJaWYgKCF0YXJnZXROcy5lcXVhbHMoc2VpLmdldFRhcmdldE5hbWVzcGFjZSgpKSkgew0KLQkJCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUoc2VpLCBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRSwgdGFyZ2V0TnMpOw0KLQkJfQ0KLQkJDQotCQltZXJnZVNvYXBCaW5kaW5nKHNlaSwgaW5zcGVjdG9yKTsNCi0JCW1ldGhvZFN5bmNocm9uaXplci5zeW5jaHJvbml6ZU1ldGhvZHMoc2VpLCB3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKSwgaW5zcGVjdG9yKTsNCi0JCQ0KLQkJYWRhcHRUb0xvY2F0aW9uSW50ZXJmYWNlKHNlaSwgV1NfQU5OT1RBVElPTiwgd3NBbm5vdGF0aW9uKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdFRhcmdldE5hbWVzcGFjZShmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZT4gd3NBbm5vdGF0aW9uKQ0KLQl7DQotCQkvLyBhZGQgdGFyZ2V0TmFtZXNwYWNlDQotCQlmaW5hbCBTdHJpbmcgdGFyZ2V0TnMgPSB3c0Fubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShUQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSk7DQotCQlpZiAodGFyZ2V0TnM9PW51bGwpIHsNCi0JCQlyZXR1cm4gSmF4V3NVdGlscy5jb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2Uod3NBbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCkuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQl9CQ0KLQkJDQotCQlyZXR1cm4gdGFyZ2V0TnM7DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCBtZXJnZVNvYXBCaW5kaW5nKGZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpLCBmaW5hbCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSUFubm90YXRpb248SVR5cGU+IHNiQW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0VHlwZShTQl9BTk5PVEFUSU9OKTsNCi0JCQ0KLQkJZmluYWwgU09BUEJpbmRpbmdTdHlsZSBzdHlsZSA9IGRlZkNhbGMoKS5kZWZpbmVTQlN0eWxlKHNiQW5ub3RhdGlvbik7DQotCQlpZiAoc2VpLmdldFNvYXBCaW5kaW5nU3R5bGUoKSAhPSBzdHlsZSkgew0KLQkJCXNlaS5zZXRTb2FwQmluZGluZ1N0eWxlKHN0eWxlKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgU09BUEJpbmRpbmdVc2UgdXNlID0gZGVmQ2FsYygpLmRlZmluZVNCVXNlKHNiQW5ub3RhdGlvbik7DQotCQlpZiAoc2VpLmdldFNvYXBCaW5kaW5nVXNlKCkgIT0gdXNlKSB7DQotCQkJc2VpLnNldFNvYXBCaW5kaW5nVXNlKHVzZSk7DQotCQl9DQotCQkNCi0JCWZpbmFsIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgcGFyYW1TdHlsZSA9IGRlZkNhbGMoKS5kZWZpbmVTQlBhcmFtZXRlclN0eWxlKHNiQW5ub3RhdGlvbik7DQotCQlpZiAoc2VpLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSAhPSBwYXJhbVN0eWxlKSB7DQotCQkJc2VpLnNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUocGFyYW1TdHlsZSk7DQotCQl9DQotCQkNCi0JCWFkYXB0VG9Mb2NhdGlvbkludGVyZmFjZShzZWksIFNCX0FOTk9UQVRJT04sIHNiQW5ub3RhdGlvbik7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1NlaU1ldGhvZFN5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1NlaU1ldGhvZFN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzU0ZjU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9TZWlNZXRob2RTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOw0KLQ0KLWNsYXNzIFNlaU1ldGhvZFN5bmNocm9uaXplciBleHRlbmRzIEFic3RyYWN0TWV0aG9kU3luY2hyb25pemVyDQotew0KLQ0KLQlwdWJsaWMgU2VpTWV0aG9kU3luY2hyb25pemVyKElNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXIgcGFyZW50KQ0KLQl7DQotCQlzdXBlcihwYXJlbnQpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdEV4cG9zYWJsZU1ldGhvZHMoSU1ldGhvZFZpc2l0b3IgdmlzaXRvciwgSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5LCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdmlzaXRSZWN1cnNpdmVseSh2aXNpdG9yLCBoaWVyYXJjaHkuZ2V0VHlwZSgpLCBoaWVyYXJjaHksIGluc3BlY3Rvcik7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHZpc2l0UmVjdXJzaXZlbHkoSU1ldGhvZFZpc2l0b3IgdmlzaXRvciwgSVR5cGUgdHlwZSwgSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5LCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZm9yIChJTWV0aG9kIG1ldGhvZCA6IHR5cGUuZ2V0TWV0aG9kcygpKQ0KLQkJew0KLQkJCXZpc2l0b3IudmlzaXQobWV0aG9kLCBpbnNwZWN0b3IpOw0KLQkJfQ0KLQ0KLQkJZm9yIChJVHlwZSBzdXBlckludGYgOiBoaWVyYXJjaHkuZ2V0U3VwZXJJbnRlcmZhY2VzKHR5cGUpKQ0KLQkJewkJCQ0KLQkJCXZpc2l0UmVjdXJzaXZlbHkodmlzaXRvciwgc3VwZXJJbnRmLCBoaWVyYXJjaHksIHJlc291cmNlKCkubmV3QW5ub3RhdGlvbkluc3BlY3RvcihzdXBlckludGYpKTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvU2VpU3luY2hyb25pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvU2VpU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4ZWZhNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1NlaVN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUFubm90YXRpb25TZXJpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotDQotLyoqDQotICogU3luY2hyb25pemVyIGZvciBleHBsaWNpdCB7QGxpbmsgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZX0gaW5zdGFuY2UuIFVwZGF0ZXMgdGhlIERPTSBpbnN0YW5jZSB0byB0aGUgY3VycmVudA0KLSAqIFNFSSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBieSByZWFkaW5nIHJlbGV2YW50IGFubm90YXRpb25zIGFuZCANCi0gKiANCi0gKiBAYXV0aG9yIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZWlTeW5jaHJvbml6ZXIgZXh0ZW5kcyBFbGVtZW50U3luY2hyb25pemVySW1wbA0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBTZWlNZXJnZXIgc2VpTWVyZ2VyOyANCi0NCi0JU2VpU3luY2hyb25pemVyKElNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXIgcGFyZW50KQ0KLQl7DQotCQlzdXBlcihwYXJlbnQpOw0KLQkJc2VpTWVyZ2VyID0gbmV3IFNlaU1lcmdlcih0aGlzLCBuZXcgU2VpTWV0aG9kU3luY2hyb25pemVyKHRoaXMpKTsNCi0JfQ0KLQ0KLQkvKiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlICovDQotCXZvaWQgc3luY2hyb25pemVJbnRlcmZhY2UoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCwgSUFubm90YXRpb248SVR5cGU+IHdzQW5ub3RhdGlvbiwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gb2J0YWluSW5zdGFuY2Uod3NQcm9qZWN0LCB3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCQlzZWlNZXJnZXIubWVyZ2Uoc2VpLCB3c0Fubm90YXRpb24sIGluc3BlY3Rvcik7DQotCQlyZXNvbHZlV3NSZWZzVG9UaGlzU2VpKHNlaSk7DQotCQlyZXNvdXJjZSgpLmdldFNlcmlhbGl6ZXJGYWN0b3J5KCkuYWRhcHQoc2VpLCBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MpOwkJDQotCX0NCi0NCi0JcHJpdmF0ZSBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIG9idGFpbkluc3RhbmNlKElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QsIFN0cmluZyBpbXBsTmFtZSkNCi0Jew0KLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBudWxsOw0KLQkJZm9yIChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGV4aXN0aW5nIDogd3NQcm9qZWN0LmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSkNCi0JCXsNCi0JCQlpZiAoZXhpc3RpbmcuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoaW1wbE5hbWUpKSB7DQotCQkJCXNlaSA9IGV4aXN0aW5nOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJaWYgKHNlaT09bnVsbCkNCi0JCXsNCi0JCQlzZWkgPSBkb21GYWN0b3J5KCkuY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOw0KLQkJCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUoc2VpLCBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCBpbXBsTmFtZSk7DQotCQkJd3NQcm9qZWN0LmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKS5hZGQoc2VpKTsNCi0JCX0NCi0JCQ0KLQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZShzZWksIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCwgZmFsc2UpOw0KLQkJDQotCQlyZXR1cm4gc2VpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCByZXNvbHZlV3NSZWZzVG9UaGlzU2VpKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpKQ0KLQl7DQotCQlmb3IgKElXZWJTZXJ2aWNlIHdzIDogc2VydmljZURhdGEoKS5nZXRJbXBsZW1lbnRpbmdXcyhzZWkuZ2V0SW1wbGVtZW50YXRpb24oKSkpDQotCQl7DQotCQkJaWYgKHdzLmdldFNlcnZpY2VFbmRwb2ludCgpICE9IHNlaSkNCi0JCQl7DQotCQkJCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUod3MsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5ULCBzZWkpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvV1NNZXRob2RTeW5jaHJvbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9XU01ldGhvZFN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MDkzNGVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9XU01ldGhvZFN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XTUFubm90YXRpb25GZWF0dXJlcy5XTV9BTk5PVEFUSU9OOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT047DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTW9kaWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JTW9kZWxFbGVtZW50U3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV01Bbm5vdGF0aW9uRmVhdHVyZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOw0KLQ0KLXB1YmxpYyBjbGFzcyBXU01ldGhvZFN5bmNocm9uaXplciBleHRlbmRzIEFic3RyYWN0TWV0aG9kU3luY2hyb25pemVyDQotew0KLQ0KLQlwdWJsaWMgV1NNZXRob2RTeW5jaHJvbml6ZXIoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQpDQotCXsNCi0JCXN1cGVyKHBhcmVudCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCB2b2lkIHZpc2l0RXhwb3NhYmxlTWV0aG9kcyhJTWV0aG9kVmlzaXRvciB2aXNpdG9yLCBJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHksIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl2aXNpdFJlY3Vyc2l2ZWx5KHZpc2l0b3IsIGhpZXJhcmNoeS5nZXRUeXBlKCksIGhpZXJhcmNoeSwgaW5zcGVjdG9yKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgdmlzaXRSZWN1cnNpdmVseShJTWV0aG9kVmlzaXRvciB2aXNpdG9yLCBJVHlwZSB0eXBlLCBJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHksIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAodHlwZSA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybjsNCi0JCX0NCi0JDQotCQlhc3NlcnQgdHlwZS5pc0NsYXNzKCk7DQotCQlmaW5hbCBib29sZWFuIGlzV2ViU2VydmljZSA9IGluc3BlY3Rvci5pbnNwZWN0VHlwZShXU19BTk5PVEFUSU9OKSAhPSBudWxsOw0KLQkJZm9yIChJTWV0aG9kIG1ldGhvZCA6IHR5cGUuZ2V0TWV0aG9kcygpKQ0KLQkJew0KLQkJCWlmKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpDQotCQkJew0KLQkJCQkvLyBDb25zdHJ1Y3RvcnMgY2FuIG5ldmVyIHRha2UgcGFydCBpbiB0aGUgcG9ydHR5cGUNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCQ0KLQkJCWZpbmFsIElBbm5vdGF0aW9uPElNZXRob2Q+IHdtQW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0TWV0aG9kKG1ldGhvZCwgV01fQU5OT1RBVElPTik7DQotCQkJZmluYWwgYm9vbGVhbiBpc0V4Y2x1ZGVkV2l0aEFubm90YXRpb24gPSB3bUFubm90YXRpb24gPT0gbnVsbCA/IGZhbHNlIDogInRydWUiLmVxdWFscyh3bUFubm90YXRpb24vLyROT04tTkxTLTEkDQotCQkJCQkJCQkJCQkuZ2V0UHJvcGVydHlWYWx1ZShXTUFubm90YXRpb25GZWF0dXJlcy5XTV9FWENMVURFRF9BVFRSSUJVVEUpKTsNCi0JCQlpZiAoTW9kaWZpZXIuaXNQdWJsaWMobWV0aG9kLmdldEZsYWdzKCkpICYmICFpc0V4Y2x1ZGVkV2l0aEFubm90YXRpb24gJiYgKGlzV2ViU2VydmljZSB8fCB3bUFubm90YXRpb24gIT0gbnVsbCkpDQotCQkJew0KLQkJCQl2aXNpdG9yLnZpc2l0KG1ldGhvZCwgaW5zcGVjdG9yKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWZpbmFsIElUeXBlIHN1cGVyVHlwZSA9IGhpZXJhcmNoeS5nZXRTdXBlcmNsYXNzKHR5cGUpOw0KLQkJaWYgKHN1cGVyVHlwZSE9bnVsbCkgew0KLQkJCXZpc2l0UmVjdXJzaXZlbHkodmlzaXRvciwgc3VwZXJUeXBlLCBoaWVyYXJjaHksIHJlc291cmNlKCkubmV3QW5ub3RhdGlvbkluc3BlY3RvcihzdXBlclR5cGUpKTsNCi0JCX0NCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvV3NTeW5jaHJvbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9Xc1N5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZDcyNjljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9Xc1N5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuRU5EUE9JTlRfSU5URVJGQUNFX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5QT1JUX05BTUVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLlNFUlZJQ0VfTkFNRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NETF9MT0NBVElPTl9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQW5ub3RhdGlvblNlcmlhbGl6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JTW9kZWxFbGVtZW50U3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuSmF4V3NVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotDQotcHVibGljIGNsYXNzIFdzU3luY2hyb25pemVyIGV4dGVuZHMgRWxlbWVudFN5bmNocm9uaXplckltcGwNCi17DQotCXByaXZhdGUgZmluYWwgU2VpTWVyZ2VyIHNlaU1lcmdlcjsNCi0NCi0JcHVibGljIFdzU3luY2hyb25pemVyKElNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXIgcGFyZW50KQ0KLQl7DQotCQlzdXBlcihwYXJlbnQpOw0KLQkJdGhpcy5zZWlNZXJnZXIgPSBuZXcgU2VpTWVyZ2VyKHRoaXMsIG5ldyBXU01ldGhvZFN5bmNocm9uaXplcih0aGlzKSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBJV2ViU2VydmljZSBvYnRhaW5JbnN0YW5jZShJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBTdHJpbmcgaW1wbE5hbWUpDQotCXsNCi0JCWZvciAoSVdlYlNlcnZpY2Ugd3MgOiB3c1Byb2plY3QuZ2V0V2ViU2VydmljZXMoKSkNCi0JCXsNCi0JCQlpZiAod3MuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoaW1wbE5hbWUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHdzOw0KLQkJCX0NCi0JCX0NCi0JCWZpbmFsIElXZWJTZXJ2aWNlIG5ld1dzID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2UoKTsNCi0JCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUobmV3V3MsIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sIGltcGxOYW1lKTsNCi0JCXV0aWwoKS5hZGRUb0NvbGxlY3Rpb25GZWF0dXJlKHdzUHJvamVjdCwgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTLCBuZXdXcyk7DQotCQkNCi0JCXJldHVybiBuZXdXczsNCi0JfQ0KLQ0KLQlwdWJsaWMgSVdlYlNlcnZpY2Ugc3luY2hyb25pemVXZWJTZXJ2aWNlKElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QsIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24sIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZSB3cyA9IG9idGFpbkluc3RhbmNlKHdzUHJvamVjdCwgd3NBbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQkJbWVyZ2VXZWJTZXJ2aWNlKHdzLCB3c1Byb2plY3QsIHdzQW5ub3RhdGlvbiwgaW5zcGVjdG9yKTsNCi0JCQ0KLQkJcmVzb3VyY2UoKS5nZXRTZXJpYWxpemVyRmFjdG9yeSgpLmFkYXB0KHdzLCBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MpOw0KLQkJYWRhcHRUb0xvY2F0aW9uSW50ZXJmYWNlKHdzLCBXU19BTk5PVEFUSU9OLCB3c0Fubm90YXRpb24pOw0KLQkJDQotCQlyZXR1cm4gd3M7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIG1lcmdlV2ViU2VydmljZShJV2ViU2VydmljZSB0b01lcmdlLCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBJQW5ub3RhdGlvbjxJVHlwZT4gd3NBbm5vdGF0aW9uLCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJLy8gYWRkIHNlcnZpY2VOYW1lIG5hbWUNCi0JCWZpbmFsIFN0cmluZyB3c05hbWUgPSB3c0Fubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShTRVJWSUNFX05BTUVfQVRUUklCVVRFKSA9PSBudWxsID8NCi0JCQkJSmF4V3NVdGlscy5nZXREZWZhdWx0U2VydmljZU5hbWUod3NBbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpIDogDQotCQkJCXdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNFUlZJQ0VfTkFNRV9BVFRSSUJVVEUpOw0KLQkJCQkNCi0JCWlmICghd3NOYW1lLmVxdWFscyh0b01lcmdlLmdldE5hbWUoKSkpDQotCQl7DQotCQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZSh0b01lcmdlLCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fTkFNRSwgd3NOYW1lKTsNCi0JCX0NCi0JCQ0KLQkJLy8gYWRkIHRhcmdldE5hbWVzcGFjZQ0KLQkJZmluYWwgU3RyaW5nIHRhcmdldE5zID0gZXh0cmFjdFRhcmdldE5hbWVzcGFjZSh3c0Fubm90YXRpb24pOw0KLQkJaWYgKCF0YXJnZXROcy5lcXVhbHModG9NZXJnZS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpIHsNCi0JCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKHRvTWVyZ2UsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFLCB0YXJnZXROcyk7DQotCQl9DQotCQkNCi0JCS8vIGFkZCBwb3J0TmFtZQ0KLQkJZmluYWwgU3RyaW5nIHBvcnROYW1lID0gd3NBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoUE9SVF9OQU1FX0FUVFJJQlVURSk9PW51bGwgPw0KLQkJCQlKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0TmFtZSh3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkgOg0KLQkJCQl3c0Fubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShQT1JUX05BTUVfQVRUUklCVVRFKTsNCi0JCQkJDQotCQlpZiAoIXBvcnROYW1lLmVxdWFscyh0b01lcmdlLmdldFBvcnROYW1lKCkpKSB7DQotCQkJdG9NZXJnZS5zZXRQb3J0TmFtZShwb3J0TmFtZSk7DQotCQl9DQotCQkNCi0JCS8vIGFkZCB3c2RsTG9jYXRpb24NCi0JCXRvTWVyZ2Uuc2V0V3NkbExvY2F0aW9uKHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdTRExfTE9DQVRJT05fQVRUUklCVVRFKSk7DQotCQkNCi0JCS8vIGFkZCBlbmRwb2ludEludGVyZmFjZQ0KLQkJZmluYWwgU3RyaW5nIG5ld1NlaUltcGwgPSB3c0Fubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShFTkRQT0lOVF9JTlRFUkZBQ0VfQVRUUklCVVRFKTsNCi0JCWlmIChuZXdTZWlJbXBsID09IG51bGwpDQotCQl7DQotCQkJbWVyZ2VJbXBsaWNpdEludGVyZmFjZShvYnRhaW5JbXBsaWNpdEludGVyZmFjZUluc3RhbmNlKHdzUHJvamVjdCwgdG9NZXJnZSwgd3NBbm5vdGF0aW9uKSwgd3NBbm5vdGF0aW9uLCBpbnNwZWN0b3IpOw0KLQkJfSBlbHNlDQotCQl7DQotCQkJaWYgKHRvTWVyZ2UuZ2V0U2VydmljZUVuZHBvaW50KCkgPT0gbnVsbCB8fCAhdG9NZXJnZS5nZXRTZXJ2aWNlRW5kcG9pbnQoKS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhuZXdTZWlJbXBsKSkNCi0JCQl7DQotCQkJCXNlcnZpY2VEYXRhKCkubWFwKHRvTWVyZ2UsIG5ld1NlaUltcGwpOw0KLQkJCQlyZXNvbHZlSW50ZXJmYWNlKHRvTWVyZ2UsIHdzUHJvamVjdCwgd3NBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoRU5EUE9JTlRfSU5URVJGQUNFX0FUVFJJQlVURSkpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugb2J0YWluSW1wbGljaXRJbnRlcmZhY2VJbnN0YW5jZShJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBJV2ViU2VydmljZSB3cywgSUFubm90YXRpb248SVR5cGU+IHdzQW5ub3RhdGlvbikNCi0Jew0KLQkJaWYgKHdzLmdldFNlcnZpY2VFbmRwb2ludCgpICE9IG51bGwgJiYgd3MuZ2V0U2VydmljZUVuZHBvaW50KCkuaXNJbXBsaWNpdCgpKQ0KLQkJew0KLQkJCXJldHVybiB3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKTsNCi0JCX0NCi0NCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOw0KLQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZShzZWksIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCwgdHJ1ZSk7DQotCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKHNlaSwgRG9tUGFja2FnZS5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiwgd3NBbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZSh3cywgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQsIHNlaSk7DQotCQkNCi0JCXdzUHJvamVjdC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuYWRkKHNlaSk7DQotCQkNCi0JCXJldHVybiBzZWk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIG1lcmdlSW1wbGljaXRJbnRlcmZhY2UoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24sIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlzZWlNZXJnZXIubWVyZ2Uoc2VpLCB3c0Fubm90YXRpb24sIGluc3BlY3Rvcik7DQotCQlyZXNvdXJjZSgpLmdldFNlcmlhbGl6ZXJGYWN0b3J5KCkuYWRhcHQoc2VpLCBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MpOw0KLQl9DQotCQ0KLQlwcml2YXRlIFN0cmluZyBleHRyYWN0VGFyZ2V0TmFtZXNwYWNlKGZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24pDQotCXsNCi0JCS8vIGFkZCB0YXJnZXROYW1lc3BhY2UNCi0JCWZpbmFsIFN0cmluZyB0YXJnZXROcyA9IHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFKTsNCi0JCWlmICh0YXJnZXROcz09bnVsbCkgew0KLQkJCXJldHVybiBKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSh3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCX0JDQotCQkNCi0JCXJldHVybiB0YXJnZXROczsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcmVzb2x2ZUludGVyZmFjZShJV2ViU2VydmljZSB3cywgSVdlYlNlcnZpY2VQcm9qZWN0IHByZWZmZXJlZCwgU3RyaW5nIGltcGxlbWVudGF0aW9uKQ0KLQl7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHJlc29sdmVkID0gbnVsbDsNCi0JCWZvciAoSVdlYlNlcnZpY2VQcm9qZWN0IHByaiA6IGdldERvbUJlaW5nTG9hZGVkKCkuZ2V0V2ViU2VydmljZVByb2plY3RzKCkpDQotCQl7DQotCQkJZm9yIChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA6IHByai5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkpDQotCQkJew0KLQkJCQlpZiAoc2VpLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKGltcGxlbWVudGF0aW9uKSkNCi0JCQkJew0KLQkJCQkJcmVzb2x2ZWQgPSBzZWk7DQotCQkJCQlpZiAocHJlZmZlcmVkLmVxdWFscyhwcmopKQ0KLQkJCQkJew0KLQkJCQkJCWJyZWFrOw0KLQkJCQkJfSBlbHNlDQotCQkJCQl7DQotCQkJCQkJcmVzb2x2ZWQgPSBzZWk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKHdzLCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVCwgcmVzb2x2ZWQpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcHJvdmlkZXIvSUVuZHBvaW50TWV0YWRhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcHJvdmlkZXIvSUVuZHBvaW50TWV0YWRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzg2NGMyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Byb3ZpZGVyL0lFbmRwb2ludE1ldGFkYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucHJvdmlkZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcjsNCi0NCi0vKioNCi0gKiBSZXByZXNlbnRzIG1ldGFkYXRhIGZvciBhbiBlbmRwb2ludC4gQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5hbWUgYW5kIG5hbWVzcGFjZSBvZiB0aGUgZW5kcG9pbnQuIENvbnRhaW5zIGV4cG9zZWQgb3BlcmF0aW9ucy4gVGhpcyBpbnRlcmZhY2UNCi0gKiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGlucHV0IGRhdGEgZm9yIGltcGxlbWVudG9ycyBvZiB7QGxpbmsgSUVuZHBvaW50R2VuZXJhdG9yfS4NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElFbmRwb2ludE1ldGFkYXRhDQotew0KLQkvKioNCi0JICogQHJldHVybiBUaGUgbmFtZSBvZiBlbnBvaW50Lg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIFRoZSBwYWNrYWdlL25hbWVzcGFjZSBvZiB0aGUgZW5kcG9pbnQuDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2UoKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgcmVwcmVzZW50aW5nIHRoaXMgZW5kcG9pbnQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHdzZGw6c2VydmljZSByZXByZXNlbnRpbmcgdGhpcyBlbmRwb2ludC4NCi0JICogDQotCSAqIEBwYXJhbSBzZXJ2aWNlTmFtZQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoU3RyaW5nIHNlcnZpY2VOYW1lKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHdzZGw6cG9ydCByZWZlcmVuY2luZyB0aGlzIGVuZHBvaW50IHdoaWNoIHRoaXMNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydE5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHdzZGw6cG9ydCByZWZlcmVuY2luZyB0aGlzIGVuZHBvaW50IHdoaWNoIHRoaXMNCi0JICogDQotCSAqIEBwYXJhbSBwb3J0TmFtZQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIHBvcnROYW1lKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIHdzZGwgbG9jYXRpb24gaW4gY2FzZSB0aGlzIGVuZHBvaW50IGlzIGdlbmVyYXRlZCBmcm9tIHdzZGwgb3RoZXJ3aXNlIDx0dD5udWxsPC90dD4NCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0V3NkbExvY2F0aW9uKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB3c2RsIGxvY2F0aW9uIGluIGNhc2UgdGhpcyBlbmRwb2ludCBpcyBnZW5lcmF0ZWQgZnJvbSB3c2RsDQotCSAqIA0KLQkgKiBAcGFyYW0gd3NkbExvY2F0aW9uDQotCSAqICAgICAgICAgICAgbG9jYXRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFdzZGxMb2NhdGlvbihTdHJpbmcgd3NkbExvY2F0aW9uKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIG5hbWVzcGFjZSBVUkkNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCk7DQotDQotCS8qKg0KLQkgKiBzZXRzIHRoZSBuYW1lc3BhY2UgVVJJDQotCSAqIA0KLQkgKiBAcGFyYW0gbmFtZXNwYWNlVVJJDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5hbWVzcGFjZVVSSSk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBjb250YWluaW5nIFdlYlNlcnZpY2UgbWV0aG9kcyB0aGF0IHdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgdGhpcyBlbmRwb2ludCBpbXBsZW1lbnRhdGlvbi4gVGhpcw0KLQkgKiAgICAgICAgIG1ldGhvZCBjYW4gcmV0dXJuIDx0dD5udWxsPC90dD4NCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0U0VJTmFtZSgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgcmVmZXJlbmNlZCBieSB0aGlzIGVuZHBvaW50Lg0KLQkgKiANCi0JICogQHBhcmFtIHNlaU5hbWUNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICBpbiBjYXNlIDx0dD5zZWlOYW1lPC90dD4gaXMgbnVsbA0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICBpbiBjYXNlIDx0dD5zZWlOYW1lPC90dD4gaXMgZW1wdHkgc3RyaW5nDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRTRUlOYW1lKFN0cmluZyBzZWlOYW1lKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGVuZHBvaW50Lg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gbGlzdCBvZiBhZGRlZCBtZXRob2RzDQotCSAqLw0KLQlwdWJsaWMgTGlzdDxJRW5kcG9pbnRNZXRob2Q+IGdldE1ldGhvZHMoKTsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIElFbmRwb2ludE1ldGhvZH0gd2l0aCA8dHQ+bmFtZTwvdHQ+IGFuZCA8dHQ+cmV0dXJuVHlwZUZRTmFtZTwvdHQ+IGFuZCBhZGRzIGl0IHRvIHRoZSBzZXQgb2YgYXZhaWxhYmxlDQotCSAqIG1ldGhvZHMuDQotCSAqIA0KLQkgKiBAcGFyYW0gbmFtZQ0KLQkgKiBAcGFyYW0gcmV0dXJuVHlwZUZRTmFtZQ0KLQkgKiBAcmV0dXJuIGNyZWF0ZWQgSUVuZHBvaW50TWV0aG9kIGZvciBhZGRlZCBtZXRob2QNCi0JICovDQotCXB1YmxpYyBJRW5kcG9pbnRNZXRob2QgYWRkTWV0aG9kKFN0cmluZyBuYW1lLCBTdHJpbmcgcmV0dXJuVHlwZUZRTmFtZSk7DQotCQ0KLQkvKioNCi0JICogQWRkcyB7QGxpbmsgSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcn0gdG8gdGhlIHtAbGluayBJRW5kcG9pbnRNZXRhZGF0YX0gZGVzY3JpcHRvci4NCi0JICogDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uc0NvbnRhaW5lciAtIENvbnRhaW5lciwgd2hpY2ggd2lsbCBiZSBhZGRlZC4NCi0JICogDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRBbm5vdGF0aW9uc0NvbnRhaW5lcihmaW5hbCBJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyIGFubm90YXRpb25zQ29udGFpbmVyKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgU2V0IHdpdGgge0BsaW5rIElBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXJ9IHJlbGF0ZWQgdG8gdGhlIHtAbGluayBJRW5kcG9pbnRNZXRhZGF0YX0gZGVzY3JpcHRvci4NCi0JICoNCi0JICogQHJldHVybiBTZXQgd2l0aCB7QGxpbmsgSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcn0uDQotCSAqLw0KLQlwdWJsaWMgU2V0PElBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXI+IGdldEFubm90YXRpb25zQ29udGFpbmVyKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcHJvdmlkZXIvSUVuZHBvaW50TWV0aG9kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Byb3ZpZGVyL0lFbmRwb2ludE1ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDIxY2YwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcHJvdmlkZXIvSUVuZHBvaW50TWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wcm92aWRlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyOw0KLQ0KLS8qKg0KLSAqIEFuIGludGVyZmFjZSByZXByZXNlbnRpbmcgbWV0aG9kIGluIGVuZHBvaW50Lg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElFbmRwb2ludE1ldGhvZA0KLXsNCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIG1ldGhvZCBuYW1lDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIHJldHVybkZRTmFtZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRSZXR1cm5UeXBlKCk7DQotDQotCS8qKg0KLQkgKiBAcGFyYW0gcmV0dXJuVHlwZUZRTmFtZQ0KLQkgKiAgICAgICAgICAgIHNldHMgdGhlIHJldHVybiB0eXBlDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRSZXR1cm5UeXBlKFN0cmluZyByZXR1cm5UeXBlRlFOYW1lKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gaHVtYW4gcmVhZGFibGUgbWV0aG9kIHJlcHJlc2VudGF0aW9uDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFNpZ25hdHVyZSgpOw0KLQ0KLQkvKioNCi0JICogQHJldHVybiBzZXQgb2YgdGhyb3duIGV4Y2VwdGlvbnMNCi0JICovDQotCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRFeGNlcHRpb25zKCk7DQotDQotCS8qKg0KLQkgKiBAcGFyYW0gZXhjZXB0aW9uRlFOYW1lDQotCSAqICAgICAgICAgICAgYWRkIHRocm93biBleGNlcHRpb24gdG8gdGhlIG1ldGhvZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkRXhjZXB0aW9uKFN0cmluZyBleGNlcHRpb25GUU5hbWUpOw0KLQ0KLQkvKioNCi0JICogQHJldHVybiBsaXN0IG9mIG1ldGhvZCBwYXJhbXMgb24gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIG1ldGhvZA0KLQkgKi8NCi0JcHVibGljIExpc3Q8SU1ldGhvZFBhcmFtZXRlcj4gZ2V0UGFyYW1ldGVycygpOw0KLQ0KLQkvKioNCi0JICogY3JlYXRlcyBuZXcgcGFyYW0gYW5zIGFkZHMgaXQgdG8gdGhlIGVuZCBvZiBwYXJhbWV0ZXJzIGxpc3QuDQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZSBmdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lDQotCSAqIEBwYXJhbSBuYW1lIHBhcmFtZXRlciBuYW1lDQotCSAqIEByZXR1cm4ge0BsaW5rIElNZXRob2RQYXJhbWV0ZXJ9IGNyZWF0ZXMNCi0JICovDQotCXB1YmxpYyBJTWV0aG9kUGFyYW1ldGVyIGFkZFBhcmFtZXRlcihTdHJpbmcgdHlwZSwgU3RyaW5nIG5hbWUpOw0KLQ0KLQkvKioNCi0JICogQWRkcyB7QGxpbmsgSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcn0gdG8gdGhlIHtAbGluayBJRW5kcG9pbnRNZXRob2R9IGRlc2NyaXB0b3IuDQotCSAqIA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbnNDb250YWluZXIgLSBDb250YWluZXIsIHdoaWNoIHdpbGwgYmUgYWRkZWQuDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkQW5ub3RhdGlvbnNDb250YWluZXIoZmluYWwgSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lciBhbm5vdGF0aW9uc0NvbnRhaW5lcik7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIFNldCB3aXRoIHtAbGluayBJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyfSByZWxhdGVkIHRvIHRoZSB7QGxpbmsgSUVuZHBvaW50TWV0aG9kfSBkZXNjcmlwdG9yLg0KLQkgKg0KLQkgKiBAcmV0dXJuIFNldCB3aXRoIHtAbGluayBJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyfS4NCi0JICovDQotCXB1YmxpYyBTZXQ8SUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcj4gZ2V0QW5ub3RhdGlvbnNDb250YWluZXIoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wcm92aWRlci9JTWV0aG9kUGFyYW1ldGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Byb3ZpZGVyL0lNZXRob2RQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGU3M2U0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Byb3ZpZGVyL0lNZXRob2RQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnByb3ZpZGVyOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSByZXByZXNlbnRpbmcgcGFyYW1ldGVyIGluIG1ldGhvZA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKiANCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RQYXJhbWV0ZXINCi17DQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIgbmFtZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHBhcmFtZXRlciBmdWxseSBxdWFsaWZpZWQgbmFtZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcmVnaXN0cnkvSVdzRE9NUnVudGltZUluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcmVnaXN0cnkvSVdzRE9NUnVudGltZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWY4Y2IwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3JlZ2lzdHJ5L0lXc0RPTVJ1bnRpbWVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklOYW1lZEV4dGVuc2lvbkluZm87DQotDQotLyoqDQotICogRGVmaW5lcyB0aGUgaW5mb3JtYXRpb24gc3RydWN0dXJlIHdoaWNoIHNob3VsZCBiZSBpbnN0YW50aWF0ZWQgdXBvbiByZWFkaW5nIGNvbnRyaWJ1dG9ycw0KLSAqIHRvIHRoZSBTdXBwb3J0ZWQgUnVudGltZSBleHRlbnNpb24gcG9pbnQuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgSHJpc3RvdiBJMDM2MjAxDQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXc0RPTVJ1bnRpbWVJbmZvIGV4dGVuZHMgSU5hbWVkRXh0ZW5zaW9uSW5mbw0KLXsNCi0JLyoqDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBtYXAgb2YgcHJvamVjdCBmYWNldHMgcmVsZXZhbnQgZm9yIGEgcGFydGljdWxhciBydW50aW1lIHdoZXJlIHRoZSBrZXkgaXMgDQotCSAqIHRoZSBwcm9qZWN0IGZhY2V0IGlkIGFuZCB0aGUgdmFsdWUgaXMgdGhlIHZlcnNpb24gb2YgdGhlIHByb2plY3QgZmFjZXQgaWYgc3BlY2lmaWVkLg0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UHJvamVjdEZhY2V0cygpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3JlZ2lzdHJ5L1dzRE9NUnVudGltZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3JlZ2lzdHJ5L1dzRE9NUnVudGltZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUyYTgyZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9yZWdpc3RyeS9Xc0RPTVJ1bnRpbWVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnJlZ2lzdHJ5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRE9NUnVudGltZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC51dGlsLk5hbWVkRXh0ZW5zaW9uSW5mbzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIEhyaXN0b3YgSTAzNjIwMQ0KLSAqDQotICovDQotcHVibGljIGNsYXNzIFdzRE9NUnVudGltZVJlZ2lzdHJ5IA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUnVudGltZUluZm8gZXh0ZW5kcyBOYW1lZEV4dGVuc2lvbkluZm8gaW1wbGVtZW50cyBJV3NET01SdW50aW1lSW5mbw0KLQl7DQotCQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvamVjdEZhY2V0czsNCi0JCQ0KLQkJUnVudGltZUluZm8oZmluYWwgU3RyaW5nIHBJZCwgZmluYWwgU3RyaW5nIHBMYWJlbCwgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9qZWN0RmFjZXRzKQ0KLQkJew0KLQkJCXN1cGVyKHBJZCwgcExhYmVsKTsNCi0JCQkNCi0JCQl0aGlzLnByb2plY3RGYWNldHMgPSBwcm9qZWN0RmFjZXRzOw0KLQkJfQ0KLQkJDQotCQlwdWJsaWMgTWFwPFN0cmluZyxTdHJpbmc+IGdldFByb2plY3RGYWNldHMoKQ0KLQkJew0KLQkJCXJldHVybiB0aGlzLnByb2plY3RGYWNldHM7DQotCQl9DQotIAl9DQotCQ0KLQkvKiogVGhlIElEIG9mIHRoZSBleHRlbnNpb24gcG9pbnQgZm9yIGEgc3VwcG9ydGVkIHJ1bnRpbWUgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTlRJTUVfWFAgPSBKYXhXc0RvbVJ1bnRpbWVQbHVnaW4uUExVR0lOX0lEICsgIi5kb21ydW50aW1lcyI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqCSBFcnJvciBtZXNzYWdlIGRpc3BsYXllZCB3aGVuIGV4dGVuc2lvbiBwb2ludCBub3QgcHJvcGVybHkgZGVmaW5lZCAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fTk9UX1BST1BFUkxZX1JFR0lTVEVSRUQgPSAiUmVnaXN0ZXJlZCBydW50aW1lIGV4dGVuc2lvbiBub3QgcHJvcGVybHkgcmVnaXN0ZXJlZCAoZXJyb3IgaW4gcGx1Z2luLnhtbCkiOyAvLyROT04tTkxTLTEkDQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYUF9JTVBMRU1FTlRBVElPTl9FTEVNRU5UID0gImltcGxlbWVudGF0aW9uIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBfUFJPSkVDVF9GQUNFVF9FTEVNRU5UID0gInByb2plY3RfZmFjZXQiOyAvLyROT04tTkxTLTEkDQotCQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBfUFJPSkVDVF9GQUNFVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQNCi0JDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYUF9QUk9KRUNUX0ZBQ0VUX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQNCi0JDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYUF9JTVBMRU1FTlRBVElPTl9FTEVNRU5UX0NMQVNTX0FUVFIgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBleGVjdXRhYmxlIGV4dGVuc2lvbi4NCi0JICogDQotCSAqIEBwYXJhbSBpbmZvIHRoZSBkZXNjcmlwdG9yIG9iamVjdCBidWlsdCBkdXJpbmcgZXh0ZW5zaW9uIHBvaW50IGxvYWQNCi0JICogQHJldHVybiBpbnN0YW5jZSBvZiBydW50aW1lIGV4dGVuc2lvbiBpbXBsZW1lbnRhdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGluc3RhbnRpYXRlUnVudGltZShmaW5hbCBJV3NET01SdW50aW1lSW5mbyBpbmZvKQ0KLQl7DQotCQlmaW5hbCBJRXh0ZW5zaW9uIGV4dCA9IGZpbmRFeHRlbnNpb24oaW5mbyk7DQotCQkNCi0JCWlmKGV4dD09bnVsbCkNCi0JCXsNCi0JCQlsb2dnZXIoKS5sb2dFcnJvcihFWFRFTlNJT05fTk9UX1BST1BFUkxZX1JFR0lTVEVSRUQpOw0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJCQ0KLQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWwgOiBleHQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkpDQotCQl7DQotCQkJaWYgKGVsLmdldE5hbWUoKS5lcXVhbHMoWFBfSU1QTEVNRU5UQVRJT05fRUxFTUVOVCkpDQotCQkJew0KLQkJCQl0cnkNCi0JCQkJew0KLQkJCQkJLy9GSVhNRSBDbGFzc0Nhc3RFeGNlcHRpb24gc2hvd2luZyB1cCBpbiB0aGUgbG9ncyBpbiB0aGUgV1RQIGJ1aWxkDQotCQkJCQlPYmplY3QgaW1wbCA9IGVsLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oWFBfSU1QTEVNRU5UQVRJT05fRUxFTUVOVF9DTEFTU19BVFRSKTsNCi0JCQkJCWlmIChpbXBsIGluc3RhbmNlb2YgSVdzRE9NUnVudGltZUV4dGVuc2lvbikgew0KLQkJCQkJCXJldHVybiAoSVdzRE9NUnVudGltZUV4dGVuc2lvbikgaW1wbDsNCi0JCQkJCX0gZWxzZSB7DQotCQkJCQkJcmV0dXJuIG51bGw7DQotCQkJCQl9DQotLy8JCQkJCXJldHVybiAoSVdzRE9NUnVudGltZUV4dGVuc2lvbikgZWwuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihYUF9JTVBMRU1FTlRBVElPTl9FTEVNRU5UX0NMQVNTX0FUVFIpOw0KLQkJCQl9IA0KLQkJCQljYXRjaCAoZmluYWwgQ29yZUV4Y2VwdGlvbiBlKQ0KLQkJCQl7DQotCQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBleHRlbnNpb24iLCBlKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQkJcmV0dXJuIG51bGw7DQotCQkJCQkNCi0JCQkJfQ0KLS8vCQkJCWNhdGNoIChmaW5hbCBDbGFzc0Nhc3RFeGNlcHRpb24gZSkNCi0vLwkJCQl7DQotLy8JCQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJJbXBsZW1lbnRhdGlvbiBjbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQgcHJvcGVyIGludGVyZmFjZSIsIGUpOyAvLyROT04tTkxTLTEkDQotLy8JCQkJCXJldHVybiBudWxsOw0KLS8vCQkJCX0NCi0JCQl9DQotCQl9DQotCQkNCi0JCWxvZ2dlcigpLmxvZ0Vycm9yKEVYVEVOU0lPTl9OT1RfUFJPUEVSTFlfUkVHSVNURVJFRCk7DQotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihFWFRFTlNJT05fTk9UX1BST1BFUkxZX1JFR0lTVEVSRUQpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogTG9jYXRlcyB0aGUgZXh0ZW5zaW9uIHBvaW50IGNvbnRyaWJ1dGlvbiBkZWZpbml0aW9uIGZvciB0aGlzIHBhcnRpY3VsYXIgcnVudGltZS4NCi0JICogDQotCSAqIEBwYXJhbSBpbmZvIHRoZSBkZXNjcmlwdG9yIG9iamVjdCBidWlsdCBkdXJpbmcgZXh0ZW5zaW9uIHBvaW50IGxvYWQNCi0JICogQHJldHVybiBpbnN0YW5jZSBvZiBjb250cmlidXRpb24gZGVmaW5pdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJRXh0ZW5zaW9uIGZpbmRFeHRlbnNpb24oZmluYWwgSVdzRE9NUnVudGltZUluZm8gaW5mbykNCi0Jew0KLQkJaWYoaW5mbyE9bnVsbCkNCi0JCXsNCi0JCQlmaW5hbCBJRXh0ZW5zaW9uW10gZXh0cyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoUlVOVElNRV9YUCkuZ2V0RXh0ZW5zaW9ucygpOw0KLQkJDQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRzLmxlbmd0aDsgaSsrKQ0KLQkJCXsNCi0JCQkJaWYgKGV4dHNbaV0uZ2V0U2ltcGxlSWRlbnRpZmllcigpLmVxdWFscyhpbmZvLmdldElkKCkpKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gZXh0c1tpXTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZWdpc3RlcmVkIHJ1bnRpbWVzLg0KLQkgKiANCi0JICogQHJldHVybiBzZXQgb2YgaW5mb3JtYXRpb24gcmVjb3JkcyBmb3IgdGhlIHJlZ2lzdGVyZWQgcnVudGltZXMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxJV3NET01SdW50aW1lSW5mbz4gZ2V0UmVnaXN0ZXJlZFJ1bnRpbWVzSW5mbygpDQotCXsNCi0JCWZpbmFsIElFeHRlbnNpb25bXSBleHRzID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChSVU5USU1FX1hQKS5nZXRFeHRlbnNpb25zKCk7DQotCQlmaW5hbCBDb2xsZWN0aW9uPElXc0RPTVJ1bnRpbWVJbmZvPiBydW50aW1lRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PElXc0RPTVJ1bnRpbWVJbmZvPihleHRzLmxlbmd0aCk7DQotCQkNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0cy5sZW5ndGg7IGkrKykNCi0JCXsNCi0JCQlIYXNoTWFwPFN0cmluZyxTdHJpbmc+IHByb2plY3RGYWNldHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpOw0KLQkJCQ0KLQkJCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsIDogZXh0c1tpXS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSkNCi0JCQl7DQotCQkJCWlmIChlbC5nZXROYW1lKCkuZXF1YWxzKFhQX1BST0pFQ1RfRkFDRVRfRUxFTUVOVCkpDQotCQkJCXsNCi0JCQkJCXByb2plY3RGYWNldHMucHV0KGVsLmdldEF0dHJpYnV0ZShYUF9QUk9KRUNUX0ZBQ0VUX0lEKSxlbC5nZXRBdHRyaWJ1dGUoWFBfUFJPSkVDVF9GQUNFVF9WRVJTSU9OKSk7DQotCQkJCX0NCi0JCQl9DQotCQkJDQotCQkJDQotCQkJcnVudGltZURlc2NyaXB0b3JzLmFkZChuZXcgUnVudGltZUluZm8oZXh0c1tpXS5nZXRTaW1wbGVJZGVudGlmaWVyKCksIGV4dHNbaV0uZ2V0TGFiZWwoKSwgcHJvamVjdEZhY2V0cykpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gcnVudGltZURlc2NyaXB0b3JzOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcnVudGltZSBkZXNjcmlwdG9yIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcnVudGltZSBpZC4NCi0JICogDQotCSAqIEBwYXJhbSBydW50aW1lSWQgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHJ1bnRpbWUNCi0JICogQHJldHVybiBkZXNjcmlwdG9yIG9iamVjdCBmb3IgdGhlIG5lZWRlZCBydW50aW1lDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElXc0RPTVJ1bnRpbWVJbmZvIGdldFJ1bnRpbWVJbmZvKGZpbmFsIFN0cmluZyBydW50aW1lSWQpDQotCXsNCi0JCUl0ZXJhdG9yPElXc0RPTVJ1bnRpbWVJbmZvPiByZWdpc3RlcmVkUnVudGltZSA9IGdldFJlZ2lzdGVyZWRSdW50aW1lc0luZm8oKS5pdGVyYXRvcigpOw0KLQkJDQotCQl3aGlsZShyZWdpc3RlcmVkUnVudGltZS5oYXNOZXh0KCkpDQotCQl7DQotCQkJSVdzRE9NUnVudGltZUluZm8gcnVudGltZUluZm8gPSByZWdpc3RlcmVkUnVudGltZS5uZXh0KCk7DQotCQkJDQotCQkJaWYocnVudGltZUluZm8uZ2V0SWQoKS5lcXVhbHMocnVudGltZUlkKSkNCi0JCQl7DQotCQkJCXJldHVybiBydW50aW1lSW5mbzsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcml2YXRlIHN0YXRpYyBJTG9nZ2VyIGxvZ2dlcigpDQotCXsNCi0JCXJldHVybiBuZXcgTG9nZ2VyKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL0RvbTJSZXNvdXJjZU1hcHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL0RvbTJSZXNvdXJjZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZWYyNTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb20yUmVzb3VyY2VNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLQ0KLQ0KLS8qKg0KLSAqIENsYXNzIHRoYXQgdGFrZXMgY2FyZSBmb3IgbWFwcGluZyBET00gb2JqZWN0cyB0byBFY2xpcHNlIHJlc291cmNlcy4gDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEb20yUmVzb3VyY2VNYXBwZXINCi17DQotCS8qKiB0aGUgc2luZ2xldG9uIGluc3RhbmNlICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRG9tMlJlc291cmNlTWFwcGVyIElOU1RBTkNFID0gbmV3IERvbTJSZXNvdXJjZU1hcHBlcigpOw0KLQkNCi0JcHJpdmF0ZSBEb21Td2l0Y2g8U3RyaW5nPiBpbXBsQ2xhc3NGaW5kZXJTd2l0Y2g7DQotCQ0KLQkvKioNCi0JICogU2luZ2xldG9uIENvbnN0cnVjdG9yIA0KLQkgKi8NCi0JcHJpdmF0ZSBEb20yUmVzb3VyY2VNYXBwZXIoKSB7CQ0KLQkJdGhpcy5pbXBsQ2xhc3NGaW5kZXJTd2l0Y2ggPSBjcmVhdGVJbXBsRmluZGVyU3dpdGNoKCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBGaW5kcyB1bmRlcmx5aW5nIHtAbGluayBJUmVzb3VyY2V9IGZvciB0aGlzIERPTSBvYmplY3QNCi0JICogQHBhcmFtIGVPYmplY3QgdGhlIERPTSBvYmplY3QNCi0JICogQHJldHVybiBmb3VuZCByZXNvdXJjZSBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIElSZXNvdXJjZSBmaW5kUmVzb3VyY2UoZmluYWwgRU9iamVjdCBlT2JqZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShlT2JqZWN0KTsNCi0JCXN3aXRjaCAoZU9iamVjdC5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKSkgDQotCQl7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFOg0KLQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRTogDQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0Q6IA0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU06CQ0KLQkJCWZpbmFsIElUeXBlIHR5cGUgPSBmaW5kVHlwZShlT2JqZWN0KTsgDQotCQkJcmV0dXJuIHR5cGU9PW51bGwgPyBudWxsIDogdHlwZS5nZXRSZXNvdXJjZSgpOw0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUOg0KLQkJCXJldHVybiBmaW5kUHJvamVjdCgoSVdlYlNlcnZpY2VQcm9qZWN0KWVPYmplY3QpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBGaW5kcyBJUHJvamVjdCBpbnN0YW5jZSBmb3IgdGhlIHdlYiBzZXJ2aWNlIHByb2plY3QgcmVwcmVzZW50ZWQgYnkgPGNvZGU+d3NQcm9qZWN0PC9jb2RlPg0KLQkgKiBAcGFyYW0gd3NQcm9qZWN0IHRoZSBwcm9qZWN0IERPTSBvYmplY3QNCi0JICogQHJldHVybiBmb3VuZCByZXNvdXJjZSBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JcHVibGljIElQcm9qZWN0IGZpbmRQcm9qZWN0KGZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QpDQotCXsNCi0JCWlmICh3c1Byb2plY3QgPT0gbnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCh3c1Byb2plY3QuZ2V0TmFtZSgpKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEZpbmRzIHVuZGVybHlpbmcge0BsaW5rIElUeXBlfSBpbnN0YW5jZSBmb3IgdGhpcyA8Y29kZT5lT2JqZWN0PC9jb2RlPiANCi0JICogQHBhcmFtIGVPYmplY3QgdGhlIERPTSBvYmplY3QNCi0JICogQHJldHVybiB0aGUgSVR5cGUgY29udGFpbmluZyB0aGlzIDxjb2RlPmVPYmplY3Q8L2NvZGU+IG9yIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgSVR5cGUgZmluZFR5cGUoZmluYWwgRU9iamVjdCBlT2JqZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZU9iamVjdCk7DQotCQkNCi0JCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBmaW5kUHJvamVjdChEb21VdGlsLklOU1RBTkNFLmZpbmRXc1Byb2plY3QoZU9iamVjdCkpOw0KLQkJZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOw0KLQkJZmluYWwgU3RyaW5nIGZxTmFtZSA9IGltcGxDbGFzc0ZpbmRlclN3aXRjaC5kb1N3aXRjaChlT2JqZWN0KTsNCi0JCWlmIChqYXZhUHJvamVjdD09bnVsbCB8fCBmcU5hbWUgPT0gbnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gamF2YVByb2plY3QuZmluZFR5cGUoZnFOYW1lKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIERvbVN3aXRjaDxTdHJpbmc+IGNyZWF0ZUltcGxGaW5kZXJTd2l0Y2goKQ0KLQl7DQotCQlyZXR1cm4gbmV3IERvbVN3aXRjaDxTdHJpbmc+KCkNCi0JCXsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgU3RyaW5nIGNhc2VJV2ViU2VydmljZShJV2ViU2VydmljZSB3cykgew0KLQkJCQlyZXR1cm4gd3MuZ2V0SW1wbGVtZW50YXRpb24oKTsNCi0JCQl9DQotCQkJDQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIFN0cmluZyBjYXNlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZShJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSkgew0KLQkJCQlyZXR1cm4gc2VpID09IG51bGwgPyBudWxsIDogc2VpLmdldEltcGxlbWVudGF0aW9uKCk7DQotCQkJfQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBTdHJpbmcgY2FzZUlXZWJNZXRob2QoSVdlYk1ldGhvZCB3bSkgew0KLQkJCQlyZXR1cm4gd20gPT0gbnVsbCA/IG51bGwgOiBjYXNlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkgd20uZUNvbnRhaW5lcigpKTsNCi0JCQl9CQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBTdHJpbmcgY2FzZUlXZWJQYXJhbShJV2ViUGFyYW0gd3ApIHsNCi0JCQkJcmV0dXJuIGNhc2VJV2ViTWV0aG9kKChJV2ViTWV0aG9kKXdwLmVDb250YWluZXIoKSk7DQotCQkJfQ0KLQkJfTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb21BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZmI1M2NkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb21BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlR5cGU7DQotDQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLg0KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEb21BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7DQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIERvbVBhY2thZ2UgbW9kZWxQYWNrYWdlOw0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIERvbUFkYXB0ZXJGYWN0b3J5KCkgew0KLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKQ0KLQkJew0KLQkJCW1vZGVsUGFja2FnZSA9IERvbVBhY2thZ2UuZUlOU1RBTkNFOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsNCi0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKQ0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpDQotCQl7DQotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOw0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGUgc3dpdGNoIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgRG9tU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0NCi0JCW5ldyBEb21Td2l0Y2g8QWRhcHRlcj4oKQ0KLQkJew0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJRE9NKElET00gb2JqZWN0KQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGNyZWF0ZUlET01BZGFwdGVyKCk7DQotCQkJfQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJSmF2YVdlYlNlcnZpY2VFbGVtZW50KElKYXZhV2ViU2VydmljZUVsZW1lbnQgb2JqZWN0KQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGNyZWF0ZUlKYXZhV2ViU2VydmljZUVsZW1lbnRBZGFwdGVyKCk7DQotCQkJfQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugb2JqZWN0KQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VBZGFwdGVyKCk7DQotCQkJfQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJV2ViTWV0aG9kKElXZWJNZXRob2Qgb2JqZWN0KQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGNyZWF0ZUlXZWJNZXRob2RBZGFwdGVyKCk7DQotCQkJfQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJV2ViUGFyYW0oSVdlYlBhcmFtIG9iamVjdCkNCi0JCQl7DQotCQkJCXJldHVybiBjcmVhdGVJV2ViUGFyYW1BZGFwdGVyKCk7DQotCQkJfQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJV2ViU2VydmljZShJV2ViU2VydmljZSBvYmplY3QpDQotCQkJew0KLQkJCQlyZXR1cm4gY3JlYXRlSVdlYlNlcnZpY2VBZGFwdGVyKCk7DQotCQkJfQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJV2ViU2VydmljZVByb2plY3QoSVdlYlNlcnZpY2VQcm9qZWN0IG9iamVjdCkNCi0JCQl7DQotCQkJCXJldHVybiBjcmVhdGVJV2ViU2VydmljZVByb2plY3RBZGFwdGVyKCk7DQotCQkJfQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJV2ViVHlwZShJV2ViVHlwZSBvYmplY3QpDQotCQkJew0KLQkJCQlyZXR1cm4gY3JlYXRlSVdlYlR5cGVBZGFwdGVyKCk7DQotCQkJfQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7DQotCQkJfQ0KLQkJfTsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuDQotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+Lg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsNCi0JCXJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOw0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTSA8ZW0+SURPTTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCi0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSURPTUFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQgPGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlKYXZhV2ViU2VydmljZUVsZW1lbnRBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIDxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kIDxlbT5JV2ViIE1ldGhvZDwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCi0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYk1ldGhvZEFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSA8ZW0+SVdlYiBQYXJhbTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCi0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViUGFyYW1BZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSA8ZW0+SVdlYiBTZXJ2aWNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYlNlcnZpY2VBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3QgPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdEFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlIDxlbT5JV2ViIFR5cGU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViVHlwZQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViVHlwZUFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUpIA0KLQl7DQotCQlzeW5jaHJvbml6ZWQgKHRhcmdldCkgew0KLQkJCXJldHVybiBzdXBlci5hZGFwdCh0YXJnZXQsIHR5cGUpOw0KLQkJfQ0KLQl9DQotCQ0KLX0gLy9Eb21BZGFwdGVyRmFjdG9yeQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb21Td2l0Y2guamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb21Td2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODk1MjE0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlOw0KLQ0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4NCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9DQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLA0KLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0DQotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQ0KLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLA0KLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZQ0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRG9tU3dpdGNoPFQ+IHsNCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQ0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBEb21QYWNrYWdlIG1vZGVsUGFja2FnZTsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBEb21Td2l0Y2goKSB7DQotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpDQotCQl7DQotCQkJbW9kZWxQYWNrYWdlID0gRG9tUGFja2FnZS5lSU5TVEFOQ0U7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7DQotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFQgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7DQotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpDQotCQl7DQotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJTGlzdDxFQ2xhc3M+IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7DQotCQkJcmV0dXJuDQotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/DQotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6DQotCQkJCQlkb1N3aXRjaChlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBUIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgew0KLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklET006DQotCQkJew0KLQkJCQlJRE9NIGlkb20gPSAoSURPTSl0aGVFT2JqZWN0Ow0KLQkJCQlUIHJlc3VsdCA9IGNhc2VJRE9NKGlkb20pOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCQljYXNlIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVDoNCi0JCQl7DQotCQkJCUlKYXZhV2ViU2VydmljZUVsZW1lbnQgaUphdmFXZWJTZXJ2aWNlRWxlbWVudCA9IChJSmF2YVdlYlNlcnZpY2VFbGVtZW50KXRoZUVPYmplY3Q7DQotCQkJCVQgcmVzdWx0ID0gY2FzZUlKYXZhV2ViU2VydmljZUVsZW1lbnQoaUphdmFXZWJTZXJ2aWNlRWxlbWVudCk7DQotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6DQotCQkJew0KLQkJCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSl0aGVFT2JqZWN0Ow0KLQkJCQlUIHJlc3VsdCA9IGNhc2VJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJSmF2YVdlYlNlcnZpY2VFbGVtZW50KGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0Q6DQotCQkJew0KLQkJCQlJV2ViTWV0aG9kIGlXZWJNZXRob2QgPSAoSVdlYk1ldGhvZCl0aGVFT2JqZWN0Ow0KLQkJCQlUIHJlc3VsdCA9IGNhc2VJV2ViTWV0aG9kKGlXZWJNZXRob2QpOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJSmF2YVdlYlNlcnZpY2VFbGVtZW50KGlXZWJNZXRob2QpOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTToNCi0JCQl7DQotCQkJCUlXZWJQYXJhbSBpV2ViUGFyYW0gPSAoSVdlYlBhcmFtKXRoZUVPYmplY3Q7DQotCQkJCVQgcmVzdWx0ID0gY2FzZUlXZWJQYXJhbShpV2ViUGFyYW0pOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJSmF2YVdlYlNlcnZpY2VFbGVtZW50KGlXZWJQYXJhbSk7DQotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0U6DQotCQkJew0KLQkJCQlJV2ViU2VydmljZSBpV2ViU2VydmljZSA9IChJV2ViU2VydmljZSl0aGVFT2JqZWN0Ow0KLQkJCQlUIHJlc3VsdCA9IGNhc2VJV2ViU2VydmljZShpV2ViU2VydmljZSk7DQotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlKYXZhV2ViU2VydmljZUVsZW1lbnQoaVdlYlNlcnZpY2UpOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1Q6DQotCQkJew0KLQkJCQlJV2ViU2VydmljZVByb2plY3QgaVdlYlNlcnZpY2VQcm9qZWN0ID0gKElXZWJTZXJ2aWNlUHJvamVjdCl0aGVFT2JqZWN0Ow0KLQkJCQlUIHJlc3VsdCA9IGNhc2VJV2ViU2VydmljZVByb2plY3QoaVdlYlNlcnZpY2VQcm9qZWN0KTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfVFlQRToNCi0JCQl7DQotCQkJCUlXZWJUeXBlIGlXZWJUeXBlID0gKElXZWJUeXBlKXRoZUVPYmplY3Q7DQotCQkJCVQgcmVzdWx0ID0gY2FzZUlXZWJUeXBlKGlXZWJUeXBlKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUphdmFXZWJTZXJ2aWNlRWxlbWVudChpV2ViVHlwZSk7DQotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SURPTTwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklET008L2VtPicuDQotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgVCBjYXNlSURPTShJRE9NIG9iamVjdCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgY2FzZUlKYXZhV2ViU2VydmljZUVsZW1lbnQoSUphdmFXZWJTZXJ2aWNlRWxlbWVudCBvYmplY3QpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicuDQotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgVCBjYXNlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZShJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIG9iamVjdCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklXZWIgTWV0aG9kPC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCi0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVdlYiBNZXRob2Q8L2VtPicuDQotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgVCBjYXNlSVdlYk1ldGhvZChJV2ViTWV0aG9kIG9iamVjdCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklXZWIgUGFyYW08L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JV2ViIFBhcmFtPC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgY2FzZUlXZWJQYXJhbShJV2ViUGFyYW0gb2JqZWN0KSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVdlYiBTZXJ2aWNlPC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCi0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVdlYiBTZXJ2aWNlPC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgY2FzZUlXZWJTZXJ2aWNlKElXZWJTZXJ2aWNlIG9iamVjdCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCi0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2VtPicuDQotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgVCBjYXNlSVdlYlNlcnZpY2VQcm9qZWN0KElXZWJTZXJ2aWNlUHJvamVjdCBvYmplY3QpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JV2ViIFR5cGU8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JV2ViIFR5cGU8L2VtPicuDQotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgVCBjYXNlSVdlYlR5cGUoSVdlYlR5cGUgb2JqZWN0KSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotfSAvL0RvbVN3aXRjaA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9KZWU1RG9tVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9KZWU1RG9tVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzQ1NWQ3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvSmVlNURvbVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbDsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5JQW5ub3RhdGlvbkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBVdGlsaXR5IGZvciBzb21lIHNwZWNpZmljYXRpb24gc3BlY2lmaWMgbG9naWNzIHRoYXQgYXJlIGZyZXF1ZW50bHkgdXNlZA0KLSAqIHdoaWxlIGRlYWxpbmcgd2l0aCBET00gb2JqZWN0cy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEplZTVEb21VdGlscyANCi17DQotCS8qKiB0aGUgc2luZ2xldG9uIGluc3RhbmNlICovDQotCXByaXZhdGUgc3RhdGljIEplZTVEb21VdGlscyBpbnN0YW5jZTsNCi0JDQotCXByaXZhdGUgSmVlNURvbVV0aWxzKCkgew0KLQkJLy8gc2luZ2xldG9uDQotCX0NCi0JDQotCS8qKg0KLQkgKiBNZXRob2QgdGhhdCBkZWNpZGVzIGlmIHRoZSBhdHRyaWJ1dGUgJ3BhcnROYW1lJyBpcyB1c2VkIGF0IGFsbCBhY2NvcmRpbmcgDQotCSAqIHRvIEpTUi0xODEgc2VjdGlvbiA0LjQuMSAtIGF0dHJpYnV0ZSAncGFydE5hbWUnIGNvbHVtbiAnbWVhbmluZycuDQotCSAqIEBwYXJhbSB3ZWJQYXJhbSB0aGUgd2ViUGFyYW0gdG8gYmUgY2hlY2tlZA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgcGFydE5hbWUgaXMgdXNlZA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNQYXJ0TmFtZVVzZWQoZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKXdlYlBhcmFtLmVDb250YWluZXIoKTsNCi0JCQ0KLQkJcmV0dXJuIHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1N0eWxlKCk9PVNPQVBCaW5kaW5nU3R5bGUuUlBDIHx8IA0KLQkJCXdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk9PVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIE1ldGhvZCB0aGF0IGRlY2lkZXMgaXMgdGhlIGF0dHJpYnV0ZSAnbmFtZScgaXMgdXNlZCBhdCBhbGwNCi0JICogYWNjb3JkaW5nIHRvIEpTUi0xODEgc2VjdGlvbiA0LjQuMSAtIGF0dHJpYnV0ZSAnbmFtZScgY29sdW1uICdtZWFuaW5nJw0KLQkgKiBAcGFyYW0gd2ViUGFyYW0NCi0JICogQHJldHVybiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW4gY2FzZSBuYW1lIGlzIHVzZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzTmFtZVVzZWQoZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKXdlYlBhcmFtLmVDb250YWluZXIoKTsNCi0JCWlmKCB3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdTdHlsZSgpPT1TT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UIHx8IHdlYlBhcmFtLmlzSGVhZGVyKCkgKSB7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQkNCi0JCWZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSAgZmluZEFubm90YXRpb24od2ViUGFyYW0sIFdQX0FOTk9UQVRJT04pOw0KLQkJaWYgKGFubm90YXRpb249PW51bGwpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCXJldHVybiBhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoV1BBbm5vdGF0aW9uRmVhdHVyZXMuUEFSVF9OQU1FX0FUVFJJQlVURSk9PW51bGw7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBIZWxwZXIgbWV0aG9kIHRvIGV4dHJhY3QgYW5ub3RhdGlvbiB3aXRoIGZ1bGx5IHF1YWxpZmllZCBuYW1lIDxjb2RlPmFubkZRTmFtZTwvY29kZT4NCi0JICogQHBhcmFtIGVPYmplY3QgdGhlIG9iamVjdCB0byBzZWFyY2ggaW4NCi0JICogQHBhcmFtIGFubkZRTmFtZSB0aGUgRlEgbmFtZSBvZiBzZWFyY2hlZCBhbm5vdGF0aW9uIA0KLQkgKiBAcmV0dXJuIGZvdW5kIGFubm90YXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICovDQotCXB1YmxpYyBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBmaW5kQW5ub3RhdGlvbihmaW5hbCBFT2JqZWN0IGVPYmplY3QsIGZpbmFsIFN0cmluZyBhbm5GUU5hbWUpIA0KLQl7DQotCQlmaW5hbCBJQW5ub3RhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChJQW5ub3RhdGlvbkFkYXB0ZXIpQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KGVPYmplY3QsIElBbm5vdGF0aW9uQWRhcHRlci5jbGFzcyk7DQotCQlpZiAoYWRhcHRlciE9bnVsbCkgew0KLQkJCXJldHVybiBhZGFwdGVyLmdldEFubm90YXRpb24oYW5uRlFOYW1lKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBNZXRob2QgdGhhdCBkZWNpZGVzIGlmIHRoZSBwYXJhbSBuYW1lIGlzIHJlcXVpcmVkIHRvIGJlIHB1dCBpbiB0aGUgYW5ub3RhdGlvbiBhY2NvcmRpbmcgDQotCSAqIHRvIEpTUi0xODEgc2VjdGlvbiA0LjQuMSAtIGF0dHJpYnV0ZSAnbmFtZScgY29sdW1uICdtZWFuaW5nJy4NCi0JICogQHBhcmFtIHdlYlBhcmFtDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG5hbWUgYXR0cmlidXRlIHNob3VsZCBiZSBwdXQgb24gYW5ub3RhdGlvbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNOYW1lUmVxdWlyZWQoZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKXdlYlBhcmFtLmVDb250YWluZXIoKTsNCi0JCQ0KLQkJaWYgKHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1N0eWxlKCk9PVNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQgJiYNCi0JCQl3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpPT1TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUgJiYNCi0JCQkod2ViUGFyYW0uZ2V0S2luZCgpPT1XZWJQYXJhbUtpbmQuSU5PVVQgfHwgd2ViUGFyYW0uZ2V0S2luZCgpPT1XZWJQYXJhbUtpbmQuT1VUKSkgew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0JDQotCQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEplZTVEb21VdGlscyBnZXRJbnN0YW5jZSgpDQotCXsNCi0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7DQotCQkJaW5zdGFuY2UgPSBuZXcgSmVlNURvbVV0aWxzKCk7DQotCQl9DQotCQkNCi0JCXJldHVybiBpbnN0YW5jZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvTG9jYXRvckV4dHJhY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL0xvY2F0b3JFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWEzNjFjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvTG9jYXRvckV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw7DQotDQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JTG9jYXRvcjsNCi0NCi0NCi0vKioNCi0gKiBDbGFzcyB0aGF0IGV4dHJhY3RzIHtAbGluayBJTG9jYXRvcn0gb3V0IG9mIERPTSBvYmplY3QNCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIExvY2F0b3JFeHRyYWN0b3IgDQotew0KLQlwcml2YXRlIHN0YXRpYyBMb2NhdG9yRXh0cmFjdG9yIGluc3RhbmNlOw0KLQkNCi0JcHJpdmF0ZSBMb2NhdG9yRXh0cmFjdG9yKCkgew0KLQkJLy8gc2luZ2xldG9uIGluc3RhbmNlDQotCX0NCi0JDQotCS8qKg0KLQkgKiBFeHRyYWN0cyB0aGUge0BsaW5rIElMb2NhdG9yfSAgDQotCSAqIEBwYXJhbSBlT2JqZWN0DQotCSAqIEByZXR1cm4ge0BsaW5rIElMb2NhdG9yfSBpbnN0YW5jZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpbiBjYXNlIHRoZSB7QGxpbmsgSUphdmFFbGVtZW50fSANCi0JICogY2Fubm90IGJlIGZvdW5kIGZvciB0aGlzIDxjb2RlPmVPYmplY3Q8L2NvZGU+Lg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+ZU9iamVjdDwvY29kZT4gaXMgRE9NIG9iamVjdCBmb3Igd2hpY2gNCi0JICogdGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkIA0KLQkgKi8NCi0JcHVibGljIElMb2NhdG9yIGZpbmQoZmluYWwgRU9iamVjdCBlT2JqZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgSVR5cGUgc2VpVHlwZSA9IGZpbmRJVHlwZShlT2JqZWN0KTsNCi0JCWlmIChzZWlUeXBlID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJc3dpdGNoKGVPYmplY3QuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkpIA0KLQkJew0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EOg0KLQkJCXJldHVybiBnZXRMb2NhdG9yRm9yTWV0aG9kKHNlaVR5cGUsIChJV2ViTWV0aG9kKWVPYmplY3QpOw0KLQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToNCi0JCQlyZXR1cm4gZ2V0UG9zaXRpb24oc2VpVHlwZSk7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFOg0KLQkJCXJldHVybiBnZXRQb3NpdGlvbihzZWlUeXBlKTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNOg0KLQkJCXJldHVybiBnZXRMb2NhdG9yRm9yTWV0aG9kKHNlaVR5cGUsIChJV2ViTWV0aG9kKWVPYmplY3QuZUNvbnRhaW5lcigpKTsNCi0JCX0NCi0JCQ0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBvYmplY3QgdHlwZSIpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJTG9jYXRvciBnZXRMb2NhdG9yRm9yTWV0aG9kKGZpbmFsIElUeXBlIHNlaVR5cGUsIGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZCA9IERvbVV0aWwuSU5TVEFOQ0UuZmluZE1ldGhvZChzZWlUeXBlLCB3ZWJNZXRob2QpOw0KLQkJaWYgKG1ldGhvZCE9bnVsbCkgew0KLQkJCXJldHVybiBnZXRQb3NpdGlvbihtZXRob2QpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJVHlwZSBmaW5kSVR5cGUoZmluYWwgRU9iamVjdCBlT2JqZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JCXJldHVybiBEb20yUmVzb3VyY2VNYXBwZXIuSU5TVEFOQ0UuZmluZFR5cGUoZU9iamVjdCk7DQotCX0NCi0JDQotCXByaXZhdGUgSUxvY2F0b3IgZ2V0UG9zaXRpb24oZmluYWwgSU1lbWJlciBtZW1iZXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uIA0KLQl7DQotCQlmaW5hbCBpbnQgb2Zmc2V0ID0gbWVtYmVyLmdldE5hbWVSYW5nZSgpLmdldE9mZnNldCgpOw0KLQkJZmluYWwgaW50IGxlbmd0aCA9IG1lbWJlci5nZXROYW1lUmFuZ2UoKS5nZXRMZW5ndGgoKTsNCi0JCWZpbmFsIGludCBsaW5lTnVtYmVyID0gZ2V0TGluZU51bWJlcihtZW1iZXIpOw0KLQkJDQotCQlyZXR1cm4gbmV3IElMb2NhdG9yKCkgDQotCQl7CQkJDQotCQkJcHVibGljIGludCBnZXRTdGFydFBvc2l0aW9uKCkgew0KLQkJCQlyZXR1cm4gb2Zmc2V0Ow0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsJCQkJDQotCQkJCXJldHVybiBsZW5ndGg7DQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsNCi0JCQkJcmV0dXJuIGxpbmVOdW1iZXI7DQotCQkJfQ0KLQkJfTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBpbnQgZ2V0TGluZU51bWJlcihmaW5hbCBJTWVtYmVyIG1lbWJlcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSURvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudChtZW1iZXIuZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0QnVmZmVyKCkuZ2V0Q29udGVudHMoKSk7DQotCQkNCi0JCXJldHVybiBkb2MuZ2V0TGluZU9mT2Zmc2V0KG1lbWJlci5nZXROYW1lUmFuZ2UoKS5nZXRPZmZzZXQoKSkgKyAxOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIExvY2F0b3JFeHRyYWN0b3IgZ2V0SW5zdGFuY2UoKQ0KLQl7DQotCQlpZiAoaW5zdGFuY2U9PW51bGwpIHsNCi0JCQlpbnN0YW5jZSA9IG5ldyBMb2NhdG9yRXh0cmFjdG9yKCk7DQotCQl9DQotCQkNCi0JCXJldHVybiBpbnN0YW5jZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvUGFyYW1WYWx1ZUNvbXBhcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9QYXJhbVZhbHVlQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZTc3MjQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9QYXJhbVZhbHVlQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLQ0KLS8qKg0KLSAqIENsYXNzIHRoYXQgY29tcGFyZXMge0BsaW5rIElQYXJhbVZhbHVlUGFpcn0gYnkgcHJvcGVydHkgbmFtZS4gSW50ZW5kZWQgdG8gYmUgdXNlZCB3aGVuIA0KLSAqIGNyZWF0aW5nIGEge0BsaW5rIFRyZWVTZXR9IGZvciBhbm5vdGF0aW9uIHByb3BlcnRpZXMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQYXJhbVZhbHVlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8SVBhcmFtVmFsdWVQYWlyPg0KLXsJCQ0KLQlwdWJsaWMgZW51bSBPcmRlciB7Tm9ybWFsLCBSZXZlcnNlZH07DQotDQotCXByaXZhdGUgZmluYWwgT3JkZXIgb3JkZXI7DQotCQ0KLQlwdWJsaWMgUGFyYW1WYWx1ZUNvbXBhcmF0b3IoKSB7DQotCQlvcmRlciA9IE9yZGVyLk5vcm1hbDsNCi0JfQ0KLQkNCi0JcHVibGljIFBhcmFtVmFsdWVDb21wYXJhdG9yKGZpbmFsIE9yZGVyIG9yZGVyKSB7DQotCQl0aGlzLm9yZGVyID0gb3JkZXI7DQotCX0NCi0NCi0JDQotCXB1YmxpYyBpbnQgY29tcGFyZShJUGFyYW1WYWx1ZVBhaXIgbzEsIElQYXJhbVZhbHVlUGFpciBvMikgDQotCXsNCi0JCWlmKG9yZGVyPT1PcmRlci5Ob3JtYWwpIHsNCi0JCQlyZXR1cm4gbzEuZ2V0UGFyYW0oKS5jb21wYXJlVG8obzIuZ2V0UGFyYW0oKSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBvMi5nZXRQYXJhbSgpLmNvbXBhcmVUbyhvMS5nZXRQYXJhbSgpKTsNCi0JfQkJDQotfQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2I0NjVhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb247DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5JVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLklDb25zdHJhaW50U3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5tb2RlbC5Nb2RlbENvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnNlcnZpY2UuSUNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5JQW5ub3RhdGlvbkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLkRvbTJSZXNvdXJjZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuSmVlNURvbVV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5Mb2NhdG9yRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5pbXBsLkNvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uaW1wbC5Qcm9ibGVtTG9jYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklMb2NhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5JTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5Mb2dnZXI7DQotDQotLyoqDQotICogQmFzZSBjbGFzcyB0byBiZSB1c2VkIGJ5IG90aGVyIERPTSBjb25zdHJhaW50cy4gUHJvdmlkZXMgdXNlZnVsIG1ldGhvZHMgZm9yDQotICogY3JlYXRpbmcge0BsaW5rIElDb25zdHJhaW50U3RhdHVzfSBkdXJpbmcgdmFsaWRhdGlvbiwgZXh0cmFjdGlvbiBvZiANCi0gKiBlcnJvciBsb2NhdGlvbiBldGMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50IGV4dGVuZHMgTW9kZWxDb25zdHJhaW50DQotew0KLQlwcml2YXRlIElMb2dnZXIgbG9nZ2VyOw0KLQlwcml2YXRlIEplZTVEb21VdGlscyBqZWU1RG9tVXRpbDsNCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciANCi0JICogQHBhcmFtIGRlc2NyaXB0b3IgLSB0aGUge0BsaW5rIElDb25zdHJhaW50RGVzY3JpcHRvcn0gZm9yIHRoZSBzcGVjaWZpYyBjb25zdHJhaW50DQotCSAqIHNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4NCi0JICovDQotCXB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50KElDb25zdHJhaW50RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7DQotCQlzdXBlcihkZXNjcmlwdG9yKTsNCi0JCQ0KLQkJbnVsbENoZWNrUGFyYW0oZGVzY3JpcHRvciwgImRlc2NyaXB0b3IiKTsvLyROT04tTkxTLTEkDQotCQlsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7DQotCQlqZWU1RG9tVXRpbCA9IEplZTVEb21VdGlscy5nZXRJbnN0YW5jZSgpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQWJzdHJhY3QgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSByZWFsIHZhbGlkYXRpb24gaGF2ZSB0byB0YWtlIHBsYWNlLiBPdmVycmlkZQ0KLQkgKiB0aGlzIG1ldGhvZCBhbmQgaW1wbGVtZW50IHlvdXIgdmFsaWRhdGlvbiBsb2dpYy4gDQotCSAqIEBwYXJhbSBjdHggdGhlIHZhbGlkYXRpb24gY29udGV4dCANCi0JICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHlvdXIgdmFsaWRhdGlvbg0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JICovDQotCXByb3RlY3RlZCBhYnN0cmFjdCBJU3RhdHVzIGRvVmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGN0eCkgdGhyb3dzIENvcmVFeGNlcHRpb247IA0KLQ0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgY3R4KSANCi0Jew0KLQkJdHJ5IHsNCi0JCQlyZXR1cm4gZG9WYWxpZGF0ZShjdHgpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJbG9nZ2VyKCkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfQkNCi0JCQ0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDcmVhdGVzIE9LIHN0YXR1cw0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB2YWxpZGF0ZWQgb2JqZWN0DQotCSAqIEByZXR1cm4ge0BsaW5rIElDb25zdHJhaW50U3RhdHVzfSBpbnN0YW5jZSB3aXRoIHNldmVyaXR5IHtAbGluayBJU3RhdHVzI09LfQ0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJvdGVjdGVkIElDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWQgY3JlYXRlT2tTdGF0dXMoRU9iamVjdCBvYmplY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJcmV0dXJuIG5ldyBDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWQodGhpcywgb2JqZWN0LCBJU3RhdHVzLk9LLCAwLCAiIiwgbmV3IEhhc2hTZXQ8SVByb2JsZW1Mb2NhdGlvbj4oMCkpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZXMge0BsaW5rIElDb25zdHJhaW50U3RhdHVzfSBpbnN0YW5jZSB3aXRoIHNldmVyaXR5IGRlcGVuZGluZyBvbiB0aGUgc2V2ZXJpdHkgZGVmaW5lZCBieSANCi0JICoge0BsaW5rIElDb25zdHJhaW50RGVzY3JpcHRvciNnZXRTZXZlcml0eSgpfS4NCi0JICogQHBhcmFtIG9iamVjdCB0aGUgdmFsaWRhdGVkIG9iamVjdA0KLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQNCi0JICogQHBhcmFtIGFubkZRTmFtZSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb24gdGhlIGFubm90YXRpb24gdmFsaWRhdGVkDQotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdmFsaWRhdGVkDQotCSAqIEByZXR1cm4gY3JlYXRlZCBvYmplY3QNCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXByb3RlY3RlZCBJQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkIGNyZWF0ZVN0YXR1cyhFT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBhbm5GUU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXJldHVybiBjcmVhdGVTdGF0dXMob2JqZWN0LCBtZXNzYWdlLCBnZXRMb2NhdG9yKG9iamVjdCwgYW5uRlFOYW1lLCBhdHRyaWJ1dGVOYW1lKSk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkIGNyZWF0ZVN0YXR1cyhmaW5hbCBFT2JqZWN0IG9iamVjdCwgZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIElQcm9ibGVtTG9jYXRpb24gbG9jYXRvcikgDQotCXsNCi0JCWZpbmFsIFNldDxJUHJvYmxlbUxvY2F0aW9uPiBwcm9ibGVtcyA9IG5ldyBIYXNoU2V0PElQcm9ibGVtTG9jYXRpb24+KDEpOw0KLQkJcHJvYmxlbXMuYWRkKGxvY2F0b3IpOw0KLQkJDQotCQlyZXR1cm4gbmV3IENvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZCh0aGlzLCBvYmplY3QsIG1lc3NhZ2UsIHByb2JsZW1zKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyB7QGxpbmsgSVByb2JsZW1Mb2NhdGlvbn0gaW5zdGFuY2Ugb3V0IG9mIHtAbGluayBFT2JqZWN0fSBpbnN0YW5jZS4gDQotCSAqIERlZmluZXMgd2hpY2ggaXMgdGhlIHtAbGluayBJUmVzb3VyY2V9IGNvbnRhaW5pbmcgdGhpcyBET00gb2JqZWN0IGFuZCB0cmllcyB0byANCi0JICogZXh0cmFjdCB7QGxpbmsgSUxvY2F0b3J9Lg0KLQkgKiBAcGFyYW0gZU9iamVjdA0KLQkgKiBAcGFyYW0gYW5uRlFOYW1lDQotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lDQotCSAqIEByZXR1cm4gY3JlYXRlZCBsb2NhdGlvbg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJvdGVjdGVkIElQcm9ibGVtTG9jYXRpb24gZ2V0TG9jYXRvcihFT2JqZWN0IGVPYmplY3QsIFN0cmluZyBhbm5GUU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElBbm5vdGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKElBbm5vdGF0aW9uQWRhcHRlcilBbm5vdGF0aW9uQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQoZU9iamVjdCwgSUFubm90YXRpb25BZGFwdGVyLmNsYXNzKTsNCi0JCWZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSBhbm5GUU5hbWU9PW51bGwgPyBudWxsIDogYWRhcHRlci5nZXRBbm5vdGF0aW9uKGFubkZRTmFtZSk7DQotCQlpZiAoYW5ub3RhdGlvbj09bnVsbCkgew0KLQkJCXJldHVybiBuZXcgUHJvYmxlbUxvY2F0aW9uKGZpbmRSZXNvdXJjZShlT2JqZWN0KSwgZ2V0TG9jYXRvckZvckltcGxlbWVudGF0aW9uKGVPYmplY3QpKTsNCi0JCX0NCi0JCQ0KLQkJSUxvY2F0b3IgbG9jYXRvciA9IG51bGw7DQotCQlpZiAoYXR0cmlidXRlTmFtZSAhPSBudWxsKSB7DQotCQkJbG9jYXRvciA9IGdldExvY2F0b3JGb3JBdHRyaWJ1dGVWYWx1ZShhbm5vdGF0aW9uLCBhdHRyaWJ1dGVOYW1lKTsNCi0JCX0NCi0JCQ0KLQkJaWYgKGxvY2F0b3IgPT0gbnVsbCkgew0KLQkJCWxvY2F0b3IgPSBhbm5vdGF0aW9uLmdldExvY2F0b3IoKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG5ldyBQcm9ibGVtTG9jYXRpb24oYW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLmdldFJlc291cmNlKCksIGxvY2F0b3IpOw0KLQl9DQotDQotCXByb3RlY3RlZCBJTG9jYXRvciBnZXRMb2NhdG9yRm9yQXR0cmlidXRlVmFsdWUoSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpDQotCXsNCi0JCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhaXIgOiBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpKSANCi0JCXsNCi0JCQlpZihwYWlyLmdldFBhcmFtKCkuZXF1YWxzKGF0dHJpYnV0ZU5hbWUpKSB7DQotCQkJCXJldHVybiBwYWlyLmdldFZhbHVlKCkuZ2V0TG9jYXRvcigpOyANCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSUxvY2F0b3IgZ2V0TG9jYXRvckZvckltcGxlbWVudGF0aW9uKGZpbmFsIEVPYmplY3QgZU9iamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiAgew0KLQkJdHJ5IHsNCi0JCQlyZXR1cm4gTG9jYXRvckV4dHJhY3Rvci5nZXRJbnN0YW5jZSgpLmZpbmQoZU9iamVjdCk7DQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7DQotCQkJbG9nZ2VyKCkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElSZXNvdXJjZSBmaW5kUmVzb3VyY2UoRU9iamVjdCBlT2JqZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JCXJldHVybiBEb20yUmVzb3VyY2VNYXBwZXIuSU5TVEFOQ0UuZmluZFJlc291cmNlKGVPYmplY3QpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gZmluZEFubm90YXRpb24oZmluYWwgRU9iamVjdCBlT2JqZWN0LCBmaW5hbCBTdHJpbmcgYW5uRlFOYW1lKSANCi0Jew0KLQkJZmluYWwgSUFubm90YXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSUFubm90YXRpb25BZGFwdGVyKUFubm90YXRpb25BZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChlT2JqZWN0LCBJQW5ub3RhdGlvbkFkYXB0ZXIuY2xhc3MpOw0KLQkJcmV0dXJuIGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihhbm5GUU5hbWUpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSUxvZ2dlciBsb2dnZXIoKSB7DQotCQlyZXR1cm4gbG9nZ2VyOw0KLQl9DQotDQotCXByb3RlY3RlZCBKZWU1RG9tVXRpbHMgamVlNURvbVV0aWwoKSB7DQotCQlyZXR1cm4gamVlNURvbVV0aWw7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL0RvbVZhbGlkYXRpb25Db25zdHJhaW50RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL0RvbVZhbGlkYXRpb25Db25zdHJhaW50RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MDcwNjUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9Eb21WYWxpZGF0aW9uQ29uc3RyYWludERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLkNhdGVnb3J5TWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuRXZhbHVhdGlvbk1vZGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnNlcnZpY2UuQWJzdHJhY3RDb25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVNZXNzYWdlczsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRG9tVmFsaWRhdGlvbkNvbnN0cmFpbnREZXNjcmlwdG9yIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJhaW50RGVzY3JpcHRvcg0KLXsNCi0JcHVibGljIERvbVZhbGlkYXRpb25Db25zdHJhaW50RGVzY3JpcHRvcigpIHsNCi0JCWFkZENhdGVnb3J5KENhdGVnb3J5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldENhdGVnb3J5KCJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmplZTUiKSk7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCQ0KLQlwdWJsaWMgU3RyaW5nIGdldEJvZHkoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgew0KLQkJcmV0dXJuIEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLkRvbVZhbGlkYXRpb25Db25zdHJhaW50RGVzY3JpcHRvcl9XU19ET01fVkFMSURBVElPTl9DT05TVFJBSU5UOw0KLQl9DQotDQotCXB1YmxpYyBFdmFsdWF0aW9uTW9kZTxFT2JqZWN0PiBnZXRFdmFsdWF0aW9uTW9kZSgpIHsNCi0JCXJldHVybiBFdmFsdWF0aW9uTW9kZS5CQVRDSDsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VQYXR0ZXJuKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLQkJcmV0dXJuIEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLkRvbVZhbGlkYXRpb25Db25zdHJhaW50RGVzY3JpcHRvcl9XU19ET01fVkFMSURBVElPTl9DT05TVFJBSU5UOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIHRhcmdldHNFdmVudChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiB0YXJnZXRzVHlwZU9mKEVPYmplY3Qgb2JqZWN0KSB7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vRG9tVmFsaWRhdG9yRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL0RvbVZhbGlkYXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzc2NGI5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vRG9tVmFsaWRhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwudXRpbC5YcFV0aWw7DQotDQotLyoqDQotICogU2luZ2xldG9uIGZhY3RvcnkgdXNlZCB0byBpbnN0YW50aWF0ZSByZWdpc3RlcmVkIERPTSB2YWxpZGF0b3JzLiANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIERvbVZhbGlkYXRvckZhY3RvcnkgDQotew0KLQkvKiogVGhlIGV4dGVuc2lvbiBwb2ludCBJRCAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET01fVkFMSURBVElPTl9YUCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuZG9tVmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJA0KLQkNCi0JLyoqIEZhY3RvcnkncyBzaW5nbGV0b24gaW5zdGFuY2UgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEb21WYWxpZGF0b3JGYWN0b3J5IElOU1RBTkNFID0gbmV3IERvbVZhbGlkYXRvckZhY3RvcnkoKTsNCi0JDQotCXByaXZhdGUgRG9tVmFsaWRhdG9yRmFjdG9yeSgpIHsNCi0JCS8vIHNpbmdsZXRvbg0KLQl9DQotCQ0KLQkvKioNCi0JICogRXh0cmFjdHMgYWxsIHJlZ2lzdGVyZWQgRE9NIHZhbGlkYXRvcnMuDQotCSAqIEByZXR1cm4gY29sbGVjdGlvbiBvZiBhbGwgcmVnaXN0ZXJlZCBET00gdmFsaWRhdG9ycw0KLQkgKi8NCi0JcHVibGljIENvbGxlY3Rpb248SURvbVZhbGlkYXRvcj4gZ2V0UmVnaXN0ZXJlZFZhbGlkYXRvcnMoKQ0KLQl7DQotCQlmaW5hbCBMaXN0PElEb21WYWxpZGF0b3I+IHZhbGlkYXRvcnMgPSBuZXcgQXJyYXlMaXN0PElEb21WYWxpZGF0b3I+KCk7DQotCQlmaW5hbCBJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KERPTV9WQUxJREFUSU9OX1hQKTsNCi0JCWZvciAoSUV4dGVuc2lvbiBleHRlbnNpb24gOiBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCkpIHsNCi0JCQl2YWxpZGF0b3JzLmFkZCgoKElEb21WYWxpZGF0b3IpIFhwVXRpbC5pbnN0YW50aWF0ZUltcGxlbWVudGF0aW9uKGV4dGVuc2lvbikpKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHZhbGlkYXRvcnM7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL0lDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9JQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViN2M2NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL0lDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb247DQotDQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLklDb25zdHJhaW50U3RhdHVzOw0KLQ0KLS8qKg0KLSAqIEV4dGVuZGVkIGNvbnN0cmFpbnQgc3RhdHVzIHdoaWNoIGNhcnJpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2JsZW0gbG9jYXRpb24gDQotICogQGF1dGhvciBEYW5haWwgQnJhbmVrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWQgZXh0ZW5kcyBJQ29uc3RyYWludFN0YXR1cw0KLXsNCi0JLyoqDQotCSAqIEdldHMgdGhlIHNldCBvZiB0aGUgcHJvYmxlbSBsb2NhdGlvbnMuIFRoZSByZXN1bHQgaXMgYW4gdW5tb2RpZmlhYmxlIHNldCANCi0JICogQHJldHVybiBzZXQgb2YgcHJvYmxlbSBsb2NhdGlvbnM7IGVtcHR5IHNldCBpZiBub25lDQotCSAqLw0KLQlwdWJsaWMgU2V0PElQcm9ibGVtTG9jYXRpb24+IGdldFByb2JsZW1Mb2NhdGlvbnMoKTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL0lEb21WYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9JRG9tVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI5MjY2YTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL0lEb21WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi0NCi0vKioNCi0gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaWYgeW91IGludGVuZCB0byBpbXBsZW1lbnQgc3BlY2lmaWMgRE9NIHJ1bnRpbWUgdmFsaWRhdGlvbi4NCi0gKiBZb3UgbmVlZCB0byByZWdpc3RlciB0aGUgdmFsaWRhdG9yIHVzaW5nIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5kb21WYWxpZGF0b3INCi0gKiBleHRlbnNpb24gcG9pbnQgYW5kIHNwZWNpZnkgZm9yIHdoaWNoIERPTSBydW50aW1lIHZlcnNpb24gaXQgd2lsbCBiZSByZWxldmFudC4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGludGVyZmFjZSBJRG9tVmFsaWRhdG9yIA0KLXsNCi0JLyoqDQotCSAqIENhbGxlZCB3aGVuIHZhbGlkYXRpb24gaXMgdHJpZ2dlcmVkIC0gZm9yIGRldGFpbHMgc2VlIFdTVCB2YWxpZGF0aW9uIGZyYW1ld29yayBhbmQNCi0JICogRG9tVmFsaWRhdGlvbk1hbmFnZXIuDQotCSAqIEBwYXJhbSBvYmplY3Qgb2JqZWN0IHRvIGJlIHZhbGlkYXRlZA0KLQkgKiBAcmV0dXJuIHRoZSB2YWxpZGF0aW9uIHJlc3VsdHMNCi0JICovDQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKEVPYmplY3Qgb2JqZWN0KTsNCi0JDQotCS8qKg0KLQkgKiBIZXJlIHlvdSBtdXN0IHJldHVybiB0aGUgRE9NIHJ1bnRpbWUgSUQgd2hpY2ggdGhpcyB2YWxpZGF0b3Igc3VwcG9ydHMNCi0JICogQHJldHVybiBET00gcnVudGltZSBJRA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRTdXBwb3J0ZWREb21SdW50aW1lKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9JUHJvYmxlbUxvY2F0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vSVByb2JsZW1Mb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMjBjYTVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9JUHJvYmxlbUxvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JTG9jYXRvcjsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiB3aGVyZSB0aGUgcHJvYmxlbSBtYXJrZXIgc2hvdWxkIGJlIHNldC9yZW1vdmVkIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9ibGVtTG9jYXRpb24gDQotew0KLQkvKioNCi0JICogVGhlIHJlc291cmNlIG9uIHdoaWNoIHRoZSBtYXJrZXIgdG8gYmUgc2V0IG9yIHJlbW92ZWQNCi0JICogQHJldHVybiBub3QgPGNvZGU+bnVsbDwvY29kZT4ge0BsaW5rIElSZXNvdXJjZX0gaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKTsNCi0JDQotCS8qKg0KLQkgKiBUaGUgZXhhY3QgbG9jYXRpb24gaW4gY29kZSB3aGVyZSB0aGUgbWFya2VyIHRvIGJlIHB1dA0KLQkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgSUxvY2F0b3J9IGluc3RhbmNlIHRvIGRlZmluZSB0aGUgc3RhcnQgY2hhciBhbmQgbGVuZ3RoIG9mIHRleHQNCi0JICogdG8gYmUgdW5kZXJsaW5lZCBieSB0aGUgbWFya2VyLiBUaGlzIG1ldGhvZCBtaWdodCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaW4gY2FzZQ0KLQkgKiBsb2NhdGlvbiBpbmZvIGlzIG5vdCByZWxldmFudCAtIGZvciBleGFtcGxlIHdoZW4gbWFya2VyIGp1c3QgbmVlZHMgdG8gYmUgcmVtb3ZlZC4NCi0JICovDQotCXB1YmxpYyBJTG9jYXRvciBnZXRMb2NhdG9yKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9KYXhXc0RvbVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL0pheFdzRG9tVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyYTU4NjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL0pheFdzRG9tVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLkV2YWx1YXRpb25Nb2RlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5zZXJ2aWNlLklCYXRjaFZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uc2VydmljZS5JVHJhdmVyc2FsU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnNlcnZpY2UuTW9kZWxWYWxpZGF0aW9uU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb247DQotDQotLyoqDQotICogSkFYLVdTIHJ1bnRpbWUgRE9NIHZhbGlkYXRvci4gUmVnaXN0ZXJlZCB0byB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgDQotICogdG8gY29udHJpYnV0ZSB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSmF4V3NEb21WYWxpZGF0b3IgaW1wbGVtZW50cyBJRG9tVmFsaWRhdG9yIA0KLXsNCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoRU9iamVjdCBvYmplY3QpIA0KLQl7DQotCQlmaW5hbCBJQmF0Y2hWYWxpZGF0b3IgdmFsaWRhdG9yID0gKElCYXRjaFZhbGlkYXRvcikgTW9kZWxWYWxpZGF0aW9uU2VydmljZS5nZXRJbnN0YW5jZSgpLm5ld1ZhbGlkYXRvcihFdmFsdWF0aW9uTW9kZS5CQVRDSCk7DQotCQl2YWxpZGF0b3Iuc2V0SW5jbHVkZUxpdmVDb25zdHJhaW50cyh0cnVlKTsNCi0JCXZhbGlkYXRvci5zZXRSZXBvcnRTdWNjZXNzZXModHJ1ZSk7DQotCQl2YWxpZGF0b3IuZ2V0Q29uc3RyYWludEZpbHRlcnMoKTsNCi0JCXZhbGlkYXRvci5zZXRUcmF2ZXJzYWxTdHJhdGVneShuZXcgSVRyYXZlcnNhbFN0cmF0ZWd5LlJlY3Vyc2l2ZSgpKTsNCi0NCi0JCXZhbGlkYXRvci52YWxpZGF0ZShvYmplY3QsIG51bGwpOw0KLQ0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCX0NCi0NCi0JcHVibGljIFN0cmluZyBnZXRTdXBwb3J0ZWREb21SdW50aW1lKCkgewkNCi0JCXJldHVybiBKZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uLklEOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9Xc0R5bmFtaWNNb2RlbENvbnN0cmFpbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL1dzRHluYW1pY01vZGVsQ29uc3RyYWludFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ5YjY0YTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL1dzRHluYW1pY01vZGVsQ29uc3RyYWludFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuSU1vZGVsQ29uc3RyYWludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uc2VydmljZS5JTW9kZWxDb25zdHJhaW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuRG9tU3dpdGNoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5zZWkuU2VpQ29uc3RyYWludFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJtZXRob2QuV21Db25zdHJhaW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLndlYnBhcmFtLldwQ29uc3RyYWludFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJzZXJ2aWNlLldzQ29uc3RyYWludFByb3ZpZGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBXc0R5bmFtaWNNb2RlbENvbnN0cmFpbnRQcm92aWRlciBpbXBsZW1lbnRzIElNb2RlbENvbnN0cmFpbnRQcm92aWRlciANCi17DQotCXByaXZhdGUgZmluYWwgRG9tU3dpdGNoPENvbGxlY3Rpb248SU1vZGVsQ29uc3RyYWludD4+IGRvbVN3aXRjaDsNCi0JcHJpdmF0ZSBmaW5hbCBXc0NvbnN0cmFpbnRQcm92aWRlciB3c1Byb3ZpZGVyOw0KLQlwcml2YXRlIGZpbmFsIFNlaUNvbnN0cmFpbnRQcm92aWRlciBzZWlQcm92aWRlcjsNCi0JcHJpdmF0ZSBmaW5hbCBXbUNvbnN0cmFpbnRQcm92aWRlciB3bVByb3ZpZGVyOw0KLQlwcml2YXRlIGZpbmFsIFdwQ29uc3RyYWludFByb3ZpZGVyIHdwUHJvdmlkZXI7DQotCQ0KLQkNCi0JcHVibGljIFdzRHluYW1pY01vZGVsQ29uc3RyYWludFByb3ZpZGVyKCkNCi0Jew0KLQkJZG9tU3dpdGNoID0gY3JlYXRlRG9tU3dpdGNoKCk7DQotCQl3c1Byb3ZpZGVyID0gbmV3IFdzQ29uc3RyYWludFByb3ZpZGVyKCk7DQotCQlzZWlQcm92aWRlciA9IG5ldyBTZWlDb25zdHJhaW50UHJvdmlkZXIoKTsNCi0JCXdtUHJvdmlkZXIgPSBuZXcgV21Db25zdHJhaW50UHJvdmlkZXIoKTsNCi0JCXdwUHJvdmlkZXIgPSBuZXcgV3BDb25zdHJhaW50UHJvdmlkZXIoKTsNCi0JfQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEJhdGNoQ29uc3RyYWludHMoRU9iamVjdCBlT2JqZWN0LCBDb2xsZWN0aW9uIGNvbnN0cmFpbnRzKSANCi0Jew0KLQkJZmluYWwgQ29sbGVjdGlvbjxJTW9kZWxDb25zdHJhaW50PiBtb2RlbENvbnN0cmFpbnRzID0gZG9tU3dpdGNoLmRvU3dpdGNoKGVPYmplY3QpOw0KLQkJaWYgKG1vZGVsQ29uc3RyYWludHMhPW51bGwpIHsNCi0JCQljb25zdHJhaW50cy5hZGRBbGwobW9kZWxDb25zdHJhaW50cyk7DQotCQl9DQotCQkNCi0JCXJldHVybiBjb25zdHJhaW50czsNCi0JfQ0KLQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TGl2ZUNvbnN0cmFpbnRzKE5vdGlmaWNhdGlvbiBhcmcwLCBDb2xsZWN0aW9uIGNvbnN0cmFpbnRzKSB7DQotCQlyZXR1cm4gY29uc3RyYWludHM7DQotCX0NCi0NCi0JcHJpdmF0ZSBEb21Td2l0Y2g8Q29sbGVjdGlvbjxJTW9kZWxDb25zdHJhaW50Pj4gY3JlYXRlRG9tU3dpdGNoKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBEb21Td2l0Y2g8Q29sbGVjdGlvbjxJTW9kZWxDb25zdHJhaW50Pj4oKSANCi0JCXsNCi0JCQlwdWJsaWMgQ29sbGVjdGlvbjxJTW9kZWxDb25zdHJhaW50PiBjYXNlSVdlYlNlcnZpY2UoSVdlYlNlcnZpY2Ugb2JqZWN0KSB7CQkJCQ0KLQkJCQlyZXR1cm4gd3NQcm92aWRlci5nZXRDb25zdHJhaW50cygpOw0KLQkJCX0NCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQ29sbGVjdGlvbjxJTW9kZWxDb25zdHJhaW50PiBjYXNlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZShJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIG9iamVjdCkgew0KLQkJCQlyZXR1cm4gc2VpUHJvdmlkZXIuZ2V0Q29uc3RyYWludHMoKTsNCi0JCQl9CQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBDb2xsZWN0aW9uPElNb2RlbENvbnN0cmFpbnQ+IGNhc2VJV2ViTWV0aG9kKElXZWJNZXRob2Qgb2JqZWN0KSB7DQotCQkJCXJldHVybiB3bVByb3ZpZGVyLmdldENvbnN0cmFpbnRzKCk7DQotCQkJfQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBDb2xsZWN0aW9uPElNb2RlbENvbnN0cmFpbnQ+IGNhc2VJV2ViUGFyYW0oSVdlYlBhcmFtIG9iamVjdCkgew0KLQkJCQlyZXR1cm4gd3BQcm92aWRlci5nZXRDb25zdHJhaW50cygpOw0KLQkJCX0NCi0JCX07DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL1dzUHJvYmxlbXNSZXBvcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL1dzUHJvYmxlbXNSZXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwY2RiMzhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9Xc1Byb2JsZW1zUmVwb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb247DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLklDb25zdHJhaW50U3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5zZXJ2aWNlLklWYWxpZGF0aW9uTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnNlcnZpY2UuVmFsaWRhdGlvbkV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmRvbS52YWxpZGF0aW9uLkRvbVZhbGlkYXRpb25Db25zdGFudHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBQcm9ibGVtcyByZXBvcnRlci4gTGlzdGVucyB0byB2YWxpZGF0aW9uIGV2ZW50cyBhbmQgcmVwb3J0cyBlcnJvcnMuICANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFdzUHJvYmxlbXNSZXBvcnRlciBpbXBsZW1lbnRzIElWYWxpZGF0aW9uTGlzdGVuZXIgDQotew0KLQkvKiogVGhlIHZhbGlkYXRpb24gbWFya2VyIElEICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktFUl9JRCA9IERvbVZhbGlkYXRpb25Db25zdGFudHMuTUFSS0VSX0lEOw0KLQ0KLQkNCi0JcHVibGljIHZvaWQgdmFsaWRhdGlvbk9jY3VycmVkKFZhbGlkYXRpb25FdmVudCBldmVudCkgDQotCXsNCi0JCWZpbmFsIExpc3Q8SUNvbnN0cmFpbnRTdGF0dXM+IGxpc3QgPSBldmVudC5nZXRWYWxpZGF0aW9uUmVzdWx0cygpOw0KLQkJZm9yIChJQ29uc3RyYWludFN0YXR1cyBjU3RhdHVzIDogbGlzdCkNCi0JCXsNCi0JCQlhc3NlcnQgY1N0YXR1cyBpbnN0YW5jZW9mIElDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWQ7DQotCQkJDQotCQkJaWYgKGNTdGF0dXMuaXNPSygpKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0NCi0JCQlwcm9jZXNzU3RhdHVzKGNTdGF0dXMpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1N0YXR1cyhmaW5hbCBJQ29uc3RyYWludFN0YXR1cyBzdGF0dXMpDQotCXsJCQ0KLQkJaWYgKCEoc3RhdHVzIGluc3RhbmNlb2YgSUNvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZCkpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotDQotCQl0cnkgew0KLQkJCWZpbmFsIElQcm9ibGVtTG9jYXRpb24gbG9jYXRvciA9ICgoSUNvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZClzdGF0dXMpLmdldFByb2JsZW1Mb2NhdGlvbnMoKS5pdGVyYXRvcigpLm5leHQoKTsNCi0JCQlmaW5hbCBJTWFya2VyIG1hcmtlciA9IGxvY2F0b3IuZ2V0UmVzb3VyY2UoKS5jcmVhdGVNYXJrZXIoTUFSS0VSX0lEKTsNCi0JCQlpZiAobG9jYXRvci5nZXRMb2NhdG9yKCkgIT0gbnVsbCkgDQotCQkJew0KLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCwgbG9jYXRvci5nZXRMb2NhdG9yKCkuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5ELCBsb2NhdG9yLmdldExvY2F0b3IoKS5nZXRTdGFydFBvc2l0aW9uKCkgKyBsb2NhdG9yLmdldExvY2F0b3IoKS5nZXRMZW5ndGgoKSk7DQotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUiwgbG9jYXRvci5nZXRMb2NhdG9yKCkuZ2V0TGluZU51bWJlcigpKTsNCi0JCQl9DQotCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIHN0YXR1cy5nZXRNZXNzYWdlKCkpOw0KLQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5QUklPUklUWSwgSU1hcmtlci5QUklPUklUWV9OT1JNQUwpOw0KLQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgZ2V0TWFya2VyU2V2ZXJpdHkoc3RhdHVzLmdldFNldmVyaXR5KCkpKTsNCi0JCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU09VUkNFX0lELCBzdGF0dXMuZ2V0Q29uc3RyYWludCgpLmdldERlc2NyaXB0b3IoKS5nZXRJZCgpKTsNCi0JCQltYXJrZXIuc2V0QXR0cmlidXRlKERvbVZhbGlkYXRpb25Db25zdGFudHMuSU1QTEVNRU5UQVRJT04sIERvbVV0aWwuSU5TVEFOQ0UuY2FsY1VuaXF1ZUltcGwoc3RhdHVzLmdldFRhcmdldCgpKSk7DQotCQl9IA0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCWxvZ2dlcigpLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBpbnQgZ2V0TWFya2VyU2V2ZXJpdHkoaW50IHN0YXR1c1NldmVyaXR5KQ0KLQl7DQotCQlzd2l0Y2goc3RhdHVzU2V2ZXJpdHkpDQotCQl7DQotCQljYXNlIElTdGF0dXMuSU5GTzogcmV0dXJuIElNYXJrZXIuU0VWRVJJVFlfSU5GTzsNCi0JCWNhc2UgSVN0YXR1cy5XQVJOSU5HOiByZXR1cm4gSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HOw0KLQkJZGVmYXVsdDoNCi0JCQlyZXR1cm4gSU1hcmtlci5TRVZFUklUWV9FUlJPUjsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIElMb2dnZXIgbG9nZ2VyKCkgew0KLQkJcmV0dXJuIG5ldyBMb2dnZXIoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vaW1wbC9Db25zdHJhaW50U3RhdHVzRXh0ZW5kZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9pbXBsL0NvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNDFlYTBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9pbXBsL0NvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5pbXBsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuQ29uc3RyYWludFN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuSU1vZGVsQ29uc3RyYWludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uSUNvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uSVByb2JsZW1Mb2NhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi0NCi0vKioNCi0gKiBFeHRlbmRlZCBjb25zdHJhaW50IHN0YXR1cyB3aGljaCBjYXJyaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ibGVtIGxvY2F0aW9uIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICovDQotcHVibGljIGNsYXNzIENvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZCBleHRlbmRzIENvbnN0cmFpbnRTdGF0dXMgaW1wbGVtZW50cyBJQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkDQotew0KLQlwcml2YXRlIGZpbmFsIFNldDxJUHJvYmxlbUxvY2F0aW9uPiBwcm9ibGVtTG9jYXRpb25zOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0cyBhIDxjb2RlPkNvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZDwvY29kZT4gaW5zdGFuY2Ugd2l0aCBlbXB0eSByZXN1bHQgbG9jdXMNCi0JICogQHBhcmFtIGNvbnN0cmFpbnQNCi0JICogQHBhcmFtIHRhcmdldA0KLQkgKiBAcGFyYW0gc2V2ZXJpdHkNCi0JICogQHBhcmFtIGNvZGUNCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogQHBhcmFtIHByb2JsZW1Mb2NhdGlvbnMgYSBzZXQgb2YgcHJvYmxlbSBsb2NhdGlvbnMgb3IgZW1wdHkgc2V0IGlmIG5vbmU7IGNhbm5vdCBiZSBudWxsLjxicj4gDQotCSAqIA0KLQkgKiBAc2VlIENvbnN0cmFpbnRTdGF0dXMjQ29uc3RyYWludFN0YXR1cyhJTW9kZWxDb25zdHJhaW50LCBFT2JqZWN0LCBpbnQsIGludCwgU3RyaW5nLCBTZXQpDQotCSAqLw0KLQlwdWJsaWMgQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkKGZpbmFsIElNb2RlbENvbnN0cmFpbnQgY29uc3RyYWludCwgZmluYWwgRU9iamVjdCB0YXJnZXQsIGZpbmFsIGludCBzZXZlcml0eSwgZmluYWwgaW50IGNvZGUsIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBTZXQ8SVByb2JsZW1Mb2NhdGlvbj4gcHJvYmxlbUxvY2F0aW9ucykNCi0Jew0KLQkJc3VwZXIoY29uc3RyYWludCwgdGFyZ2V0LCBzZXZlcml0eSwgY29kZSwgbWVzc2FnZSwgbmV3IEhhc2hTZXQ8RU9iamVjdD4oKSk7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0ocHJvYmxlbUxvY2F0aW9ucywgInByb2JsZW1Mb2NhdGlvbiIpOy8vJE5PTi1OTFMtMSQNCi0JCXRoaXMucHJvYmxlbUxvY2F0aW9ucyA9IHByb2JsZW1Mb2NhdGlvbnM7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+Q29uc3RyYWludFN0YXR1c0V4dGVuZGVkPC9jb2RlPiBpbnN0YW5jZSB3aXRoIGVtcHR5IHJlc3VsdCBsb2N1cw0KLQkgKiBAcGFyYW0gY29uc3RyYWludA0KLQkgKiBAcGFyYW0gdGFyZ2V0DQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqIEBwYXJhbSBwcm9ibGVtTG9jYXRpb25zIGEgc2V0IG9mIHByb2JsZW0gbG9jYXRpb25zIG9yIGVtcHR5IHNldCBpZiBub25lOyBjYW5ub3QgYmUgbnVsbC48YnI+IA0KLQkgKiANCi0JICogQHNlZSBDb25zdHJhaW50U3RhdHVzI0NvbnN0cmFpbnRTdGF0dXMoSU1vZGVsQ29uc3RyYWludCwgRU9iamVjdCwgU3RyaW5nLCBTZXQpDQotCSAqLw0KLQlwdWJsaWMgQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkKGZpbmFsIElNb2RlbENvbnN0cmFpbnQgY29uc3RyYWludCwgZmluYWwgRU9iamVjdCB0YXJnZXQsIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBTZXQ8SVByb2JsZW1Mb2NhdGlvbj4gcHJvYmxlbUxvY2F0aW9ucykNCi0Jew0KLQkJc3VwZXIoY29uc3RyYWludCwgdGFyZ2V0LCBtZXNzYWdlLCBuZXcgSGFzaFNldDxFT2JqZWN0PigpKTsNCi0JCXRoaXMucHJvYmxlbUxvY2F0aW9ucyA9IHByb2JsZW1Mb2NhdGlvbnM7DQotCX0NCi0JDQotCXB1YmxpYyBTZXQ8SVByb2JsZW1Mb2NhdGlvbj4gZ2V0UHJvYmxlbUxvY2F0aW9ucygpDQotCXsNCi0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQodGhpcy5wcm9ibGVtTG9jYXRpb25zKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vaW1wbC9Qcm9ibGVtTG9jYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9pbXBsL1Byb2JsZW1Mb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YTU0Nzc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9pbXBsL1Byb2JsZW1Mb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5pbXBsOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5JUHJvYmxlbUxvY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUxvY2F0b3I7DQotDQotDQotcHVibGljIGNsYXNzIFByb2JsZW1Mb2NhdGlvbiBpbXBsZW1lbnRzIElQcm9ibGVtTG9jYXRpb24gDQotew0KLQlwcml2YXRlIGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZTsNCi0JcHJpdmF0ZSBmaW5hbCBJTG9jYXRvciBsb2NhdG9yOw0KLQkNCi0JcHVibGljIFByb2JsZW1Mb2NhdGlvbihJUmVzb3VyY2UgcmVzb3VyY2UsIElMb2NhdG9yIGxvY2F0b3IpIA0KLQl7DQotCQludWxsQ2hlY2tQYXJhbShyZXNvdXJjZSwgInJlc291cmNlIik7Ly8kTk9OLU5MUy0xJA0KLQkJDQotCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7DQotCQl0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOw0KLQl9DQotCQ0KLQlwdWJsaWMgSUxvY2F0b3IgZ2V0TG9jYXRvcigpIHsNCi0JCXJldHVybiBsb2NhdG9yOw0KLQl9DQotDQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7DQotCQlyZXR1cm4gcmVzb3VyY2U7DQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9tZXNzYWdlcy9WYWxpZGF0aW9uTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9tZXNzYWdlcy9WYWxpZGF0aW9uTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWI0YzFhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vbWVzc2FnZXMvVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLm1lc3NhZ2VzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOw0KLQ0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uTWVzc2FnZXMgZXh0ZW5kcyBOTFMNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5tZXNzYWdlcy5WYWxpZGF0aW9uTWVzc2FnZXMiOyAvLyROT04tTkxTLTEkDQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJvdHRvbVVwUHJvdmlkZXJHZW5lcmF0b3JfRmFpbGVkdG9Bbm5vdGF0ZTsNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQm90dG9tVXBQcm92aWRlckdlbmVyYXRvcl9GYWlsZWRUb0NvbGxlY3RNZXRob2RzOw0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCb3R0b21VcFByb3ZpZGVyR2VuZXJhdG9yX01ldGhvZE5vdFN1cHBvcnRlZDsNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQm90dG9tVXBQcm92aWRlckdlbmVyYXRvcl9Qcm9qZWN0Tm90QWNjZXNpYmxlOw0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFamIzVG9wRG93blByb3ZpZGVyR2VuZXJhdG9yX0luY29uc2lzdGVudE1ldGFkYXRhOw0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFamIzVG9wRG93blByb3ZpZGVyR2VuZXJhdG9yX0ludGVybmFsRXJyb3JJbnRlcmZhY2U7DQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVqYjNUb3BEb3duUHJvdmlkZXJHZW5lcmF0b3JfSW50ZXJuYWxFcnJvck9wZXJhdGlvbjsNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWpiM1RvcERvd25Qcm92aWRlckdlbmVyYXRvcl9JbnZhbGlkSW50ZXJmYWNlTWFwcGluZzsNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWpiM1RvcERvd25Qcm92aWRlckdlbmVyYXRvcl9NYXBwaW5nc0VtcHR5Ow0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm94eVdvcmthcm91bmRfVW5hYmxlVG9EZWxldGVQcm94eTsNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJveHlXb3JrYXJvdW5kX1VuYWJsZVRvUmVuYW1lUHJveHk7DQotCQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXc2RsMkphdmFHZW5lcmF0b3JfRXJyb3JEdXJpbmdHZW5lcmF0aW9uOw0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXc2RsMkphdmFHZW5lcmF0b3JfSW5jb3JyZWN0VVJMOw0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXc2RsMkphdmFHZW5lcmF0b3JfUGF0aEluYXBwcm9wcmlhdGU7DQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdzZGwySmF2YUdlbmVyYXRvcl9XU0RMRG93bmxvYWRFeGNlcHRpb247DQotDQotCS8qKiBNZXNzYWdlIGZvciBub3QgZXhpc3RpbmcgU0VJICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdzVmFsaWRhdGlvbl9TZWlEb2VzTm90RXhpc3RzOw0KLQ0KLQkvKiogTWVzc2FnZSBmb3Igbm9uIGV4aXN0aW5nIFdTREwgcmVmZXJlbmNlZCBieSB3c2RsTG9jYXRpb24gKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV3NWYWxpZGF0aW9uX1dzZGxEb2VzTm90RXhpc3RzOw0KLQkNCi0JLyoqIE9uIFNFSSBwb3J0TmFtZSwgc2VydmljZU5hbWUgYW5kIGVuZHBvaW50SW50ZXJmYWNlIHNob3VsZCBub3QgYmUgdXNlZCAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWlWYWxpZGF0aW9uX1JlZHVuZGFudEF0dHJpYnV0ZXM7DQotCQ0KLQkvKiogTWVzc2FnZSBmb3IgYWxyZWFkeSBleGlzdGluZyBtZXRob2QgbmFtZSBpbiBTRUkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2ViTWV0aG9kVmFsaWRhdGlvbl9OYW1lRXhpc3RzOw0KLQ0KLQkvKiogTWVzc2FnZSBmb3IgZXhjbHVkZWQgbWV0aG9kcyBpbnNpZGUgU0VJICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYk1ldGhvZFZhbGlkYXRpb25fTWV0aG9kU2hvdWxkTm90QmVFeGNsdWRlZDsJDQotCQ0KLQkvKiogRXhjbHVkZWQgbWV0aG9kIHNob3VsZCBjb250YWluIG9ubHkgZXhjbHVkZSBhdHRyaWJ1dGUgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2ViTWV0aG9kVmFsaWRhdGlvbl9FeGNsdWRlZEhhc090aGVyQXR0cmlidXRlczsNCi0JDQotCS8qKiBNZXNzYWdlIGZvciB1c2VkICduYW1lJyBhdHRyaWJ1dGUgd2hpbGUgU0VJIGlzIHJlZmVyZW5jZWQgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV3NWYWxpZGF0aW9uX05hbWVTaG91bGROb3RCZVVzZWRXaXRoU2VpOw0KLQkNCi0JLyoqIE1lc3NhZ2UgZm9yIGR1cGxpY2F0ZWQgd2ViIHBhcmFtZXRlciBuYW1lICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYlBhcmFtVmFsaWRhdGlvbl9OYW1lRXhpc3RzOw0KLQkNCi0JLyoqIEF0dHJpYnV0ZSAnbmFtZScgaXMgbm90IG5lZWRlZCBkdWUgdG8gY3VycmVudCBTT0FQQmluZGluZyBjb25maWd1cmF0aW9uICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYlBhcmFtVmFsaWRhdGlvbl9OYW1lUmVkdW5kYW50Ow0KLQkNCi0JLyoqIEF0dHJpYnV0ZSAnbmFtZScgaXMgcmVxdWlyZWQgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2ViUGFyYW1WYWxpZGF0aW9uX05hbWVSZXF1aXJlZDsNCi0JDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdzVmFsaWRhdGlvbl9Xc0Fubm90YXRpb25Pbk5vblNlc3Npb25CZWFuX0Vycm9yOw0KLQkNCi0NCi0Jc3RhdGljDQotCXsNCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFZhbGlkYXRpb25NZXNzYWdlcy5jbGFzcyk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL21lc3NhZ2VzL1ZhbGlkYXRpb25NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL21lc3NhZ2VzL1ZhbGlkYXRpb25NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYzc4M2EwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9tZXNzYWdlcy9WYWxpZGF0aW9uTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1Cb3R0b21VcFByb3ZpZGVyR2VuZXJhdG9yX0ZhaWxlZHRvQW5ub3RhdGU9RmFpbGVkIHRvIGFubm90YXRlIGNsYXNzDQotQm90dG9tVXBQcm92aWRlckdlbmVyYXRvcl9GYWlsZWRUb0NvbGxlY3RNZXRob2RzPUZhaWxlZCB0byBjb2xsZWN0IHN1cHBvcnRlZCBtZXRob2RzDQotQm90dG9tVXBQcm92aWRlckdlbmVyYXRvcl9NZXRob2ROb3RTdXBwb3J0ZWQ9TWV0aG9kIHswfSBpcyBub3QgaW4gdGhlIHN1cHBvcnRlZC4gV2ViIFNlcnZpY2UgYW5ub3RhdGlvbnMgY291bGQgbm90IGJlIGFkZGVkIHRvIGVuZHBvaW50DQotQm90dG9tVXBQcm92aWRlckdlbmVyYXRvcl9Qcm9qZWN0Tm90QWNjZXNpYmxlPVRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIElUeXBlIHByb3ZpZGVkIHNob3VsZCBiZSBhY2Nlc3NpYmxlDQotRWpiM1RvcERvd25Qcm92aWRlckdlbmVyYXRvcl9JbmNvbnNpc3RlbnRNZXRhZGF0YT1HZW5lcmF0ZWQgSVByb3ZpZGVyTWV0YWRhdGEgc2hvdWxkIGNvbnRhaW5zIElFbmRwb2luTWV0YWRhDQotRWpiM1RvcERvd25Qcm92aWRlckdlbmVyYXRvcl9JbnRlcm5hbEVycm9ySW50ZXJmYWNlPUludGVybmFsIGVycm9yLCBjb3VsZCBub3QgZmluZCByZWxhdGlvbiBiZXR3ZWVuIEludGVyZmFjZU1hcHBpbmc6IHswfSBhbmQgQ29uZmlndXJhdGlvbiBlbnRpdGllcw0KLUVqYjNUb3BEb3duUHJvdmlkZXJHZW5lcmF0b3JfSW50ZXJuYWxFcnJvck9wZXJhdGlvbj1JbnRlcm5hbCBlcnJvciwgY291bGQgbm90IGZpbmQgcmVsYXRpb24gYmV0d2VlbiBPcGVyYXRpb25NYXBwaW5nOiB7MH0gYW5kIENvbmZpZ3VyYXRpb24gZW50aXRpZXMgaW5zaWRlIEludGVyZmFjZURhdGE6IHsxfQ0KLUVqYjNUb3BEb3duUHJvdmlkZXJHZW5lcmF0b3JfSW52YWxpZEludGVyZmFjZU1hcHBpbmc9UmV0dXJuZWQgaW50ZXJmYWNlIG1hcHBpbmdzIGNvdWxkIG5vdCBiZSBudWxsIG9yIGVtcHR5IGFycmF5DQotRWpiM1RvcERvd25Qcm92aWRlckdlbmVyYXRvcl9NYXBwaW5nc0VtcHR5PVJldHVybmVkIG9wcGVyYXRpb24gbWFwcGluZ3MgZm9yIGludGVyZmFjZSBtYXBwaW5nIHswfSBjb3VsZCBub3QgYmUgbnVsbCBvciBlbXB0eSBhcnJheQ0KLVByb3h5V29ya2Fyb3VuZF9VbmFibGVUb0RlbGV0ZVByb3h5PVVuYWJsZSB0byBkZWxldGUgb3JpZ2luYWwgcHJveHkgc291cmNlIGZpbGU6IHswfQ0KLVByb3h5V29ya2Fyb3VuZF9VbmFibGVUb1JlbmFtZVByb3h5PVVuYWJsZSB0byByZW5hbWUgcGF0Y2hlZCBwcm94eSBzb3VyY2UgZmlsZSB0byBpdHMgb3JpZ2luYWwgbmFtZTogezB9DQotDQotV3NkbDJKYXZhR2VuZXJhdG9yX0Vycm9yRHVyaW5nR2VuZXJhdGlvbj1FcnJvciBkdXJpbmcgV1NETCB0byBKYXZhIGdlbmVyYXRpb24gDQotV3NkbDJKYXZhR2VuZXJhdG9yX0luY29ycmVjdFVSTD1JbmNvcnJlY3QgV1NETCBVUkwgc3ludGF4DQotV3NkbDJKYXZhR2VuZXJhdG9yX1BhdGhJbmFwcHJvcHJpYXRlPVBhdGggb2YgdGhlIGZpbGUgezB9IGlzbid0IGFwcHJvcHJpYXRlIHRvIGJ1aWxkIGFuIFVSTA0KLVdzZGwySmF2YUdlbmVyYXRvcl9XU0RMRG93bmxvYWRFeGNlcHRpb249RXhjZXB0aW9uIG9jdXJlZCBkdXJpbmcgV1NETCBkb3dubG9hZA0KLVdzVmFsaWRhdGlvbl9TZWlEb2VzTm90RXhpc3RzID0gVGhlIHNwZWNpZmllZCBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSB7MH0gZG9lcyBub3QgZXhpc3RzIG9yIG5vdCBhbm5vdGF0ZWQgY29ycmVjdGx5DQotV3NWYWxpZGF0aW9uX1dzZGxEb2VzTm90RXhpc3RzID0gVGhlIHNwZWNpZmllZCBXU0RMIGlzIGluY29ycmVjdCwgVVJMIHBhcnNpbmcgZXJyb3I6IHswfQ0KLVdzVmFsaWRhdGlvbl9OYW1lU2hvdWxkTm90QmVVc2VkV2l0aFNlaSA9IE5hbWUgYXR0cmlidXRlIHNob3VsZCBub3QgYmUgdXNlZCBpZiBTRUkgaXMgcmVmZXJlbmNlZCB2aWEgZW5kcG9pbnRJbnRlcmZhY2UgYXR0cmlidXRlDQotV3NWYWxpZGF0aW9uX1dzQW5ub3RhdGlvbk9uTm9uU2Vzc2lvbkJlYW5fRXJyb3IgPSBAV2ViU2VydmljZSBhbm5vdGF0aW9uIGluIEVKQiBtb2R1bGVzIGNhbiBiZSBvbmx5IHVzZWQgb24gc2Vzc2lvbiBiZWFucw0KLQ0KLVNlaVZhbGlkYXRpb25fUmVkdW5kYW50QXR0cmlidXRlcyA9IEBXZWJTZXJ2aWNlIGFubm90YXRpb24gc2hvdWxkIG5vdCBpbmNsdWRlIGF0dHJpYnV0ZXMgcG9ydE5hbWUsIHNlcnZpY2VOYW1lLCBlbmRwb2ludEludGVyZmFjZSBhbmQgd3NkbExvY2F0aW9uIHdoZW4gdXNlZCBvbiBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSANCi0NCi1XZWJNZXRob2RWYWxpZGF0aW9uX05hbWVFeGlzdHMJPSBXZWIgbWV0aG9kIHdpdGggbmFtZSB7MH0gYWxyZWFkeSBleGlzdHMNCi1XZWJNZXRob2RWYWxpZGF0aW9uX01ldGhvZFNob3VsZE5vdEJlRXhjbHVkZWQgPSBTZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSBtZXRob2RzIGNhbm5vdCBiZSBleGNsdWRlZA0KLVdlYk1ldGhvZFZhbGlkYXRpb25fRXhjbHVkZWRIYXNPdGhlckF0dHJpYnV0ZXMJPSBFeGNsdWRlZCBXZWIgbWV0aG9kIHNob3VsZCBub3QgY29udGFpbiBhdHRyaWJ1dGVzIG90aGVyIHRoYW4gZXhjbHVkZSBhdHRyaWJ1dGUgDQotDQotV2ViUGFyYW1WYWxpZGF0aW9uX05hbWVFeGlzdHMJPSBXZWIgcGFyYW1ldGVyIHdpdGggbmFtZSB7MH0gYWxyZWFkeSBleGlzdHMNCi1XZWJQYXJhbVZhbGlkYXRpb25fTmFtZVJlZHVuZGFudD0gTmFtZSBhdHRyaWJ1dGUgaXMgbm90IHVzZWQgaWYgU09BUEJpbmRpbmcuU3R5bGUgaXMgUlBDIGFuZCBwYXJ0TmFtZSBpcyBwcmVzZW50DQotV2ViUGFyYW1WYWxpZGF0aW9uX05hbWVSZXF1aXJlZCA9IEEgbmFtZSBzaG91bGQgYmUgc3BlY2lmaWVkIGlmIHRoZSBvcGVyYXRpb24gaXMgZG9jdW1lbnQgc3R5bGUsIHRoZSBwYXJhbWV0ZXIgc3R5bGUgaXMgQkFSRSwgYW5kIHRoZSBtb2RlIGlzIE9VVCBvciBJTk9VVApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9FbmRwb2ludFR5cGVWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9FbmRwb2ludFR5cGVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmNiYmQ5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvRW5kcG9pbnRUeXBlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlcjsNCi0NCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZU1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZVBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnZhbGlkYXRpb24ucHJvdmlkZXIuVHlwZUFkYXB0ZXI7DQotDQotLyoqDQotICogUHJvdmlkZXMgdHlwZSB2YWxpZGF0aW9uIGZvciBjbGFzcyBpbnRlZGVudCB0byBiZSB1c2VkIGFzIGFuIGVuZHBvaW50IGluDQotICogV2ViU2VydmljZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotDQotcHVibGljIGNsYXNzIEVuZHBvaW50VHlwZVZhbGlkYXRvciB7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWSA9ICIiOyAvLyROT04tTkxTLTEkDQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5BTFlaRV9NRVRIT0RfTkFNRSA9ICJmaW5hbGl6ZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIFZhbGlkYXRlcyA8dHQ+dHlwZTwvdHQ+IGlmIGlzIGNhcHBhYmxlIHRvIGJlIHVzZWQgYXMgZW5kcG9pbnQuIFR5cGUgdXNlZA0KLQkgKiBhcyBFbmRwb2ludCBzaG91bGQgZnVsZmlsIGZvbGxvd2luZyByZXF1aXJlbWVudHM6DQotCSAqIA0KLQkgKiA8cHJlPg0KLQkgKiAgMS4gTXVzdCBiZSBhIHNvdXJjZSB0eXBlDQotCSAqICAyLiBNdXN0IGJlIHB1YmxpYw0KLQkgKiAgMy4gU2hvdWxkIG5vdCBiZSBhbiBpbnRlcmZhY2UNCi0JICogIDQuIFNob3VsZCBub3QgYmUgYW4gYWJzdHJhY3QgY2xhc3MNCi0JICogIDUuIFNob3VsZCBub3QgYmUgZmluYWwNCi0JICogIDYuIFNob3VsZCBwcm92aWRlIGRlZmF1bHQgY29uc3RydWN0b3INCi0JICogIDcuIFNob3VsZCBub3QgZGVjbGFyZSBmaW5hbHl6ZSgpIG1ldGhvZA0KLQkgKiA8L3ByZT4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlDQotCSAqIEByZXR1cm4gSVN0YXR1cyBvYmplY3QgLSBpbiBjYXNlIDx0dD50eXBlPC90dD4gY2FuIGJlIHVzZWQgYXMgZW5kcG9pbnQNCi0JICogICAgICAgICB0aGUge0BsaW5rIElTdGF0dXMjZ2V0U2V2ZXJpdHkoKX0gd2lsbCByZXR1cm4ge0BsaW5rIElTdGF0dXMjT0t9LA0KLQkgKiAgICAgICAgIGVsc2Uge0BsaW5rIElTdGF0dXMjRVJST1J9IGlzIHJldHVybmVkIGFuZA0KLQkgKiAgICAgICAgIHtAbGluayBJU3RhdHVzI2dldE1lc3NhZ2UoKX0gd2lsbCByZXR1cm4gcmVhZGFibGUgbWVzc2FnZQ0KLQkgKiAgICAgICAgIGRlc2NyaWJpbmcgdGhlIGNvbmRpdGlvbiB0aGF0IGlzIG5vdCBmdWxmaWxlZC4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KLQkJVHlwZUFkYXB0ZXIgdHlwZUFkYXB0ZXIgPSBuZXcgVHlwZUFkYXB0ZXIodHlwZSk7DQotCQlTdHJpbmcgdHlwZU5hbWUgPSB0eXBlQWRhcHRlci5nZXRRdWFsaWZpZWROYW1lKCk7DQotDQotCQlpZiAodHlwZS5pc0JpbmFyeSgpKSB7DQotCQkJcmV0dXJuIHByZXBhcmVTdGF0dXMoDQotCQkJCQlNZXNzYWdlRm9ybWF0DQotCQkJCQkJCS5mb3JtYXQoDQotCQkJCQkJCQkJSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfQklOQVJZQ0xBU1MsDQotCQkJCQkJCQkJdHlwZU5hbWUpLA0KLQkJCQkJbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigNCi0JCQkJCQkJTWVzc2FnZUZvcm1hdA0KLQkJCQkJCQkJCS5mb3JtYXQoDQotCQkJCQkJCQkJCQkiQ2xhc3MgezB9IGlzIGJpbmFyeSBjbGFzcyBhbmQgY2Fubm90IGJlIGFubm90YXRlZCIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJCXR5cGVOYW1lKSkpOw0KLQkJfQ0KLQ0KLQkJaWYgKCF0eXBlQWRhcHRlci5pc1B1YmxpYygpKSB7DQotCQkJcmV0dXJuIHByZXBhcmVTdGF0dXMoTWVzc2FnZUZvcm1hdA0KLQkJCQkJLmZvcm1hdCgNCi0JCQkJCQkJSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfTk9UUFVCTElDLA0KLQkJCQkJCQl0eXBlTmFtZSksDQotCQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KLQkJCQkJCQlNZXNzYWdlRm9ybWF0DQotCQkJCQkJCQkJLmZvcm1hdCgNCi0JCQkJCQkJCQkJCSJDbGFzcyB7MH0gaXMgbm90IHB1YmxpYyBhbmQgY2Fubm90IGJlIHVzZWQgYXMgd2ViIHNlcnZpY2UgZW5kcG9pbnQiLCAvLyROT04tTkxTLTEkDQotCQkJCQkJCQkJCQl0eXBlTmFtZSkpKTsNCi0JCX0NCi0NCi0JCWlmICghdHlwZUFkYXB0ZXIuZ2V0VHlwZSgpLmlzQ2xhc3MoKSkgew0KLQkJCXJldHVybiBwcmVwYXJlU3RhdHVzKE1lc3NhZ2VGb3JtYXQNCi0JCQkJCS5mb3JtYXQoDQotCQkJCQkJCUpheFdzRG9tUnVudGltZU1lc3NhZ2VzLkVuZHBvaW50VHlwZVZhbGlkYXRvcl9FUlJfTVNHX05PVENMQVNTLA0KLQkJCQkJCQl0eXBlTmFtZSksDQotCQkJCQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oDQotCQkJCQkJCQkJTWVzc2FnZUZvcm1hdA0KLQkJCQkJCQkJCQkJLmZvcm1hdCgNCi0JCQkJCQkJCQkJCQkJInswfSBpcyBub3QgYSBjbGFzcyIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJCQkJdHlwZU5hbWUpKSk7DQotCQl9DQotDQotCQlpZiAodHlwZUFkYXB0ZXIuaXNBYnN0cmFjdCgpKSB7DQotCQkJcmV0dXJuIHByZXBhcmVTdGF0dXMoTWVzc2FnZUZvcm1hdA0KLQkJCQkJLmZvcm1hdCgNCi0JCQkJCQkJSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfQUJTVFJBQ1QsDQotCQkJCQkJCXR5cGVOYW1lKSwNCi0JCQkJCQkJbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigNCi0JCQkJCQkJCQlNZXNzYWdlRm9ybWF0DQotCQkJCQkJCQkJCQkuZm9ybWF0KA0KLQkJCQkJCQkJCQkJCQkiQ2xhc3MgezB9IGlzIGFic3RyYWN0IiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkJCQkJCQl0eXBlTmFtZSkpKTsNCi0JCX0NCi0NCi0JCWlmICh0eXBlQWRhcHRlci5pc0ZpbmFsKCkpIHsNCi0JCQlyZXR1cm4gcHJlcGFyZVN0YXR1cyhNZXNzYWdlRm9ybWF0DQotCQkJCQkuZm9ybWF0KA0KLQkJCQkJCQlKYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5FbmRwb2ludFR5cGVWYWxpZGF0b3JfRVJSX01TR19GSU5BTCwNCi0JCQkJCQkJdHlwZU5hbWUpLA0KLQkJCQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KLQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQNCi0JCQkJCQkJCQkJCS5mb3JtYXQoDQotCQkJCQkJCQkJCQkJCSJDbGFzcyB7MH0gaXMgZmluYWwgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIHdlYiBzZXJ2aWNlIGVuZHBvaW50IiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkJCQkJCQl0eXBlTmFtZSkpKTsNCi0JCX0NCi0NCi0JCWlmICghdHlwZUFkYXB0ZXIuaGFzRGVmYXVsdENvbnN0cnVjdG9yKCkpIHsNCi0JCQlyZXR1cm4gcHJlcGFyZVN0YXR1cyhNZXNzYWdlRm9ybWF0DQotCQkJCQkuZm9ybWF0KA0KLQkJCQkJCQlKYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5FbmRwb2ludFR5cGVWYWxpZGF0b3JfRVJSX01TR19DT05TVFJVQ1RPUiwNCi0JCQkJCQkJdHlwZU5hbWUpLA0KLQkJCQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KLQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQNCi0JCQkJCQkJCQkJCS5mb3JtYXQoDQotCQkJCQkJCQkJCQkJCSJDbGFzcyB7MH0gZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IiLCAvLyROT04tTkxTLTEkDQotCQkJCQkJCQkJCQkJCXR5cGVOYW1lKSkpOw0KLQkJfQ0KLQ0KLQkJaWYgKGhhc0ZpbmFseXplTWV0aG9kKHR5cGUpKSB7DQotCQkJcmV0dXJuIHByZXBhcmVTdGF0dXMoTWVzc2FnZUZvcm1hdA0KLQkJCQkJLmZvcm1hdCgNCi0JCQkJCQkJSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfSEFTRklOQUxZWkUsDQotCQkJCQkJCXR5cGVOYW1lKSwNCi0JCQkJCQkJbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigNCi0JCQkJCQkJCQlNZXNzYWdlRm9ybWF0DQotCQkJCQkJCQkJCQkuZm9ybWF0KA0KLQkJCQkJCQkJCQkJCQkiQ2xhc3MgezB9IGNvbnRhaW5zIGZpbmFsaXplKCkgbWV0aG9kIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyB3ZWIgc2VydmljZSBlbmRwb2ludCIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJCQkJdHlwZU5hbWUpKSk7DQotCQl9DQotDQotCQlyZXR1cm4gcHJlcGFyZVN0YXR1cyhudWxsLCBudWxsKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIGlmIHR5cGUgY29udGFpbnMgZmluYWx5emUoKSBtZXRob2QNCi0JICogDQotCSAqIEBwYXJhbSB0eXBlDQotCSAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiBoYXMgZmluYWx5emUgbWV0aG9kDQotCSAqLw0KLQlwcml2YXRlIGJvb2xlYW4gaGFzRmluYWx5emVNZXRob2QoSVR5cGUgdHlwZSkgew0KLQkJSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZChGSU5BTFlaRV9NRVRIT0RfTkFNRSwgbmV3IFN0cmluZ1swXSk7DQotCQlpZiAobWV0aG9kID09IG51bGwpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlpZiAobWV0aG9kLmV4aXN0cygpKSB7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIFByZXBhcmVzIElTdGF0dXMgaW5zdGFuY2UuIElmIDxjb2RlPmVycm9yTWVzc2FnZTwvY29kZT4gaXMNCi0JICogPGNvZGU+bnVsbDwvY29kZT4gSVN0YXR1cy5PSyBpcyBzZXQgdG8gdGhlIElTdGF0dXMgb2JqZWN0IGVsc2UgdGhlIHN0YXR1cw0KLQkgKiBpcyBJU3RhdHVzLkVSUk9SLg0KLQkgKiANCi0JICogQHBhcmFtIGVycm9yTWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGJlIHVzZWQNCi0JICogQHJldHVybiBhbHdheXMgcmV0dXJucyBhbiB2YWxpZCBJTWV0aG9kQXVkaXQgaW5zdGFuY2UuDQotCSAqLw0KLQlwcml2YXRlIElTdGF0dXMgcHJlcGFyZVN0YXR1cyhTdHJpbmcgbG9jYWxpemVkTWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwaW9uKSB7DQotCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoKGxvY2FsaXplZE1lc3NhZ2UgPT0gbnVsbCkgPyBJU3RhdHVzLk9LDQotCQkJCTogSVN0YXR1cy5FUlJPUiwgSmF4V3NEb21SdW50aW1lUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywNCi0JCQkJKGxvY2FsaXplZE1lc3NhZ2UgPT0gbnVsbCkgPyBFTVBUWSA6IGxvY2FsaXplZE1lc3NhZ2UsIGV4Y2VwaW9uKTsNCi0NCi0JCXJldHVybiBzdGF0dXM7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL01ldGhvZFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL01ldGhvZFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYzlkNDA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9NZXRob2RWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkZsYWdzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5QcmltaXRpdmVUeXBlSGFuZGxlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLlR5cGVSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC52YWxpZGF0aW9uLnByb3ZpZGVyLlR5cGVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLkNvbnN0cnVjdG9yTm90RXhwb3NhYmxlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLkluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuTWV0aG9kTm90UHVibGljRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIFBlcmZvcm1lcyBtZXRob2QgdmFsaWRhdGlvbiBieSB2YWxpZGF0aW5nIHR5cGVzIHVzZWQuIFR5cGVzIGFyZSBjYWNoZWQgYmV0d2VlbiBkaWZmZXJlbnQgaW52b2NhdGlvbnMgb2YgY2hlY2soSU1ldGhvZCBtZXRob2QpIGZvciBiZXR0ZXINCi0gKiBwZXJmb3JtYW5jZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIE1ldGhvZFZhbGlkYXRvcg0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVNUFRZID0gIiI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JcHJpdmF0ZSBmaW5hbCBSdW50aW1lVHlwZVZhbGlkYXRvciB2YWxpZGF0b3I7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvci4NCi0JICovDQotCXB1YmxpYyBNZXRob2RWYWxpZGF0b3IoKQ0KLQl7DQotCQl2YWxpZGF0b3IgPSBuZXcgUnVudGltZVR5cGVWYWxpZGF0b3IoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUGVyZm9ybXMgY2hlY2sgb24gdHlwZXMgdXNlZCBpbiBtZXRob2QuIENoZWNrcyByZXR1cm4gdHlwZXMsIHBhcmFtZXRoZXIgdHlwZXMgYW5kIGV4Y2VwdGlvbiB0eXBlcy4gU3RvcHMgdmFsaWRhdGlvbiBvbiB0aGUgZmlyc3QgZXJyb3IuIEFuDQotCSAqIElTdGF0dXMgb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gb24gdGhlIHJlc3VsdCBvZiB0aGUgY2hlY2sgaXMgcmV0dXJuZWQuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWV0aG9kDQotCSAqIEByZXR1cm4gSVN0YXR1cyB3aXRoIHNldmVyaXR5IElTdGF0dXMuT0sgaWYgdGhlIG1ldGhvZCBjYW4gYmUgZXhwb3NlZCwgb3IgSVN0YXR1cy5FUlJPUiBpbmNsdWRpbmcgZXJyb3IgbWVzc2FnZSBkZWNyaWJpbmcgdGhlIHByb2JsZW0uDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gLQ0KLQkgKiAgICAgICAgICAgICBpbiBjYXNlIDxjb2RlPm1ldGhvZDwvY29kZT4gaXMgbnVsbA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIElTdGF0dXMgY2hlY2soSU1ldGhvZCBtZXRob2QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpCXsNCi0JCQlyZXR1cm4gcHJlcGFyZVN0YXR1cyhuZXcgQ29uc3RydWN0b3JOb3RFeHBvc2FibGVFeGNlcHRpb24obWV0aG9kLmdldEVsZW1lbnROYW1lKCkpKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgSVR5cGUgZGVjbGFyaW5nVHlwZSA9IG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCk7DQotDQotCQlpZiAoIUZsYWdzLmlzUHVibGljKG1ldGhvZC5nZXRGbGFncygpKSAmJiAhZGVjbGFyaW5nVHlwZS5pc0ludGVyZmFjZSgpKQl7DQotCQkJcmV0dXJuIHByZXBhcmVTdGF0dXMobmV3IE1ldGhvZE5vdFB1YmxpY0V4Y2VwdGlvbihtZXRob2QuZ2V0RWxlbWVudE5hbWUoKSkpOw0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJLy8gSGFuZGxlIHJldHVybiB0eXBlDQotCQkJdmFsaWRhdGVSdW50aW1lQ2xhc3MobWV0aG9kLmdldFJldHVyblR5cGUoKSwgZGVjbGFyaW5nVHlwZSk7DQotDQotCQkJLy8gSGFuZGxlIGlucHV0IHBhcmFtZXRlcnMgYW5kIHRoZXJlIHR5cGVzDQotCQkJZm9yIChTdHJpbmcgcGFyYW1UeXBlTmFtZSA6IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpKQ0KLQkJCXsNCi0JCQkJdmFsaWRhdGVSdW50aW1lQ2xhc3MocGFyYW1UeXBlTmFtZSwgZGVjbGFyaW5nVHlwZSk7DQotCQkJfQ0KLQ0KLQkJCS8vIGhhbmRsZSBleGNlcHRpb24gdHlwZXMNCi0JCQlmb3IgKFN0cmluZyBleGNlcHRpb25UeXBlTmFtZSA6IG1ldGhvZC5nZXRFeGNlcHRpb25UeXBlcygpKQ0KLQkJCXsNCi0JCQkJdmFsaWRhdGVFeGNlcHRpb24oZXhjZXB0aW9uVHlwZU5hbWUsIGRlY2xhcmluZ1R5cGUpOw0KLQkJCX0NCi0NCi0JCQlyZXR1cm4gcHJlcGFyZVN0YXR1cyhudWxsKTsNCi0JCX0gY2F0Y2ggKEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlyZXR1cm4gcHJlcGFyZVN0YXR1cyhlKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogVmFsaWRhdGVzIDxjb2RlPnR5cGVOYW1lPC9jb2RlPi4gT24gZmlyc3Qgc3RlcHMgdHlwZSBpcyByZXNvbHZlZCBhbmQgYWxsIHJlc29sdmVkIHR5cGVzIGFyZSB2YWxpZGF0ZWQgb25lIGJ5IG9uZS4gVGhlIHJlc29sdmVkIHR5cGVzIGNhbiBiZQ0KLQkgKiBtb3JlIHRoYW4gb25lIGluIGNhc2UgdGhlIHR5cGUgZGVjbGFyYXRpb24gdXNlcyBnZW5lcmljcy4gVmFsaWRhdGlvbiBwcm9wYWdhdGVzIHRoZSBleGNlcHRpb25zIHRocm93biBieSBSdW50aW1lVHlwZVZhbGlkYXRvci4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlTmFtZQ0KLQkgKiBAcGFyYW0gZGVjbGFyaW5nVHlwZQ0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24NCi0JICovDQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVJ1bnRpbWVDbGFzcyhTdHJpbmcgdHlwZU5hbWUsIElUeXBlIGRlY2xhcmluZ1R5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24NCi0Jew0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzID0gVHlwZVJlc29sdmVyLnJlc29sdmVUeXBlcyh0eXBlTmFtZSwgZGVjbGFyaW5nVHlwZSk7DQotCQlmb3IgKFN0cmluZyBuYW1lIDogbmFtZXMpDQotCQl7DQotCQkJaWYgKFByaW1pdGl2ZVR5cGVIYW5kbGVyLmlzVm9pZFR5cGUobmFtZSkpDQotCQkJew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotDQotCQkJdmFsaWRhdG9yLnZhbGlkYXRlKFR5cGVGYWN0b3J5LmNyZWF0ZShuYW1lLCBkZWNsYXJpbmdUeXBlKSk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFZhbGlkYXRlcyBpZiA8dHQ+ZXhjZXB0aW9uVHlwZTwvdHQ+IGlzIGEgdmFsaWQgZXhjZXB0aW9uIHR5cGUgZm9yIFdTIG9wZXJhdGlvbg0KLQkgKiANCi0JICogQHBhcmFtIGV4Y2VwdGlvblR5cGUgLQ0KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0eXBlIG5hbWUNCi0JICogQHBhcmFtIGRlY2xhcmluZ1R5cGUgLQ0KLQkgKiAgICAgICAgICAgIHR5cGUgaW4gd2hpY2ggaXQgaXMgdXNlZA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgZXhjZXB0aW9uVHlwZSwgZmluYWwgSVR5cGUgZGVjbGFyaW5nVHlwZSkgdGhyb3dzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmcgZXhGUU5hbWUgPSBUeXBlUmVzb2x2ZXIucmVzb2x2ZVR5cGUoU2lnbmF0dXJlLnRvU3RyaW5nKGV4Y2VwdGlvblR5cGUpLCBkZWNsYXJpbmdUeXBlKTsNCi0NCi0JCXZhbGlkYXRvci52YWxpZGF0ZShUeXBlRmFjdG9yeS5jcmVhdGUoZXhGUU5hbWUsIGRlY2xhcmluZ1R5cGUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUHJlcGFyZXMgSU1ldGhvZEF1ZGl0IGluc3RhbmNlIGZvciA8Y29kZT5tZXRob2Q8L2NvZGU+LiBJZiA8Y29kZT50aHJvd2FibGU8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+IElTdGF0dXMuT0sgaXMgc2V0IHRvIHRoZSBJU3RhdHVzDQotCSAqIG9iamVjdCBjb250YWluZWQgaW4gcmV0dXJuZWQgSU1ldGhvZEF1ZGl0IGluc3RhbmNlIGVsc2UgSVN0YXR1cy5FUlJPUiBpcyBzZXQuDQotCSAqIA0KLQkgKiBAcGFyYW0gdGhyb3dhYmxlDQotCSAqIEByZXR1cm4gYWx3YXlzIHJldHVybnMgYW4gdmFsaWQgSU1ldGhvZEF1ZGl0IGluc3RhbmNlLg0KLQkgKi8NCi0JcHJpdmF0ZSBJU3RhdHVzIHByZXBhcmVTdGF0dXMoVGhyb3dhYmxlIHRocm93YWJsZSkNCi0Jew0KLQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKCh0aHJvd2FibGUgPT0gbnVsbCkgPyBJU3RhdHVzLk9LIDogSVN0YXR1cy5FUlJPUiwgSmF4V3NEb21SdW50aW1lUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywNCi0JCQkJCQkJCQkJKHRocm93YWJsZSA9PSBudWxsKSA/IEVNUFRZIDogdGhyb3dhYmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgdGhyb3dhYmxlKTsNCi0NCi0JCXJldHVybiBzdGF0dXM7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL1J1bnRpbWVUeXBlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvUnVudGltZVR5cGVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmVkYjEyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvUnVudGltZVR5cGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5HZW5lcmFsVHlwZXNOYW1lczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLlByaW1pdGl2ZVR5cGVIYW5kbGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuVHlwZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwudmFsaWRhdGlvbi5wcm92aWRlci5UeXBlQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnZhbGlkYXRpb24ucHJvdmlkZXIuVHlwZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuQWJzdHJhY3RDbGFzc05vdEltcGxlbWVudGVkRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLkluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuSW50ZXJmYWNlc05vdFN1cHBvcnRlZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuZXhjZXB0aW9ucy5Ob0RlZmF1bHRDb25zdHJ1Y3RvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuZXhjZXB0aW9ucy5UeXBlTm90Rm91bmRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotDQotLyoqDQotICogUHJvdmlkZXMgdHlwZSB2YWxpZGF0aW9uIGZvciBjbGFzcyBpbnRlZGVudCB0byBiZSB1c2VkIGFzIGFuIHJ1bnRpbWUgY2xhc3NlcyBpbiBXZWJTZXJ2aWNlLlJ1bnRpbWUgY2xhc3NlcyBzaG91bGQgZnVsZmlsIGZvbGxvd2luZyByZXF1aXJlbWVudHM6PGJyPg0KLSAqIDx1bD4NCi0gKiAxLiBTaG91bGQgcHJvdmlkZSBkZWZhdWx0IGNvbnN0cnVjdG9yPGJyPg0KLSAqIDIuIFNob3VsZCBub3QgaW1wbGVtZW50IGphdmEucm1pLlJlbW90ZTxicj4NCi0gKiAzLiBJZiBpdCBpcyBhIGphdmEuKiB0eXBlIHNob3VsZCBiZSBvbmUgb2YgYWxsb3dlZCBqYXZhIHR5cGVzPGJyPg0KLSAqIDQuIENsYXNzIHNob3VsZCBub3QgY29udGFpbiBpbm5lciBjbGFzc2VzIHRoYXQgYXJlIG5vdCBwdWJsaWMgc3RhdGljLjxicj4NCi0gKiA1LiBTaG91bGQgbm90IGhhdmUgJ211bHR5IGluaGVyaXRhbmNlJy4gVGhpcyBtZWFucyBpZiBjbGFzcyBleHRlbmRzIGNsYXNzIG90aGVyIHRoYW4gamF2YS5sYW5nLk9iamVjdCBpdCBzaG91bGQgbm90IGltcGxlbWVudCBpbnRlcmZhY2UuIEluIG9wb3NpdGUNCi0gKiBpZiB0aGUgY2xhc3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGl0IHNob3VsZCBpbXBsZW1lbnQgb25seSBvbmUgaW50ZXJmYWNlLiBGb2xsb3dpbmcgaW50ZXJmYWNlcyBhcmUgbm90IGNoZWNrZWQ6PGJyPg0KLSAqIDxicj4NCi0gKiANCi0gKiA8dWw+DQotICogamF2YS5sYW5nLkNvbXBhcmFibGU8YnI+DQotICogamF2YS5sYW5nLkNsb25hYmxlPGJyPg0KLSAqIGphdmEuaW8uU2VyaWFsaXphYmxlDQotICogPC91bD4NCi0gKiA8L3VsPg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUnVudGltZVR5cGVWYWxpZGF0b3IgZXh0ZW5kcyBUeXBlVmFsaWRhdG9yDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RSQU5TSUVOVF9BTk5PVEFUSU9OID0gImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHJhbnNpZW50IjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RSQU5TSUVOVF9BTk5PVEFUSU9OX1NIT1JUID0gIlhtbFRyYW5zaWVudCI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UWVBFX0FOTk9UQVRJT04gPSAiamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0ZBVUxUX0FOTk9UQVRJT04gPSAiamF2YXgueG1sLndzLldlYkZhdWx0IjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUID0gImdldCI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9GQUNUT1JZID0gIk9iamVjdEZhY3RvcnkiOyAvLyROT04tTkxTLTEkDQotCQ0KLQ0KLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUID0gInNldCI7DQotDQotCQ0KLQlwcml2YXRlIElBbm5vdGF0aW9uSW5zcGVjdG9yIGFubm90YXRpb25JbnNwZWN0b3IgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogUHJvdmlkZXMgdHlwZSB2YWxpZGF0aW9uIGZvciBjbGFzcyBpbnRlZGVudCB0byBiZSB1c2VkIGFzIGFuIHJ1bnRpbWUgY2xhc3NlcyBpbiBXZWJTZXJ2aWNlLlJ1bnRpbWUgY2xhc3NlcyBzaG91bGQgZnVsZmlsIGZvbGxvd2luZw0KLQkgKiByZXF1aXJlbWVudHM6PGJyPg0KLQkgKiA8dWw+DQotCSAqIDEuIFNob3VsZCBwcm92aWRlIGRlZmF1bHQgY29uc3RydWN0b3I8YnI+DQotCSAqIDIuIFNob3VsZCBub3QgaW1wbGVtZW50IGphdmEucm1pLlJlbW90ZTxicj4NCi0JICogMy4gSWYgaXQgaXMgYSBqYXZhLiogdHlwZSBzaG91bGQgYmUgb25lIG9mIGFsbG93ZWQgamF2YSB0eXBlczxicj4NCi0JICogNC4gQ2xhc3Mgc2hvdWxkIG5vdCBjb250YWluIGlubmVyIGNsYXNzZXMgdGhhdCBhcmUgbm90IHB1YmxpYyBzdGF0aWMuPGJyPg0KLQkgKiA1LiBTaG91bGQgbm90IGhhdmUgJ211bHR5IGluaGVyaXRhbmNlJy4gVGhpcyBtZWFucyBpZiBjbGFzcyBleHRlbmRzIGNsYXNzIG90aGVyIHRoYW4gamF2YS5sYW5nLk9iamVjdCBpdCBzaG91bGQgbm90IGltcGxlbWVudCBpbnRlcmZhY2UuIEluDQotCSAqIG9wb3NpdGUgaWYgdGhlIGNsYXNzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpdCBzaG91bGQgaW1wbGVtZW50IG9ubHkgb25lIGludGVyZmFjZS4gRm9sbG93aW5nIGludGVyZmFjZXMgYXJlIG5vdCBjaGVja2VkOjxicj4NCi0JICogPGJyPg0KLQkgKiANCi0JICogPHVsPg0KLQkgKiBqYXZhLmxhbmcuQ29tcGFyYWJsZTxicj4NCi0JICogamF2YS5sYW5nLkNsb25hYmxlPGJyPg0KLQkgKiBqYXZhLmlvLlNlcmlhbGl6YWJsZQ0KLQkgKiA8L3VsPg0KLQkgKiA8L3VsPg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGUgLQ0KLQkgKiAgICAgICAgICAgIGNoZWNrZWQgdHlwZQ0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24NCi0JICogQHNlZSBUeXBlVmFsaWRhdG9yIGZvciBsaXN0IG9mIGFsbG93ZWQgamF2YSB0eXBlcy4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCBkb1ZhbGlkYXRlKFR5cGVBZGFwdGVyIHR5cGUpIHRocm93cyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgU3RyaW5nIHR5cGVOYW1lID0gdHlwZS5nZXRRdWFsaWZpZWROYW1lKCk7DQotDQotCQkvLyBjaGVjayBmb3IgdHlwZXMgZnJvbSBqYXZhLiogcGFja2FnZXMNCi0JCWlmIChpc0phdmFUeXBlKHR5cGVOYW1lKSkNCi0JCXsNCi0JCQlpZiAoaXNBbGxvd2VkSmF2YVR5cGUodHlwZU5hbWUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWlmIChGbGFncy5pc0VudW0odHlwZS5nZXRUeXBlKCkuZ2V0RmxhZ3MoKSkpDQotCQl7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQ0KLQkJaWYgKGlzWG1sQW5ub3RhdGVkKHR5cGUuZ2V0VHlwZSgpKSkNCi0JCXsNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCWlmIChoYXNPYmplY3RGYWN0b3J5TWV0aG9kKHR5cGUuZ2V0VHlwZSgpKSkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0NCi0JCWlmICh0eXBlLmlzSW50ZXJmYWNlKCkpDQotCQl7DQotCQkJdGhyb3cgbmV3IEludGVyZmFjZXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24odHlwZU5hbWUpOw0KLQkJfQ0KLQ0KLQkJaWYgKGlzRXh0ZW5kaW5nQ29sbGVjdGlvbk9yTWFwKHR5cGUpKQ0KLQkJew0KLQkJCXJldHVybjsNCi0JCX0NCi0NCi0JCWlmICghdHlwZS5oYXNEZWZhdWx0Q29uc3RydWN0b3IoKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTm9EZWZhdWx0Q29uc3RydWN0b3JFeGNlcHRpb24odHlwZU5hbWUpOw0KLQkJfQ0KLQ0KLQkJY2hlY2tSZW1vdGVOb3RJbXBsZW1lbnRlZCh0eXBlKTsNCi0JCWNoZWNrTXVsdGlwbGVJbmhlcml0YW5jZSh0eXBlKTsNCi0JCWNoZWNrRm9ySW5hZG1pc3NhYmxlSW5uZXJDbGFzc2VzKHR5cGUpOw0KLQkJY2hlY2tBYnN0cmFjdE5vdEltcGxlbWVudGVkKHR5cGUpOw0KLQkJY2hlY2tQdWJsaWNBdHRyaWJ1dGVzKHR5cGUpOw0KLQkJY2hlY2tUeXBlc1VzZWRJblByb3BlcnRpZXModHlwZSk7DQotCX0NCi0JDQotCXByaXZhdGUgYm9vbGVhbiBoYXNPYmplY3RGYWN0b3J5TWV0aG9kKGZpbmFsIElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCWlmICh0eXBlLmdldEphdmFQcm9qZWN0KCk9PW51bGwpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCWZpbmFsIFN0cmluZyBwYWNrID0gdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOw0KLQkJZmluYWwgU3RyaW5nIG9iamVjdEZhY3RvcnlGUU5hbWUgPSBwYWNrLmxlbmd0aCgpPT0wID8gT0JKRUNUX0ZBQ1RPUlkgOiBwYWNrICsgJy4nICsgT0JKRUNUX0ZBQ1RPUlk7DQotCQkNCi0JCWZpbmFsIElUeXBlIG9iamVjdEZhY3RvcnkgPSB0eXBlLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUob2JqZWN0RmFjdG9yeUZRTmFtZSk7DQotCQlpZiAob2JqZWN0RmFjdG9yeSA9PSBudWxsKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJaWYgKGNvbnRhaW5zQ3JlYXRlTWV0aG9kKG9iamVjdEZhY3RvcnksIHR5cGUpKSB7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCXByaXZhdGUgYm9vbGVhbiBjb250YWluc0NyZWF0ZU1ldGhvZChmaW5hbCBJVHlwZSBvYmplY3RGYWN0b3J5LCBmaW5hbCBJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsJCQ0KLQkJZm9yIChJTWV0aG9kIG1ldGhvZCA6IG9iamVjdEZhY3RvcnkuZ2V0TWV0aG9kcygpKSANCi0JCXsNCi0JCQlpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJDQotCQkJZm9yIChTdHJpbmcgbmFtZSA6IFR5cGVSZXNvbHZlci5yZXNvbHZlVHlwZXMobWV0aG9kLmdldFJldHVyblR5cGUoKSwgdHlwZSkpIHsNCi0JCQkJaWYgKHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKG5hbWUpKSB7DQotCQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVja3MgaWYgPGNvZGU+dHlwZTwvY29kZT4gaXMgYW5ub3RhdGVkIHdpdGggYW5ub3RhdGlvbiBhZmZlY3RpbmcgbWFwcGluZyB0byBYTUwuIA0KLQkgKiBBbHdheXMgcmV0dXJucyBmYWxzZSBpbiBjYXNlIDxjb2RlPnR5cGU8L2NvZGU+IGlzIGJpbmFyeSBjbGFzcy4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlDQotCSAqIEByZXR1cm4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCSAqLw0KLQlwcml2YXRlIGJvb2xlYW4gaXNYbWxBbm5vdGF0ZWQoSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAodHlwZS5pc0JpbmFyeSgpKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJYW5ub3RhdGlvbkluc3BlY3RvciA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IodHlwZSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gdHlwZUFubm90YXRpb24gPSBhbm5vdGF0aW9uSW5zcGVjdG9yLmluc3BlY3RUeXBlKFhNTF9UWVBFX0FOTk9UQVRJT04pOw0KLQkJaWYgKHR5cGVBbm5vdGF0aW9uIT1udWxsKSB7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQkNCi0JCXR5cGVBbm5vdGF0aW9uID0gYW5ub3RhdGlvbkluc3BlY3Rvci5pbnNwZWN0VHlwZShXRUJfRkFVTFRfQU5OT1RBVElPTik7DQotCQlpZiAodHlwZUFubm90YXRpb24hPW51bGwpIHsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUGVyZm9ybXMgY2hlY2sgb24gcHVibGljIG1lbWJlciB2YXJpYWJsZXMgb2YgdHlwZS4gMS4gQ2hlY2tzIGlmIHRoZSB0eXBlIGlzIGEgamF2YSBBUEkgY2xhc3Mgd2hldGhlciBpdCBpcyBzdXBwb3J0ZWQuIDIuIElmIGlzIG90aGVyIHR5cGUNCi0JICogcGVyZm9ybSBydXRpbWUgY2xhc3MgY2hlY2sgdXNpbmcgdmFsaWRhdGUoVHlwZVByb3h5IHR5cGUpIG1ldGhvZC4NCi0JICogDQotCSAqIEBzZWUgUnVudGltZVR5cGVWYWxpZGF0b3IgLSBjaGVja1R5cGUoVHlwZVByb3h5IHR5cGUpIG1ldGhvZC4NCi0JICogQHBhcmFtIHR5cGUNCi0JICogQHRocm93cyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgY2hlY2tQdWJsaWNBdHRyaWJ1dGVzKFR5cGVBZGFwdGVyIHR5cGUpIHRocm93cyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJSVR5cGUgaVR5cGUgPSB0eXBlLmdldFR5cGUoKTsNCi0JCWZvciAoSUZpZWxkIGZpZWxkIDogaVR5cGUuZ2V0RmllbGRzKCkpDQotCQl7DQotCQkJaWYgKEZsYWdzLmlzUHVibGljKGZpZWxkLmdldEZsYWdzKCkpKQ0KLQkJCXsNCi0JCQkJcmVzb2x2ZUFuZENoZWNrVHlwZShmaWVsZC5nZXRUeXBlU2lnbmF0dXJlKCksIGlUeXBlKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIENoZWNrIGlmIHRoZSA8Y29kZT50eXBlPC9jb2RlPiBpbXBsZW1lbnRzIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbn0gb3Ige0BsaW5rIGphdmEudXRpbC5NYXB9DQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZQ0KLQkgKiBAcmV0dXJuIHRydWUgLSBpZiBpbXBsZW1lbnRzIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbn0gb3Ige0BsaW5rIGphdmEudXRpbC5NYXB9DQotCSAqIEB0aHJvd3MgVHlwZU5vdEZvdW5kRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwcml2YXRlIGJvb2xlYW4gaXNFeHRlbmRpbmdDb2xsZWN0aW9uT3JNYXAoVHlwZUFkYXB0ZXIgdHlwZSkgdGhyb3dzIFR5cGVOb3RGb3VuZEV4Y2VwdGlvbiwgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmICh0eXBlLmlzSW1wbGVtZW50aW5nKEdlbmVyYWxUeXBlc05hbWVzLkpBVkFfVVRJTF9DT0xMRUNUSU9OKSkNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0NCi0JCWlmICh0eXBlLmlzSW1wbGVtZW50aW5nKEdlbmVyYWxUeXBlc05hbWVzLkpBVkFfVVRJTF9NQVApKQ0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVja3MgdHlwZXMgdXNlZCBhcyByZXR1cm4gdmFsdWUsIHBhcmFtZXRlciB0eXBlcy4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlDQotCSAqIEB0aHJvd3MgSW5hZG1pc3NhYmxlVHlwZUV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIGNoZWNrVHlwZXNVc2VkSW5Qcm9wZXJ0aWVzKFR5cGVBZGFwdGVyIHR5cGUpIHRocm93cyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJSVR5cGUgaVR5cGUgPSB0eXBlLmdldFR5cGUoKTsNCi0JCWZvciAoSU1ldGhvZCBtZXRob2QgOiBpVHlwZS5nZXRNZXRob2RzKCkpDQotCQl7DQotCQkJLy8gQ29uc3RydWN0b3JzIGFyZSBub3QgdmFsaWRhdGVkDQotCQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkgfHwgaXNYbWxUcmFuc2llbnQobWV0aG9kKSkNCi0JCQl7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0NCi0JCQkvLyBvbmx5IGdldHRlcnMgYXJlIHZhbGlkYXRlZA0KLQkJCWlmICghaXNHZXR0ZXIobWV0aG9kKSkNCi0JCQl7Ly8gfHwgIWZpbmRTZXR0ZXIobWV0aG9kKSkgew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQ0KLQkJCXJlc29sdmVBbmRDaGVja1R5cGUobWV0aG9kLmdldFJldHVyblR5cGUoKSwgbWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKSk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSBib29sZWFuIGlzR2V0dGVyKGZpbmFsIElNZXRob2QgbWV0aG9kKQ0KLQl7DQotCQlyZXR1cm4gbWV0aG9kLmdldEVsZW1lbnROYW1lKCkuc3RhcnRzV2l0aChHRVQpOw0KLQl9DQotDQotCXByaXZhdGUgYm9vbGVhbiBpc1htbFRyYW5zaWVudChJTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAobWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKS5pc0JpbmFyeSgpKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0NCi0JCWFubm90YXRpb25JbnNwZWN0b3IgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCkpOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gbWV0aG9kQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uSW5zcGVjdG9yLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7DQotCQlmb3IgKElBbm5vdGF0aW9uPElNZXRob2Q+IG1ldGhvZEFubm90YXRpb24gOiBtZXRob2RBbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlpZihtZXRob2RBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKFhNTF9UUkFOU0lFTlRfQU5OT1RBVElPTikgfHwNCi0JCQkJCW1ldGhvZEFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoWE1MX1RSQU5TSUVOVF9BTk5PVEFUSU9OX1NIT1JUKSkNCi0JCQl7DQotCQkJCXJlc3VsdCA9IHRydWU7DQotCQkJfQ0KLQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUHJvdmlkZXMgdHlwZSBjaGVjayB3aXRoIHR5cGUgcmVzb2x2aW5nLg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGVOYW1lDQotCSAqIEBwYXJhbSB0eXBlDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgVHlwZU5vdEZvdW5kRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgSW5hZG1pc3NhYmxlVHlwZUV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHJlc29sdmVBbmRDaGVja1R5cGUoU3RyaW5nIHR5cGVOYW1lLCBJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBUeXBlTm90Rm91bmRFeGNlcHRpb24sIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24NCi0Jew0KLQkJZm9yIChTdHJpbmcgcmVzb2x2ZWRUeXBlIDogVHlwZVJlc29sdmVyLnJlc29sdmVUeXBlcyh0eXBlTmFtZSwgdHlwZSkpDQotCQl7DQotCQkJaWYgKFByaW1pdGl2ZVR5cGVIYW5kbGVyLmlzVm9pZFR5cGUocmVzb2x2ZWRUeXBlKSkNCi0JCQl7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0NCi0JCQlpZiAoaXNKYXZhVHlwZShyZXNvbHZlZFR5cGUpICYmIGlzQWxsb3dlZEphdmFUeXBlKHJlc29sdmVkVHlwZSkpDQotCQkJew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotDQotCQkJdmFsaWRhdGVJbnRlcm5hbChuZXcgVHlwZUFkYXB0ZXIoVHlwZUZhY3RvcnkuY3JlYXRlKHJlc29sdmVkVHlwZSwgdHlwZSkpKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogVmFsaWRhdGVzIGlmIDxjb2RlPnR5cGU8L2NvZGU+IGlzIGFic3RyYWN0IGNsYXNzIHdoZXRoZXIgaXQgaXMgaW1wbGVtZW50ZWQgYnkgc29tZSBjbGFzcyBjYXBhYmxlIGZvciBydW50aW1lIGNsYXNzLg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGUNCi0JICogQHRocm93cyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgY2hlY2tBYnN0cmFjdE5vdEltcGxlbWVudGVkKFR5cGVBZGFwdGVyIHR5cGUpIHRocm93cyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJLy8gY2hlY2sgZm9yIGltcGxlbWVudG9yIGZvciBhYnN0cmFjdCBjbGFzcw0KLQkJaWYgKHR5cGUuaXNBYnN0cmFjdCgpICYmICFpc0ltcGxlbWVudGVkKHR5cGUuZ2V0VHlwZSgpKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgQWJzdHJhY3RDbGFzc05vdEltcGxlbWVudGVkRXhjZXB0aW9uKHR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIHdoZXRoZXIgPGNvZGU+YmFzZTwvY29kZT4gY2xhc3MgaGFzIHNvbWUgbm9uIGFic3RyYWN0IGltcGxlbWVudG9yIHdoaWNoIGlzIGNhcGFibGUgZm9yIHJ1bnRpbWUgY2xhc3MuDQotCSAqIA0KLQkgKiBAcGFyYW0gYmFzZQ0KLQkgKiAgICAgICAgICAgIGNoZWNrZWQgdHlwZQ0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJpdmF0ZSBib29sZWFuIGlzSW1wbGVtZW50ZWQoSVR5cGUgYmFzZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoYmFzZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoR2VuZXJhbFR5cGVzTmFtZXMuSkFWQV9MQU5HX09CSkVDVCkNCi0JCQkJCQkJCQkJfHwgYmFzZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoR2VuZXJhbFR5cGVzTmFtZXMuSkFWQV9JT19TRVJJQUxJWkFCTEUpKQ0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQ0KLQkJSVR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSA9IGJhc2UubmV3VHlwZUhpZXJhcmNoeShudWxsKTsNCi0JCUlUeXBlW10gY2xhc3NlcyA9IHR5cGVIaWVyYXJjaHkuZ2V0QWxsU3VidHlwZXMoYmFzZSk7DQotDQotCQlJVHlwZSBjbGFzc0NhbmRpZGF0ZSA9IG51bGw7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspDQotCQl7DQotCQkJY2xhc3NDYW5kaWRhdGUgPSBjbGFzc2VzW2ldOw0KLQ0KLQkJCWlmIChjYW5CZVVzZWRBc1JUQ2xhc3MoY2xhc3NDYW5kaWRhdGUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVjayBpZiBnaXZlbiB0eXBlIGlzIHN1aXRhYmxlIGZvciBjbGFzcy9pbnRlcmZhY2UgaW1wbGVtZW50b3IuIENsYXNzIHNob3VsZCBub3QgYmUgYWJzdHJhY3QsIGludGVyZmFjZSBhbmQgc2hvdWxkIGNvbXBseSB0byB0aGUgcnVsZXMgZGVmaW5lZA0KLQkgKiBpbiBjaGVja1R5cGUgZG9jdW1lbnRhdGlvbi4NCi0JICogDQotCSAqIEBzZWUgUnVudGltZVR5cGVWYWxpZGF0b3IgLSBjaGVja1R5cGUoVHlwZVByb3h5IHR5cGUpIG1ldGhvZC4NCi0JICogQHBhcmFtIHR5cGUgLQ0KLQkgKiAgICAgICAgICAgIGNoZWNrZWQgdHlwZQ0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJpdmF0ZSBib29sZWFuIGNhbkJlVXNlZEFzUlRDbGFzcyhJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWludCBmbGFncyA9IHR5cGUuZ2V0RmxhZ3MoKTsNCi0NCi0JCWlmICghdHlwZS5pc0NsYXNzKCkgfHwgRmxhZ3MuaXNBYnN0cmFjdChmbGFncykpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJaWYgKEZsYWdzLmlzSW50ZXJmYWNlKGZsYWdzKSB8fCB0eXBlLmlzQW5vbnltb3VzKCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJLy8gY2hlY2sgc3ViIHR5cGUgaWYgaXQgaXMgYWxsb3dlZCBhcyBydCBjbGFzc2VzDQotCQl0cnkNCi0JCXsNCi0JCQlUeXBlQWRhcHRlciB0cCA9IG5ldyBUeXBlQWRhcHRlcih0eXBlKTsNCi0JCQl2YWxpZGF0ZUludGVybmFsKHRwKTsNCi0JCX0gY2F0Y2ggKEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQkvLyAkSkwtRVhDJA0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9TZWlJbXBsZW1lbnRhdGlvblZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL1NlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2Y2QwNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL1NlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlcjsNCi0NCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkZsYWdzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5UeXBlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4uSmF4V3NEb21SdW50aW1lTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4uSmF4V3NEb21SdW50aW1lUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLQ0KLS8qKg0KLSAqIFZhbGlkYXRlcyBTRUkgYWdhaW5zdCBpbXBsZW1lbnRhdGlvbiBiZWFuLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3INCi17DQotCXByaXZhdGUgZmluYWwgSVR5cGUgc2VpVHlwZTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yLg0KLQkgKiANCi0JICogQHBhcmFtIHNlaVR5cGUNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPnNlaVR5cGU8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+c2VpVHlwZTwvY29kZT4gaXMgbm90IGEgaW50ZXJmYWNlDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3IoZmluYWwgSVR5cGUgc2VpVHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oc2VpVHlwZSk7DQotCQkNCi0JCWlmICghc2VpVHlwZS5pc0ludGVyZmFjZSgpKSB7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VpVHlwZSBzaG91bGQgYmUgaW50ZXJmYWNlIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0gCQkNCi0JCXRoaXMuc2VpVHlwZSA9IHNlaVR5cGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIFZhbGlkYXRlcyBwcm92aWRlZCBpbiBjb25zdHJ1Y3RvciBTRUkgYWdhaW5zdCA8dHQ+YmVhblR5cGU8L3R0Pi4gVGhlIDx0dD5iZWFuVHlwZTwvdHQ+IHNob3VsZCBpbXBsZW1lbnQgYWxsDQotCSAqIA0KLQkgKiBAcGFyYW0gYmVhblR5cGUNCi0JICogQHJldHVybiBzdGF0dXMgb2JqZWN0IHdpdGggc2V0IHNldmVyaXR5IGFuZCBtZXNzYWdlDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShmaW5hbCBJVHlwZSBiZWFuVHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBTdHJpbmcgYmVhbkZRTmFtZSA9IGJlYW5UeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOw0KLQkJaWYgKGltcGxlbWVudHNTRUkoYmVhblR5cGUpKQ0KLQkJew0KLQkJCXJldHVybiBwcmVwYXJlU3RhdHVzKG51bGwsIG51bGwpOw0KLQkJfQ0KLQ0KLQkJZm9yIChJTWV0aG9kIHNlaU1ldGhvZCA6IGNvbGxlY3RJbnRlcmZhY2VNZXRob2RzKHNlaVR5cGUpKQ0KLQkJew0KLQkJCUlNZXRob2QgYmVhbk1ldGhvZCA9IGZpbmRNZXRob2RJbkJlYW4oc2VpTWV0aG9kLCBiZWFuVHlwZSk7DQotCQkJaWYgKGJlYW5NZXRob2QgPT0gbnVsbCkNCi0JCQl7DQotCQkJCXJldHVybiBwcmVwYXJlU3RhdHVzKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLlNlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yX01FVEhPRF9OT1RfRk9VTkQsIGZvcm1hdE1ldGhvZFNpZ25hdHVyZShzZWlNZXRob2QpLCBiZWFuRlFOYW1lKSwNCi0JCQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KLQkJCQkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoDQotCQkJCQkJCQkJCQkJIk1ldGhvZCB7MH0gY2Fubm90IGJlIGZvdW5kIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBiZWFuIHsxfS4gSXQgaXMgcmVxdWlyZWQgdGhhdCB0aGUgYmVhbiBpbXBsZW1lbnRzIGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkJCQkJCWJlYW5GUU5hbWUpKSk7DQotCQkJfQ0KLQ0KLQkJCWlmICghRmxhZ3MuaXNQdWJsaWMoYmVhbk1ldGhvZC5nZXRGbGFncygpKSkNCi0JCQl7DQotCQkJCXJldHVybiBwcmVwYXJlU3RhdHVzKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLlNlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yX01FVEhPRF9OT1RfUFVCTElDLCBmb3JtYXRNZXRob2RTaWduYXR1cmUoc2VpTWV0aG9kKSwgYmVhbkZRTmFtZSksDQotCQkJCQkJbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigNCi0JCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KA0KLQkJCQkJCQkJCQkJCSIgTWV0aG9kIHswfSBpbiB0aGUgaW1wbGVtZW50YXRpb24gYmVhbiB7MX0gaXMgbm90IHB1YmxpYyBhbmQgdGhlcmVmb3JlIGNhbm5vdCBiZSBleHBvc2VkIGFzIGEgd2ViIHNlcnZpY2Ugb3BlcmF0aW9uIiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkJCQkJCWJlYW5GUU5hbWUpKSk7DQotCQkJfQ0KLQ0KLQkJCWlmICghaGFzU2FtZUV4Y2VwdGlvbnMoc2VpTWV0aG9kLCBiZWFuTWV0aG9kKSkNCi0JCQl7DQotCQkJCXJldHVybiBwcmVwYXJlU3RhdHVzKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLlNlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yX01FVEhPRF9IQVNESUZGRVJFTlRfRVhDRVBUSU9OUywgZm9ybWF0TWV0aG9kU2lnbmF0dXJlKHNlaU1ldGhvZCksIGJlYW5GUU5hbWUpLA0KLQkJCQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oDQotCQkJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdCgNCi0JCQkJCQkJCQkJCQkiTWV0aG9kIHswfSBpbiB0aGUgaW1wbGVtZW50YXRpb24gYmVhbiB7MX0gaXMgZGVjbGFyZWQgdG8gdGhyb3cgZXhjZXB0aW9ucyB0aGF0IGRpZmZlciBmcm9tIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSBzYW1lIG1ldGhvZCBpbiB0aGUgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UiLCAvLyROT04tTkxTLTEkDQotCQkJCQkJCQkJCQkJYmVhbkZRTmFtZSkpKTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gcHJlcGFyZVN0YXR1cyhudWxsLCBudWxsKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gaW1wbGVtZW50c1NFSShmaW5hbCBJVHlwZSBiZWFuVHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmb3IgKFN0cmluZyBpbnRlcmZhY2VOYW1lIDogYmVhblR5cGUuZ2V0U3VwZXJJbnRlcmZhY2VOYW1lcygpKQ0KLQkJew0KLQkJCVN0cmluZyBpbnRlcmZhY2VGUU5hbWUgPSBUeXBlUmVzb2x2ZXIucmVzb2x2ZVR5cGUoaW50ZXJmYWNlTmFtZSwgYmVhblR5cGUpOw0KLQkJCWlmIChpbnRlcmZhY2VGUU5hbWUuZXF1YWxzKHNlaVR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXByaXZhdGUgSU1ldGhvZCBmaW5kTWV0aG9kSW5CZWFuKGZpbmFsIElNZXRob2Qgc2VpTWV0aG9kLCBmaW5hbCBJVHlwZSBiZWFuVHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmb3IgKElNZXRob2QgYmVhbk1ldGhvZCA6IGJlYW5UeXBlLmdldE1ldGhvZHMoKSkNCi0JCXsNCi0JCQlpZiAoIXNlaU1ldGhvZC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhiZWFuTWV0aG9kLmdldEVsZW1lbnROYW1lKCkpKQ0KLQkJCXsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQ0KLQkJCWlmIChoYXNTYW1lUmV0dXJuVHlwZShzZWlNZXRob2QsIGJlYW5NZXRob2QpICYmIGhhc1NhbWVQYXJhbXMoc2VpTWV0aG9kLCBiZWFuTWV0aG9kKSkNCi0JCQl7DQotCQkJCXJldHVybiBiZWFuTWV0aG9kOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWlmIChiZWFuVHlwZS5nZXRTdXBlcmNsYXNzTmFtZSgpID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotDQotCQlmaW5hbCBTdHJpbmcgc3VwZXJUeXBlTmFtZSA9IFR5cGVSZXNvbHZlci5yZXNvbHZlVHlwZShiZWFuVHlwZS5nZXRTdXBlcmNsYXNzTmFtZSgpLCBiZWFuVHlwZSk7DQotDQotCQlyZXR1cm4gZmluZE1ldGhvZEluQmVhbihzZWlNZXRob2QsIGJlYW5UeXBlLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoc3VwZXJUeXBlTmFtZSkpOw0KLQl9DQotDQotCXByaXZhdGUgYm9vbGVhbiBoYXNTYW1lUmV0dXJuVHlwZShmaW5hbCBJTWV0aG9kIHNlaU1ldGhvZCwgZmluYWwgSU1ldGhvZCBiZWFuTWV0aG9kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIExpc3Q8U3RyaW5nPiBzZWlSZXRUeXBlID0gVHlwZVJlc29sdmVyLnJlc29sdmVUeXBlcyhzZWlNZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCBzZWlNZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpKTsNCi0JCWZpbmFsIExpc3Q8U3RyaW5nPiBiZWFuUmV0VHlwZSA9IFR5cGVSZXNvbHZlci5yZXNvbHZlVHlwZXMoYmVhbk1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIGJlYW5NZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpKTsNCi0NCi0JCWlmICghYXJlU2FtZVR5cGVzKHNlaVJldFR5cGUsIGJlYW5SZXRUeXBlKSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gaGFzU2FtZVBhcmFtcyhmaW5hbCBJTWV0aG9kIHNlaU1ldGhvZCwgZmluYWwgSU1ldGhvZCBiZWFuTWV0aG9kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIFN0cmluZ1tdIHNlaVBhcmFtVHlwZXMgPSBzZWlNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsNCi0JCWZpbmFsIFN0cmluZ1tdIGJlYW5QYXJhbVR5cGVzID0gYmVhbk1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOw0KLQkJaWYgKHNlaVBhcmFtVHlwZXMubGVuZ3RoICE9IGJlYW5QYXJhbVR5cGVzLmxlbmd0aCkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlMaXN0PFN0cmluZz4gc2VpUGFyYW1UeXBlID0gbnVsbDsNCi0JCUxpc3Q8U3RyaW5nPiBiZWFuUGFyYW1UeXBlID0gbnVsbDsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VpUGFyYW1UeXBlcy5sZW5ndGg7IGkrKykNCi0JCXsNCi0JCQlzZWlQYXJhbVR5cGUgPSBUeXBlUmVzb2x2ZXIucmVzb2x2ZVR5cGVzKHNlaVBhcmFtVHlwZXNbaV0sIHNlaU1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCkpOw0KLQkJCWJlYW5QYXJhbVR5cGUgPSBUeXBlUmVzb2x2ZXIucmVzb2x2ZVR5cGVzKGJlYW5QYXJhbVR5cGVzW2ldLCBiZWFuTWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKSk7DQotDQotCQkJaWYgKCFhcmVTYW1lVHlwZXMoc2VpUGFyYW1UeXBlLCBiZWFuUGFyYW1UeXBlKSkNCi0JCQl7DQotCQkJCXJldHVybiBmYWxzZTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gYXJlU2FtZVR5cGVzKGZpbmFsIExpc3Q8U3RyaW5nPiBzZWlUeXBlTmFtZXMsIGZpbmFsIExpc3Q8U3RyaW5nPiBiZWFuVHlwZU5hbWVzKQ0KLQl7DQotCQlpZiAoc2VpVHlwZU5hbWVzLnNpemUoKSAhPSBiZWFuVHlwZU5hbWVzLnNpemUoKSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlaVR5cGVOYW1lcy5zaXplKCk7IGkrKykNCi0JCXsNCi0JCQlpZiAoIXNlaVR5cGVOYW1lcy5nZXQoaSkuZXF1YWxzKGJlYW5UeXBlTmFtZXMuZ2V0KGkpKSkNCi0JCQl7DQotCQkJCXJldHVybiBmYWxzZTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQ0KLQlwcml2YXRlIExpc3Q8SU1ldGhvZD4gY29sbGVjdEludGVyZmFjZU1ldGhvZHMoZmluYWwgSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBMaXN0PElNZXRob2Q+IGFsbE1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PElNZXRob2Q+KCk7DQotCQlDb2xsZWN0aW9ucy5hZGRBbGwoYWxsTWV0aG9kcywgdHlwZS5nZXRNZXRob2RzKCkpOw0KLQ0KLQkJZm9yIChTdHJpbmcgc3VwZXJJbnRlcmZhY2VOYW1lIDogdHlwZS5nZXRTdXBlckludGVyZmFjZU5hbWVzKCkpDQotCQl7DQotCQkJU3RyaW5nIHN1cGVyRlFOYW1lID0gVHlwZVJlc29sdmVyLnJlc29sdmVUeXBlKHN1cGVySW50ZXJmYWNlTmFtZSwgdHlwZSk7DQotCQkJSVR5cGUgc3VwZXJUeXBlID0gdHlwZS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHN1cGVyRlFOYW1lLCAoSVByb2dyZXNzTW9uaXRvcikgbnVsbCk7DQotDQotCQkJYXNzZXJ0IChzdXBlclR5cGUgIT0gbnVsbCk7DQotDQotCQkJYWxsTWV0aG9kcy5hZGRBbGwoY29sbGVjdEludGVyZmFjZU1ldGhvZHMoc3VwZXJUeXBlKSk7DQotCQl9DQotDQotCQlyZXR1cm4gYWxsTWV0aG9kczsNCi0JfQ0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gaGFzU2FtZUV4Y2VwdGlvbnMoSU1ldGhvZCBzZWlNZXRob2QsIElNZXRob2QgYmVhbk1ldGhvZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoc2VpTWV0aG9kLmdldEV4Y2VwdGlvblR5cGVzKCkubGVuZ3RoICE9IGJlYW5NZXRob2QuZ2V0RXhjZXB0aW9uVHlwZXMoKS5sZW5ndGgpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJZmluYWwgU2V0PFN0cmluZz4gc2VpRXhjZXB0aW9ucyA9IGdldFJlc29sdmVkRXhjZXB0aW9ucyhzZWlNZXRob2QpOw0KLQkJZmluYWwgSVR5cGUgYmVhblR5cGUgPSBiZWFuTWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKTsNCi0JCWZvciAoU3RyaW5nIGJlYW5FeCA6IGJlYW5NZXRob2QuZ2V0RXhjZXB0aW9uVHlwZXMoKSkNCi0JCXsNCi0JCQlTdHJpbmcgcmVzb2x2ZWROYW1lID0gVHlwZVJlc29sdmVyLnJlc29sdmVUeXBlKFNpZ25hdHVyZS50b1N0cmluZyhiZWFuRXgpLCBiZWFuVHlwZSk7DQotCQkJaWYgKCFzZWlFeGNlcHRpb25zLmNvbnRhaW5zKHJlc29sdmVkTmFtZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0NCi0JcHJpdmF0ZSBTZXQ8U3RyaW5nPiBnZXRSZXNvbHZlZEV4Y2VwdGlvbnMoSU1ldGhvZCBtZXRob2QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgU2V0PFN0cmluZz4gZXhjZXB0aW9uc0ZRTnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KG1ldGhvZC5nZXRFeGNlcHRpb25UeXBlcygpLmxlbmd0aCk7DQotCQlmaW5hbCBJVHlwZSBkZWNsYXJpbmdUeXBlID0gbWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKTsNCi0NCi0JCWZvciAoU3RyaW5nIGV4Y2VwdGlvbiA6IG1ldGhvZC5nZXRFeGNlcHRpb25UeXBlcygpKQ0KLQkJew0KLQkJCWV4Y2VwdGlvbnNGUU5zLmFkZChUeXBlUmVzb2x2ZXIucmVzb2x2ZVR5cGUoU2lnbmF0dXJlLnRvU3RyaW5nKGV4Y2VwdGlvbiksIGRlY2xhcmluZ1R5cGUpKTsNCi0JCX0NCi0NCi0JCXJldHVybiBleGNlcHRpb25zRlFOczsNCi0JfQ0KLQ0KLQlwcml2YXRlIFN0cmluZyBmb3JtYXRNZXRob2RTaWduYXR1cmUoZmluYWwgSU1ldGhvZCBtZXRob2QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgU3RyaW5nQnVmZmVyIG5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKFNpZ25hdHVyZS50b1N0cmluZyhtZXRob2QuZ2V0U2lnbmF0dXJlKCksIG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpLCBtZXRob2QuZ2V0UGFyYW1ldGVyTmFtZXMoKSwNCi0JCQkJCQkJCQkJdHJ1ZSwgZmFsc2UpKTsNCi0JCW5hbWUuYXBwZW5kKCIgOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJbmFtZS5hcHBlbmQoU2lnbmF0dXJlLnRvU3RyaW5nKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpKTsNCi0NCi0JCXJldHVybiBuYW1lLnRvU3RyaW5nKCk7DQotCX0NCi0NCi0JcHJpdmF0ZSBJU3RhdHVzIHByZXBhcmVTdGF0dXMoU3RyaW5nIG1zZywgVGhyb3dhYmxlIGNhdXNlKQ0KLQl7DQotCQlyZXR1cm4gbmV3IFN0YXR1cygobXNnID09IG51bGwpID8gSVN0YXR1cy5PSyA6IElTdGF0dXMuRVJST1IsIEpheFdzRG9tUnVudGltZVBsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZyA9PSBudWxsID8gIiIgOiBtc2csIGNhdXNlKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9TZWlWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9TZWlWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDk3YWQ0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvU2VpVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlcjsNCi0NCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLlR5cGVSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVQbHVnaW47DQotDQotLyoqDQotICogSW50ZXJmYWNlIHZhbGlkYXRvciAtIGNoZWNrcyBpZiBzdXBwbGllZCB0eXBlIGlzIGFwcGxpY2FibGUgZm9yIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIChTRUkpLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgU2VpVmFsaWRhdG9yDQotew0KLQkNCi0JcHJpdmF0ZSBmaW5hbCBNZXRob2RWYWxpZGF0b3IgbWV0aG9kVmFsaWRhdG9yOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IuDQotCSAqLw0KLQlwdWJsaWMgU2VpVmFsaWRhdG9yKCkNCi0Jew0KLQkJbWV0aG9kVmFsaWRhdG9yID0gbmV3IE1ldGhvZFZhbGlkYXRvcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8cHJlPg0KLQkgKiBWYWxpZGF0ZXMgPHR0PnR5cGU8L3R0PiBpZiBpdCBpcyBhcHBsaWNhYmxlIGZvciBTZXJ2aWNlIEVudGRwb2ludCBJbnRlcmZhY2UuDQotCSAqICANCi0JICogIDEuIDx0dD50eXBlPC90dD4gbXVzdCBiZSBpbnRlcmZhY2UNCi0JICogIDIuIDx0dD50eXBlPC90dD4gbXVzdCBiZSBvdXRlcg0KLQkgKiAgMy4gPHR0PnR5cGU8L3R0PiBtdXN0IGJlIHB1YmxpYw0KLQkgKiAgNC4gYWxsIDx0dD50eXBlPC90dD4gbWV0aG9kcyBtdXN0IGJlIGV4cG9zYWJsZSBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIGluIHtAbGluayBNZXRob2RWYWxpZGF0b3J9DQotCSAqIDwvcHJlPg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGUgdmFsaWRhdGVkIHR5cGUNCi0JICogQHJldHVybiBJU3RhdHVzIG9iamVjdCB3aXRoIHN0YXR1cyB7QGxpbmsgSVN0YXR1cyNPS30gaW4gY2FzZSA8dHQ+dHlwZTwvdHQ+IGlzIGFwcGxpY2FibGUgZm9yIFNFSSBvciB7QGxpbmsgSVN0YXR1cyNFUlJPUn0gaW4gY2FzZSB0eXBlIGlzDQotCSAqICAgICAgICAgbm90IGFwcGxpY2FibGUgd2l0aCBzb21lIGh1bWFuIHJlYWRibGUgZXhwbGFuYXRpb24gb2YgdGhlIHByb2JsZW0uDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSA8dHQ+dHlwZTwvdHQ+IGlzIG51bGwuDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCVN0cmluZyBzZWlOYW1lID0gdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsNCi0JCWlmICghdHlwZS5pc0ludGVyZmFjZSgpKQ0KLQkJew0KLQkJCXJldHVybiBwcmVwYXJlU3RhdHVzKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLlNlaVZhbGlkYXRvcl9OT1RfSU5URVJGQUNFX01TRywgc2VpTmFtZSksDQotCQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KLQkJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdCgNCi0JCQkJCQkJCQkJCSJ7MH0gaXMgbm90IGEgaW50ZXJmYWNlIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBhIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkJCQkJc2VpTmFtZSkpKTsNCi0JCX0NCi0NCi0JCWlmICh0eXBlLmlzQmluYXJ5KCkpDQotCQl7DQotCQkJcmV0dXJuIHByZXBhcmVTdGF0dXMoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuU2VpVmFsaWRhdG9yX05PVF9DT01QSUxBVElPTlVOSVRfTVNHLCBzZWlOYW1lKSwNCi0JCQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oDQotCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KA0KLQkJCQkJCQkJCQkJInswfSBpcyBhIGJpbmFyeSBpbnRlcmZhY2UgYW5kIGNhbm5vdCBhbm5vdGF0ZWQgYXMgYSBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJCXNlaU5hbWUpKSk7DQotCQl9DQotDQotCQlpZiAodHlwZS5pc01lbWJlcigpKQ0KLQkJew0KLQkJCXJldHVybiBwcmVwYXJlU3RhdHVzKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLlNlaVZhbGlkYXRvcl9OT1RfT1VURVJfTVNHLCBzZWlOYW1lKSwNCi0JCQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oDQotCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KA0KLQkJCQkJCQkJCQkJInswfSBpcyBub3QgYSBvdXRlciBpbnRlcmZhY2UgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIGEgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UiLCAvLyROT04tTkxTLTEkDQotCQkJCQkJCQkJCQlzZWlOYW1lKSkpOw0KLQkJfQ0KLQ0KLQkJaWYgKCFGbGFncy5pc1B1YmxpYyh0eXBlLmdldEZsYWdzKCkpKQ0KLQkJew0KLQkJCXJldHVybiBwcmVwYXJlU3RhdHVzKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLlNlaVZhbGlkYXRvcl9OT1RfUFVCTElDX01TRywgc2VpTmFtZSksDQotCQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KLQkJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdCgNCi0JCQkJCQkJCQkJCSJ7MH0gaXMgbm90IGEgcHVibGljIGludGVyZmFjZSBhbmQgY2Fubm90IGJlIHVzZWQgYXMgYSBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJCXNlaU5hbWUpKSk7DQotCQl9DQotDQotCQlyZXR1cm4gdmFsaWRhdGVNZXRob2RzKHR5cGUpOw0KLQl9DQotDQotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZU1ldGhvZHMoSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlJU3RhdHVzIHN0YXR1czsNCi0JCWZvciAoSU1ldGhvZCBtZXRob2QgOiB0eXBlLmdldE1ldGhvZHMoKSkNCi0JCXsNCi0JCQlzdGF0dXMgPSBtZXRob2RWYWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5PSykNCi0JCQl7DQotCQkJCXJldHVybiBzdGF0dXM7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJZm9yIChTdHJpbmcgc3VwZXJJbnRlcmZhY2VOYW1lIDogdHlwZS5nZXRTdXBlckludGVyZmFjZU5hbWVzKCkpDQotCQl7DQotCQkJU3RyaW5nIHN1cGVyRlFOYW1lID0gVHlwZVJlc29sdmVyLnJlc29sdmVUeXBlKHN1cGVySW50ZXJmYWNlTmFtZSwgdHlwZSk7DQotCQkJSVR5cGUgc3VwZXJUeXBlID0gdHlwZS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHN1cGVyRlFOYW1lKTsNCi0NCi0JCQlhc3NlcnQgKHN1cGVyVHlwZSAhPSBudWxsKTsNCi0NCi0JCQlzdGF0dXMgPSB2YWxpZGF0ZU1ldGhvZHMoc3VwZXJUeXBlKTsNCi0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5PSykNCi0JCQl7DQotCQkJCXJldHVybiBzdGF0dXM7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHByZXBhcmVTdGF0dXMobnVsbCwgbnVsbCk7DQotCX0NCi0NCi0JcHJpdmF0ZSBJU3RhdHVzIHByZXBhcmVTdGF0dXMoU3RyaW5nIG1zZywgVGhyb3dhYmxlIGNhdXNlKQ0KLQl7DQotCQlyZXR1cm4gbmV3IFN0YXR1cygobXNnID09IG51bGwpID8gSVN0YXR1cy5PSyA6IElTdGF0dXMuRVJST1IsIEpheFdzRG9tUnVudGltZVBsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZyA9PSBudWxsID8gIiIgOiBtc2csIGNhdXNlKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9UeXBlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvVHlwZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NjExOTVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9UeXBlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5HZW5lcmFsVHlwZXNOYW1lczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC52YWxpZGF0aW9uLnByb3ZpZGVyLlR5cGVBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwudmFsaWRhdGlvbi5wcm92aWRlci5UeXBlS2V5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLkhhc0luYWRtaXNhYmxlSW5uZXJUeXBlc0V4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuZXhjZXB0aW9ucy5JbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLkluaGVyaXRhbmNlQW5kSW1wbGVtZW50YXRpb25FeGVjcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuTXVsdGlwbGVJbXBsZW1lbnRhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuZXhjZXB0aW9ucy5SZW1vdGVPYmplY3RFeGNlcHRpb247DQotDQotLyoqDQotICogUHJvdmlkZXMgc2V0IG9mIGdlbmVyYWwgdmFsaWRhdGlvbiBtZXRob2RzIHdoaWNoIGNhbiBiZSByZXVzZWQgYnkgc3ViY2xhc3Nlcy4NCi0gKiANCi0gKiBAaTAzNjUwOQ0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUeXBlVmFsaWRhdG9yDQotew0KLQkvLyB0aGVyZSBhcmUgdHlwZXMgZnJvbSB0aGUgamF2YS4qIHBhY2thZ2VzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGUgcnVudGltZQ0KLQkvLyBhbmQgYXJlIGtub3duIHRvIGl0IHdpdGhvdXQgYW5hbHlzaXMgb2YgdGhlcmUgc3RydWN0dXJlLCB0aGVyZWZvcmUgdGhleSBhcmUNCi0JLy8gc3RvcmVkIGFzIGVsZW1lbnRhcmllcy4NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gSkFWQV9UWVBFUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsgLy8gJEpMLUNPTExFQ1RJT04kDQotDQotCS8vIGZvciB0aGVzZSBqYXZhLiogdHlwZXMgYXR0cmlidXRlcyBhcmUgcmVzb2x2ZWQsIGkuZSB0aGV5IGFyZSBzdG9yZWQgYXMNCi0JLy8gc3RydWN0dXJlIGlmIHRoZXkgY29udGFpbiBmaWVsZHMuDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IEFOQUxZU0VEX0pBVkFfVFlQRVMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7IC8vICRKTC1DT0xMRUNUSU9OJA0KLQ0KLQkvLyB0aGVzZSB0eXBlcyBhcmUgYWxsb3dlZCB0byBiZSB1c2VkIGluIGNhc2Ugb2YgbXVsdHkgaW5oZXJpdGFuY2UNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gQUxMT1dFRF9JTl9NVUxUWUlOSEVSSVRBTkNFID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOyAvLyAkSkwtQ09MTEVDVElPTiQNCi0NCi0JcHJpdmF0ZSBNYXA8VHlwZUtleSwgSVN0YXR1cz4gc3RhdHVzTWFwID0gbmV3IEhhc2hNYXA8VHlwZUtleSwgSVN0YXR1cz4oKTsNCi0NCi0JLy8gY2FjaGUgb2YgYWxyZWFkeSBhbmFseXplZCB0eXBlcw0KLQlwcml2YXRlIFNldDxUeXBlS2V5PiBhbmFseXplZCA9IG5ldyBIYXNoU2V0PFR5cGVLZXk+KCk7DQotDQotCXN0YXRpYw0KLQl7DQotCQkvLyBUaGVyZSBhcmUgdHlwZXMgZnJvbSB0aGUgamF2YS4qIHBhY2thZ2VzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGUgcnVudGltZQ0KLQkJLy8gYW5kIGFyZSBrbm93biB0byBpdCB3aXRob3V0IGFuYWx5c2lzIG9mIHRoZXJlIHN0cnVjdHVyZSwgdGhlcmVmb3JlIHRoZXkgYXJlDQotCQkvLyBzdG9yZWQgYXMgZWxlbWVudGFyaWVzLg0KLQ0KLQkJLy8gRGF0ZS9UaW1lIFNwZWNpZmljIFR5cGVzDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLkNhbGVuZGFyIik7IC8vJE5PTi1OTFMtMSQNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuRGF0ZSIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyIik7IC8vJE5PTi1OTFMtMSQNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXIiKTsgLy8kTk9OLU5MUy0xJAkNCi0NCi0JCS8vIEFycmF5IEJhc2VkIFR5cGVzDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLkFycmF5TGlzdCIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLkhhc2hTZXQiKTsgLy8kTk9OLU5MUy0xJA0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmEudXRpbC5MaW5rZWRMaXN0Iik7IC8vJE5PTi1OTFMtMSQNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuTGlzdCIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLlN0YWNrIik7IC8vJE5PTi1OTFMtMSQNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuVmVjdG9yIik7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCS8vIE90aGVycw0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmEubWF0aC5CaWdEZWNpbWFsIik7IC8vJE5PTi1OTFMtMSQNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLm1hdGguQmlnSW50ZWdlciIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLk9iamVjdCIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLlVVSUQiKTsgLy8kTk9OLU5MUy0xJA0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmEubmV0LlVSSSIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS5hd3QuSW1hZ2UiKTsgLy8kTk9OLU5MUy0xJA0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmF4LnhtbC5kYXRhdHlwZS5EdXJhdGlvbiIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2UiKTsgLy8kTk9OLU5MUy0xJA0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIiKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJLy8gSmF2YSBwcmltaXRpdmUgdHlwZSB3cmFwcGVyIGNsYXNzZXMNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLmxhbmcuU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLmxhbmcuQm9vbGVhbiIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLkludGVnZXIiKTsgLy8kTk9OLU5MUy0xJA0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5DaGFyYWN0ZXIiKTsgLy8kTk9OLU5MUy0xJA0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5GbG9hdCIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLkJ5dGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5Eb3VibGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5Mb25nIik7IC8vJE5PTi1OTFMtMSQNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLmxhbmcuU2hvcnQiKTsgLy8kTk9OLU5MUy0xJA0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5Wb2lkIik7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmEuaW8uU2VyaWFsaXphYmxlIik7IC8vJE5PTi1OTFMtMSQNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLmxhbmcuQ2xvbmVhYmxlIik7IC8vJE5PTi1OTFMtMSQNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLmxhbmcuQ29tcGFyYWJsZSIpOyAvLyROT04tTkxTLTEkDQotDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLk1hcCIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLkhhc2hNYXAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmEudXRpbC5IYXNodGFibGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmEudXRpbC5Db2xsZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCS8vIEZvciB0aGVzZSBqYXZhLiogdHlwZXMgYXR0cmlidXRlcyBhcmUgcmVzb2x2ZWQsIGkuZSB0aGV5IGFyZSBzdG9yZWQgYXMNCi0JCS8vIHN0cnVjdHVyZSBpZiB0aGV5IGNvbnRhaW4gZmllbGRzLg0KLQkJQU5BTFlTRURfSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5FeGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJA0KLQkJQU5BTFlTRURfSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5UaHJvd2FibGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJQU5BTFlTRURfSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5TdGFja1RyYWNlRWxlbWVudCIpOyAvLyROT04tTkxTLTEkDQotDQotCQlBTExPV0VEX0lOX01VTFRZSU5IRVJJVEFOQ0UuYWRkKEdlbmVyYWxUeXBlc05hbWVzLkpBVkFfTEFOR19DTE9ORUFCTEUpOyAvLyAkTk9OLU5MUyQNCi0JCUFMTE9XRURfSU5fTVVMVFlJTkhFUklUQU5DRS5hZGQoR2VuZXJhbFR5cGVzTmFtZXMuSkFWQV9JT19TRVJJQUxJWkFCTEUpOyAvLyAkTk9OLU5MUyQNCi0JCUFMTE9XRURfSU5fTVVMVFlJTkhFUklUQU5DRS5hZGQoR2VuZXJhbFR5cGVzTmFtZXMuSkFWQV9MQU5HX0NPTVBBUkFCTEUpOyAvLyAkTk9OLU5MUyQNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb1ZhbGlkYXRlKFR5cGVBZGFwdGVyIHR5cGUpIHRocm93cyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBWYWxpZGF0ZXMgPGNvZGU+dHlwZTwvY29kZT4uIFRoZSBmaXJzdCBzdGVwIGlzIHRobyBjaGVjayB0aGUgY2FjaGUgaWYgdGhpcyB0eXBlIGhhcyBiZWVuIGNoZWNrZWQgYWxyZWFkeS4gSWYgeWVzIHRoZSBwcmV2aXVvcyB2YWxpZGF0aW9uDQotCSAqIHJlc3VsdCBpcyByZXR1cm5lZCBpZiBubyBhIGNoZWNrIGlzIHBlcmZvcm1lZCBhbmQgdGhlIHJlc3VsdCBpcyBjaGFjaGVkLiBJbnRlcm5hbGx5IGNhbGxzIGRvVmFsaWRhdGUodHlwZSkgd2hpY2ggc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5DQotCSAqIGV4dGVuZGluZyBjbGFzc2VzLg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGUgLQ0KLQkgKiAgICAgICAgICAgIGNoZWNrZWQgdHlwZQ0KLQkgKiBAdGhyb3dzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElUeXBlIHR5cGUpIHRocm93cyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJYW5hbHl6ZWQuY2xlYXIoKTsNCi0JCXZhbGlkYXRlSW50ZXJuYWwobmV3IFR5cGVBZGFwdGVyKHR5cGUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVmFsaWRhdGVzIDxjb2RlPnR5cGU8L2NvZGU+LiBUaGUgZmlyc3Qgc3RlcCBpcyB0aG8gY2hlY2sgdGhlIGNhY2hlIGlmIHRoaXMgdHlwZSBoYXMgYmVlbiBjaGVja2VkIGFscmVhZHkuIElmIHllcyB0aGUgcHJldml1b3MgdmFsaWRhdGlvbg0KLQkgKiByZXN1bHQgaXMgcmV0dXJuZWQgaWYgbm8gYSBjaGVjayBpcyBwZXJmb3JtZWQgYW5kIHRoZSByZXN1bHQgaXMgY2hhY2hlZC4gSW50ZXJuYWxseSBjYWxscyBkb1ZhbGlkYXRlKHR5cGUpIHdoaWNoIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieQ0KLQkgKiBleHRlbmRpbmcgY2xhc3Nlcy4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlIC0NCi0JICogICAgICAgICAgICBjaGVja2VkIHR5cGUNCi0JICogQHRocm93cyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUludGVybmFsKFR5cGVBZGFwdGVyIHR5cGUpIHRocm93cyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgVHlwZUtleSBrZXkgPSBuZXcgVHlwZUtleSh0eXBlLmdldFByb2plY3ROYW1lKCksIHR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsNCi0NCi0JCS8vIGNoZWNrIGZvciBjaXJjdWxhciB0eXBlIGNoZWNrDQotCQlpZiAoYW5hbHl6ZWQuY29udGFpbnMoa2V5KSkNCi0JCXsNCi0JCQlyZXR1cm47DQotCQl9DQotDQotCQlhbmFseXplZC5hZGQoa2V5KTsNCi0NCi0JCWZpbmFsIElTdGF0dXMgc3RhdHVzID0gc3RhdHVzTWFwLmdldChrZXkpOw0KLQkJaWYgKHN0YXR1cyAhPSBudWxsKQ0KLQkJew0KLQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKQ0KLQkJCXsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0NCi0JCQl0aHJvdyAoSW5hZG1pc3NhYmxlVHlwZUV4Y2VwdGlvbikgc3RhdHVzLmdldEV4Y2VwdGlvbigpOw0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJZG9WYWxpZGF0ZSh0eXBlKTsNCi0JCQlzdGF0dXNNYXAucHV0KGtleSwgcHJlcGFyZVN0YXR1cyhudWxsKSk7DQotCQl9IGNhdGNoIChJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJc3RhdHVzTWFwLnB1dChrZXksIHByZXBhcmVTdGF0dXMoZSkpOw0KLQkJCXRocm93IGU7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIGlmIDxjb2RlPnRocm93YWJsZTwvY29kZT4gaXMgbnVsbCBwcmVwYXJlcyBzdGF0dXMgd2l0aCBzZXZlcml0eSBJU3RhdHVzLk9LIGFuZCBlbXB0eSBtZXNzYWdlLiBJZiA8Y29kZT50aHJvd2FibGU8L2NvZGU+IGlzIG5vdCBudWxsDQotCSAqIHByZXBhcmVzIHN0YXR1cyB3aXRoIHNldmVyaXR5IElTdGF0dXMuRVJST1IgYW5kIG1lc3NhZ2UgdGhlIGNvbnRhaW5lZCBpbiA8Y29kZT50aHJvd2FibGU8L2NvZGU+IGVycm9yIG1lc3NhZ2UuDQotCSAqIA0KLQkgKiBAcGFyYW0gdGhyb3dhYmxlDQotCSAqIEByZXR1cm4gSVN0YXR1cyB3aXRoIHNldmVyaXR5IElTdGF0dXMuT0sgaWYgPHR0PnRocm93YWJsZTwvdHQ+IGlzIG51bGwgLCBvciBJU3RhdHVzLkVSUk9SIGluY2x1ZGluZyBlcnJvciBtZXNzYWdlIGRlY3JpYmluZyB0aGUgcHJvYmxlbS4NCi0JICovDQotCXByaXZhdGUgSVN0YXR1cyBwcmVwYXJlU3RhdHVzKFRocm93YWJsZSB0aHJvd2FibGUpDQotCXsNCi0JCWZpbmFsIElTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cygodGhyb3dhYmxlID09IG51bGwpID8gSVN0YXR1cy5PSyA6IElTdGF0dXMuRVJST1IsIEpheFdzRG9tUnVudGltZVBsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuT0ssDQotCQkJCQkJCQkJCSh0aHJvd2FibGUgPT0gbnVsbCkgPyAiIiA6IHRocm93YWJsZS5nZXRNZXNzYWdlKCksIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJdGhyb3dhYmxlKTsNCi0NCi0JCXJldHVybiBzdGF0dXM7DQotCX0NCi0NCi0JLyoqDQotCSAqIERlZmluZXMgaWYgPGNvZGU+dHlwZU5hbWU8L2NvZGU+IG9uZSBmb3JtIGphdmEuKiBvciBqYXZheC4qIHBhY2thZ2VzLg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGVOYW1lDQotCSAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiA8dHQ+dHlwZU5hbWU8L3R0PiBpcyBmcm9tIGphdmEgc3RhbmRhcmQgY2xhc3Nlcy4NCi0JICovDQotCXByb3RlY3RlZCBib29sZWFuIGlzSmF2YVR5cGUoU3RyaW5nIHR5cGVOYW1lKQ0KLQl7DQotCQlyZXR1cm4gdHlwZU5hbWUuc3RhcnRzV2l0aCgiamF2YS4iKSAvLyROT04tTkxTLTEkDQotCQkJCQkJCQkJCXx8IHR5cGVOYW1lLnN0YXJ0c1dpdGgoImphdmF4LiIpOyAvLyROT04tTkxTLTEkDQotCX0NCi0NCi0JLyoqDQotCSAqIERlZmluZXMgaWYgPGNvZGU+dHlwZU5hbWU8L2NvZGU+IGlzIGFsbG93ZWQgamF2YSB0eXBlLiBUaGUgbGlzdCBvZiBhbGxvd2VkIGphdmEgdHlwZXMgY2FuIGJlIGZvdW5kIGluIHN0YXRpYyBzZWN0aW9uIG9mIHRoaXMgY2xhc3MuDQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZU5hbWUNCi0JICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIDx0dD50eXBlTmFtZTwvdHQ+IGlzIGFsbG93ZWQgdG8gYmUgdXNlZCBpbiBXZWIgU2VydmljZS4NCi0JICovDQotCXByb3RlY3RlZCBib29sZWFuIGlzQWxsb3dlZEphdmFUeXBlKFN0cmluZyB0eXBlTmFtZSkNCi0Jew0KLQkJcmV0dXJuIEpBVkFfVFlQRVMuY29udGFpbnModHlwZU5hbWUpIHx8IEFOQUxZU0VEX0pBVkFfVFlQRVMuY29udGFpbnModHlwZU5hbWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVja3MgaWYgPGNvZGU+dHlwZTwvY29kZT4gaW1wbGVtZW50cyBqYXZhLnJtaS5SZW1vdGUgaW50ZXJmYWNlLg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGUNCi0JICogQHRocm93cyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1JlbW90ZU5vdEltcGxlbWVudGVkKFR5cGVBZGFwdGVyIHR5cGUpIHRocm93cyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKHR5cGUuaXNJbXBsZW1lbnRpbmcoR2VuZXJhbFR5cGVzTmFtZXMuSkFWQV9STUlfUkVNT1RFKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgUmVtb3RlT2JqZWN0RXhjZXB0aW9uKHR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIGlmIDxjb2RlPnR5cGU8L2NvZGU+IGltcGxlbWVudHMgbXVsdGlwbGUgaW50ZXJmYWNlcy4gQ2xhc3NlcyB0aGF0IGV4dGVuZCBjbGFzcyBvdGhlciB0aGFuIGphdmEubGFuZy5PYmplY3Qgc2hvdWxkIG5vdCBpbXBsZW1lbnQgYW55DQotCSAqIGludGVyZmFjZS4gQ2xhc3NlcyB0aGF0IGV4dGVuZCBqYXZhLmxhbmcuT2JqZWN0IGNhbiBpbXBsZW1lbnQgb25seSBvbmUgaW50ZXJmYWNlLjxicj4NCi0JICogPGJyPg0KLQkgKiBOb3RlOiBUaGUgZm9sbG93aW5nIGludGVyZmFjZXMgYXJlIHNraXBwZWQgZnJvbSBjaGVjazo8YnI+DQotCSAqIDx1bD4NCi0JICogamF2YS5pby5TZXJpYWxpemJsZTxicj4NCi0JICogamF2YS5sYW5nLkNsb25hYmxlPGJyPg0KLQkgKiBqYXZhLmxhbmcuQ29tcGFyYWJsZTxicj4NCi0JICogPC91bD4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlDQotCSAqIEB0aHJvd3MgSW5hZG1pc3NhYmxlVHlwZUV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tNdWx0aXBsZUluaGVyaXRhbmNlKFR5cGVBZGFwdGVyIHR5cGUpIHRocm93cyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJTGlzdDxTdHJpbmc+IGludGVyZmFjZU5hbWVzID0gdHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpOw0KLQkJZmluYWwgU3RyaW5nIHN1cGVyQ2xhc3NOYW1lID0gdHlwZS5nZXRTdXBlckNsYXNzTmFtZSgpOw0KLQkJaWYgKHN1cGVyQ2xhc3NOYW1lID09IG51bGwgfHwgc3VwZXJDbGFzc05hbWUuZXF1YWxzKEdlbmVyYWxUeXBlc05hbWVzLkpBVkFfTEFOR19PQkpFQ1QpDQotCQkJCQkJCQkJCXx8IHN1cGVyQ2xhc3NOYW1lLmVxdWFscyhHZW5lcmFsVHlwZXNOYW1lcy5KQVZBX0xBTkdfRVhDRVBUSU9OKSkNCi0JCXsNCi0JCQlpZiAoIWNoZWNrSW50ZXJmYWNlSW1wbGVtZW50YXRpb25Db3VudChpbnRlcmZhY2VOYW1lcywgMSkpDQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTXVsdGlwbGVJbXBsZW1lbnRhdGlvbkV4Y2VwdGlvbih0eXBlLmdldFF1YWxpZmllZE5hbWUoKSwgaW50ZXJmYWNlTmFtZXMuZ2V0KDApLCBpbnRlcmZhY2VOYW1lcy5nZXQoMSkpOw0KLQkJCX0NCi0JCX0gZWxzZQ0KLQkJew0KLQkJCWlmICghY2hlY2tJbnRlcmZhY2VJbXBsZW1lbnRhdGlvbkNvdW50KGludGVyZmFjZU5hbWVzLCAwKSkNCi0JCQl7DQotCQkJCXRocm93IG5ldyBJbmhlcml0YW5jZUFuZEltcGxlbWVudGF0aW9uRXhlY3B0aW9uKHR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpLCBzdXBlckNsYXNzTmFtZSk7DQotCQkJfQ0KLQ0KLQkJCWNoZWNrTXVsdGlwbGVJbmhlcml0YW5jZSh0eXBlLmdldFN1cGVyQ2xhc3NUeXBlKCkpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVja3MgaWYgPGNvZGU+aW50ZXJmYWNlTmFtZXM8L2NvZGU+IGFyZSBtb3JlIHRoYW4gPGNvZGU+bWF4QWxsb3dlZDwvY29kZT4gaW50ZXJmYWNlcy4gTm90ZTogVGhlIGZvbGxvd2luZyBpbnRlcmZhY2VzIGFyZSBza2lwcGVkIGZyb20NCi0JICogY2hlY2s6PGJyPg0KLQkgKiA8dWw+DQotCSAqIGphdmEuaW8uU2VyaWFsaXpibGU8YnI+DQotCSAqIGphdmEubGFuZy5DbG9uYWJsZTxicj4NCi0JICogamF2YS5sYW5nLkNvbXBhcmFibGU8YnI+DQotCSAqIDwvdWw+DQotCSAqIA0KLQkgKiBAcGFyYW0gaW50ZXJmYWNlTmFtZXMNCi0JICogQHBhcmFtIG1heEFsbG93ZWQgLQ0KLQkgKiAgICAgICAgICAgIG51bWJlciBvZiBtYXhpbXVtIGFsbG93ZWQgaW1wbGVtZW50YXRpb25zDQotCSAqLw0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0ludGVyZmFjZUltcGxlbWVudGF0aW9uQ291bnQoTGlzdDxTdHJpbmc+IGludGVyZmFjZU5hbWVzLCBpbnQgbWF4QWxsb3dlZCkNCi0Jew0KLQkJaWYgKGludGVyZmFjZU5hbWVzID09IG51bGwgfHwgaW50ZXJmYWNlTmFtZXMuc2l6ZSgpID09IDApDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotDQotCQlpbnQgbm9uZUFsbG93ZWRJbnRlcmZhY2VDb3VudCA9IDA7DQotCQlmb3IgKFN0cmluZyBpbnRlcmZhY2VOYW1lIDogaW50ZXJmYWNlTmFtZXMpDQotCQl7DQotCQkJaWYgKEFMTE9XRURfSU5fTVVMVFlJTkhFUklUQU5DRS5jb250YWlucyhpbnRlcmZhY2VOYW1lKSkNCi0JCQl7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0NCi0JCQlub25lQWxsb3dlZEludGVyZmFjZUNvdW50Kys7DQotCQkJaWYgKG5vbmVBbGxvd2VkSW50ZXJmYWNlQ291bnQgPiBtYXhBbGxvd2VkKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGZhbHNlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBJbmFkbWlzc2FibGUgYXJlIG1lbWJlciBjbGFzc2VzIHRoYXQgYXJlIG5vdCAicHVibGljIHN0YXRpYyIuDQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZQ0KLQkgKiBAdGhyb3dzIEhhc0luYWRtaXNhYmxlSW5uZXJUeXBlc0V4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tGb3JJbmFkbWlzc2FibGVJbm5lckNsYXNzZXMoVHlwZUFkYXB0ZXIgdHlwZSkgdGhyb3dzIEhhc0luYWRtaXNhYmxlSW5uZXJUeXBlc0V4Y2VwdGlvbiwgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmICh0eXBlLmhhc05vblN0YXRpY09yTm9uUHVibGljSW5uZXJUeXBlcygpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBIYXNJbmFkbWlzYWJsZUlubmVyVHlwZXNFeGNlcHRpb24odHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL0Fic3RyYWN0Q2xhc3NOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvQWJzdHJhY3RDbGFzc05vdEltcGxlbWVudGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0MDRjNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvQWJzdHJhY3RDbGFzc05vdEltcGxlbWVudGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnM7DQotDQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZU1lc3NhZ2VzOw0KLQ0KLS8qKg0KLSAqIEV4Y2VwdGlvbiB1c2VkIHdoZW4gYSBSVCBjbGFzcyBpcyBhYnN0cmFjdCBhbmQgaXMgbm90IGltcGxlbWVudGVkLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RDbGFzc05vdEltcGxlbWVudGVkRXhjZXB0aW9uIGV4dGVuZHMgSW5hZG1pc3NhYmxlVHlwZUV4Y2VwdGlvbg0KLXsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTU4NzE0NTgzMjkwNjg5NjY1ODFMOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0aW9uLg0KLQkgKiANCi0JICogQHBhcmFtIGNsYXNzRlFOYW1lDQotCSAqLw0KLQlwdWJsaWMgQWJzdHJhY3RDbGFzc05vdEltcGxlbWVudGVkRXhjZXB0aW9uKFN0cmluZyBjbGFzc0ZRTmFtZSkNCi0Jew0KLQkJc3VwZXIoTWVzc2FnZUZvcm1hdC5mb3JtYXQoIkFic3RyYWN0IGNsYXNzIHswfSBjYW5ub3QgYmUgdXNlZCBhcyBydW50aW1lIGNsYXNzIGJlY2F1c2UgaXQgaXMgbm90IGV4dGVuZGVkIGJ5IG5vbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBpcyBzdWl0YWJsZSBmb3IgYSBydW50aW1lIGNsYXNzIiwgY2xhc3NGUU5hbWUpLCAvLyROT04tTkxTLTEkDQotCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLkFic3RyYWN0Q2xhc3NOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbl9FcnJvcl9NZXNzYWdlLCBjbGFzc0ZRTmFtZSkpOw0KLQkJDQotCQkNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9Db25zdHJ1Y3Rvck5vdEV4cG9zYWJsZUV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvQ29uc3RydWN0b3JOb3RFeHBvc2FibGVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTM1OGJhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9Db25zdHJ1Y3Rvck5vdEV4cG9zYWJsZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVNZXNzYWdlczsNCi0NCi0vKioNCi0gKiBFeGNlcHRpb24gdXNlZCB0byBkZXNjcmliZSB0aGF0IHRoZSBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgZXhwb3NlZCBpbiBXUy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIENvbnN0cnVjdG9yTm90RXhwb3NhYmxlRXhjZXB0aW9uIGV4dGVuZHMgTWV0aG9kTm90RXhwb3NhYmxlRXhjZXB0aW9uDQotew0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0NTA0NzQyODI0NDk1MDU3OTU2TDsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIA0KLQkgKiBAcGFyYW0gbWV0aG9kTmFtZQ0KLQkgKi8NCi0JcHVibGljIENvbnN0cnVjdG9yTm90RXhwb3NhYmxlRXhjZXB0aW9uKFN0cmluZyBtZXRob2ROYW1lKQ0KLQl7DQotCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdCgiQ29uc3RydWN0b3IgezB9IGNhbm5vdCBiZSBleHBvc2VkIGFzIHdlYiBzZXJ2aWNlIG9wZXJhdGlvbiIsIG1ldGhvZE5hbWUpLCAvLyROT04tTkxTLTEkDQotCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLkNvbnN0cnVjdG9yTm90RXhwb3NhYmxlRXhjZXB0aW9uX0Vycm9yX01lc3NhZ2UsIG1ldGhvZE5hbWUpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9IYXNJbmFkbWlzYWJsZUlubmVyVHlwZXNFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL0hhc0luYWRtaXNhYmxlSW5uZXJUeXBlc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZTFjMzUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL0hhc0luYWRtaXNhYmxlSW5uZXJUeXBlc0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVNZXNzYWdlczsNCi0NCi0vKioNCi0gKiBFeGNlcHRpb24gdXNlZCBpbiBjYXNlIHdoZW4gYW4gUlQgY2xhc3MgY29udGFpbnMgaW5uZXIgY2xhc3MgdGhhdCBkb2VzIG5vdCBmdWxmaWwgdGhlIHJlcXVpcmVtZW50cy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEhhc0luYWRtaXNhYmxlSW5uZXJUeXBlc0V4Y2VwdGlvbiBleHRlbmRzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24NCi17DQotCXN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yLiBDcmVhdGVzIG1lYW5pbmdmdWxsIG1lc3NhZ2UgdXNpbmcgPHR0PmNsYXNzTmFtZTwvdHQ+DQotCSAqIA0KLQkgKiBAcGFyYW0gY2xhc3NOYW1lDQotCSAqLw0KLQlwdWJsaWMgSGFzSW5hZG1pc2FibGVJbm5lclR5cGVzRXhjZXB0aW9uKFN0cmluZyBjbGFzc05hbWUpDQotCXsNCi0JCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJDbGFzcyB7MH0gaGFzIGlubmVyIHR5cGVzIHRoYXQgYXJlIG5vdCBwdWJsaWMgYW5kIHN0YXRpYyIsIGNsYXNzTmFtZSkgLy8kTk9OLU5MUy0xJA0KLQkJCQksDQotCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLkhhc0luYWRtaXNhYmxlSW5uZXJUeXBlc0V4Y2VwdGlvbl9FcnJvcl9NZXNzYWdlLCBjbGFzc05hbWUpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9JbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9JbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ2NDgyMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvSW5hZG1pc3NhYmxlVHlwZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zOw0KLQ0KLS8qKg0KLSAqIEFic3RyYWN0IGNsYXNzIGZvciBleGNlcHRpb25zIGluIHR5cGUgdmFsaWRhdGlvbi4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24NCi17DQotCXN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsNCi0JZmluYWwgU3RyaW5nIGxvY2FsaXplZE1lc3NhZ2U7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvci4NCi0JICogDQotCSAqIEBwYXJhbSByZWFzb24gLQ0KLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNhZ2UNCi0JICovDQotCXB1YmxpYyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uKFN0cmluZyByZWFzb24sIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlKQ0KLQl7DQotCQlzdXBlcihyZWFzb24pOw0KLQkJdGhpcy5sb2NhbGl6ZWRNZXNzYWdlID0gbG9jYWxpemVkTWVzc2FnZTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKCkgew0KLQkJcmV0dXJuIGxvY2FsaXplZE1lc3NhZ2U7DQotCX0NCi0JDQotCQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9Jbmhlcml0YW5jZUFuZEltcGxlbWVudGF0aW9uRXhlY3B0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9Jbmhlcml0YW5jZUFuZEltcGxlbWVudGF0aW9uRXhlY3B0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk5OWU0YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvSW5oZXJpdGFuY2VBbmRJbXBsZW1lbnRhdGlvbkV4ZWNwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVNZXNzYWdlczsNCi0NCi0vKioNCi0gKiBFeGNlcHRpb24gdXNlZCBpbiBSVCB2YWxpZGF0aW9uIHdoZW4gYW4gUlQgY2xhc3MgaGFzIG11bHR5IGluaGVyaXRhbmNlIHZpYSBleHRlbnRpb24gYW5kIGltcGxlbWVudGF0aW9uLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJbmhlcml0YW5jZUFuZEltcGxlbWVudGF0aW9uRXhlY3B0aW9uIGV4dGVuZHMgSW5hZG1pc3NhYmxlVHlwZUV4Y2VwdGlvbg0KLXsNCi0Jc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0aW9uLg0KLQkgKiANCi0JICogQHBhcmFtIGNsYXNzTmFtZQ0KLQkgKiBAcGFyYW0gaW50ZXJmYWNlTmFtZQ0KLQkgKi8NCi0JcHVibGljIEluaGVyaXRhbmNlQW5kSW1wbGVtZW50YXRpb25FeGVjcHRpb24oU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGludGVyZmFjZU5hbWUpDQotCXsNCi0JCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJDbGFzcyB7MH0gZXh0ZW5kcyB7MX0gYW5kIGltcGxlbWVudHMgY3VzdG9tIGludGVyZmFjZSAobXVsdGlwbGUgaW5oZXJpdGFuY2UgaXMgbm90IGFsbG93ZWQpIiwgY2xhc3NOYW1lLCBpbnRlcmZhY2VOYW1lKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5Jbmhlcml0YW5jZUFuZEltcGxlbWVudGF0aW9uRXhlY3B0aW9uX0Vycm9yX01lc3NhZ2UsIGNsYXNzTmFtZSwgaW50ZXJmYWNlTmFtZSkpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL0ludGVyZmFjZXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL0ludGVyZmFjZXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTI3MGM0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9JbnRlcmZhY2VzTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnM7DQotDQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZU1lc3NhZ2VzOw0KLQ0KLS8qKg0KLSAqIEV4Y2VwdGlvbiB1c2VkIHdoZW4gYW4gaW50ZXJmYWNlIGlzIHVzZWQgYXMgUlQgY2xhc3MuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJbnRlcmZhY2VzTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4dGVuZHMgSW5hZG1pc3NhYmxlVHlwZUV4Y2VwdGlvbg0KLXsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rpb24uDQotCSAqIA0KLQkgKiBAcGFyYW0gaW50ZXJmYWNlRlFOYW1lDQotCSAqLw0KLQlwdWJsaWMgSW50ZXJmYWNlc05vdFN1cHBvcnRlZEV4Y2VwdGlvbihTdHJpbmcgaW50ZXJmYWNlRlFOYW1lKQ0KLQl7DQotCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdCgiezB9IGlzIGEgaW50ZXJmYWNlLCBhbmQgSkFYQiBjYW5ub3QgaGFuZGxlIGludGVyZmFjZXMiLCBpbnRlcmZhY2VGUU5hbWUpLCAvLyROT04tTkxTLTEkDQotCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLkludGVyZmFjZXNOb3RTdXBwb3J0ZWRFeGNlcHRpb25fRXJyb3JfTWVzc2FnZSwgaW50ZXJmYWNlRlFOYW1lKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvTWV0aG9kTm90RXhwb3NhYmxlRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9NZXRob2ROb3RFeHBvc2FibGVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDliYTY2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9NZXRob2ROb3RFeHBvc2FibGVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuZXhjZXB0aW9uczsNCi0NCi0vKioNCi0gKiBFeGNlcHRpb24gdXNlZCB3aGVuIGEgbWV0aG9kIGNhbm5vdCBiZSBleHBvc2VkIGFzIFdTLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTWV0aG9kTm90RXhwb3NhYmxlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDA2NjQxNTg1NDQxMDkwOTY2TDsNCi0NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbG9jYWxpemVkTWVzc2FnZTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogQHBhcmFtIGxvY2FsaXplZE1lc3NhZ2UNCi0JICovDQotCXB1YmxpYyBNZXRob2ROb3RFeHBvc2FibGVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlKSB7DQotCQlzdXBlcihtZXNzYWdlKTsNCi0JCXRoaXMubG9jYWxpemVkTWVzc2FnZSA9IGxvY2FsaXplZE1lc3NhZ2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIFByb3ZpZGVzIGxvY2FsaXplZCBtZXNzYWdlIG9mIGV4Y2VwdGlvbiANCi0JICogKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxpemVkTWVzc2FnZSgpIHsNCi0JCXJldHVybiBsb2NhbGl6ZWRNZXNzYWdlOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL01ldGhvZE5vdFB1YmxpY0V4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvTWV0aG9kTm90UHVibGljRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZmNTUwNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvTWV0aG9kTm90UHVibGljRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnM7DQotDQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZU1lc3NhZ2VzOw0KLQ0KLS8qKg0KLSAqIFVzZWQgd2hlbiBhbiBtZXRob2QgaXMgbm90IHB1YmxpYyBhbmQgdGhhdCBpcyB3aHkgaXQgY2Fubm90IGJlIGV4cG9zZWQgYXMgV1MuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNZXRob2ROb3RQdWJsaWNFeGNlcHRpb24gZXh0ZW5kcyBNZXRob2ROb3RFeHBvc2FibGVFeGNlcHRpb24NCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NzkyMzQyMTg3Njk4NTU4Njg3TDsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yLg0KLQkgKiANCi0JICogQHBhcmFtIG1ldGhvZE5hbWUNCi0JICovDQotCXB1YmxpYyBNZXRob2ROb3RQdWJsaWNFeGNlcHRpb24oU3RyaW5nIG1ldGhvZE5hbWUpDQotCXsNCi0JCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJNZXRob2QgezB9IGlzIG5vdCBwdWJsaWMgYW5kIGNhbm5vdCBiZSBleHBvc2VkIGFzIGEgd2ViIHNlcnZpY2Ugb3BlcmF0aW9uIiwgbWV0aG9kTmFtZSksIC8vJE5PTi1OTFMtMSQNCi0JCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuTWV0aG9kTm90UHVibGljRXhjZXB0aW9uX0Vycm9yX01lc3NhZ2UgLCBtZXRob2ROYW1lKSk7IA0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL011bHRpcGxlSW1wbGVtZW50YXRpb25FeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL011bHRpcGxlSW1wbGVtZW50YXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWFmNzU5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9NdWx0aXBsZUltcGxlbWVudGF0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnM7DQotDQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZU1lc3NhZ2VzOw0KLQ0KLS8qKg0KLSAqIEV4Y2VwdGlvbiB1c2VkIGluIGNhc2UgUlQgY2xhc3MgaW1wbGVtZW50cyBtb3JlIHRoYXQgMSBpbnRlcmZhY2Ugd2ljaCBpcyBub3QgYWxsb3dlZC4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIE11bHRpcGxlSW1wbGVtZW50YXRpb25FeGNlcHRpb24gZXh0ZW5kcyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uDQotew0KLQlzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1c3Rvci4NCi0JICogDQotCSAqIEBwYXJhbSBjbGFzc05hbWUgLQ0KLQkgKiAgICAgICAgICAgIFJUIGNsYXNzIG5hbWUNCi0JICogQHBhcmFtIGludGVyZmFjZTEgLQ0KLQkgKiAgICAgICAgICAgIGltcGxlbWVudGVkIGludGVyZmFjZSAxDQotCSAqIEBwYXJhbSBpbnRlcmZhY2UyIC0NCi0JICogICAgICAgICAgICBpbXBsZW1lbnRlZCBpbnRlcmZhY2UgMg0KLQkgKi8NCi0JcHVibGljIE11bHRpcGxlSW1wbGVtZW50YXRpb25FeGNlcHRpb24oU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGludGVyZmFjZTEsIFN0cmluZyBpbnRlcmZhY2UyKQ0KLQl7DQotCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdCgiQ2xhc3MgezB9IGltcGxlbWVudHMgYm90aCBpbnRlcmZhY2UgezF9IGFuZCBpbnRlcmZhY2UgezJ9IChtdWx0aXBsZSBpbmhlcml0YW5jZSBpcyBub3QgYWxsb3dlZCkiLCBjbGFzc05hbWUsIGludGVyZmFjZTEsIGludGVyZmFjZTIpLCAvLyROT04tTkxTLTEkDQotCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLk11bHRpcGxlSW1wbGVtZW50YXRpb25FeGNlcHRpb25fRXJyb3JfTWVzc2FnZSwgY2xhc3NOYW1lLCBpbnRlcmZhY2UxLCBpbnRlcmZhY2UyKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvTm9EZWZhdWx0Q29uc3RydWN0b3JFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL05vRGVmYXVsdENvbnN0cnVjdG9yRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmYmUwZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvTm9EZWZhdWx0Q29uc3RydWN0b3JFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuZXhjZXB0aW9uczsNCi0NCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4uSmF4V3NEb21SdW50aW1lTWVzc2FnZXM7DQotDQotLyoqDQotICogRXhjZXB0aW9uIGZvciBSVCBjbGFzcyB3aGVuIHRoZXJlIGlzIG5vIGRlZmF1bHQgY29uc3RydWN0b3IgaW4gY2xhc3MuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBOb0RlZmF1bHRDb25zdHJ1Y3RvckV4Y2VwdGlvbiBleHRlbmRzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24NCi17DQotCXN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZU5hbWUgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIFJUIGNsYXNzDQotCSAqLw0KLQlwdWJsaWMgTm9EZWZhdWx0Q29uc3RydWN0b3JFeGNlcHRpb24oU3RyaW5nIHR5cGVOYW1lKQ0KLQl7DQotCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdCgiQ2xhc3MgezB9IGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yIiwgdHlwZU5hbWUpLCAvLyROT04tTkxTLTEkDQotCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLkVuZHBvaW50VHlwZVZhbGlkYXRvcl9FUlJfTVNHX0NPTlNUUlVDVE9SLCB0eXBlTmFtZSkpOw0KLQkJDQotCQkNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9SZW1vdGVPYmplY3RFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL1JlbW90ZU9iamVjdEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YTZjYTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL1JlbW90ZU9iamVjdEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVNZXNzYWdlczsNCi0NCi0vKioNCi0gKiBFeGNlcHRpb24gd2ljaCBpcyB1c2VkIHRvIGRlZmluZSB0aGF0IHRoZSBSVCBjbGFzcyBpbXBsZW1lbnRzIGphdmEucm1pLlJlbW90ZQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUmVtb3RlT2JqZWN0RXhjZXB0aW9uIGV4dGVuZHMgSW5hZG1pc3NhYmxlVHlwZUV4Y2VwdGlvbg0KLXsNCi0Jc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IuDQotCSAqIA0KLQkgKiBAcGFyYW0gY2xhc3NOYW1lIC0NCi0JICogICAgICAgICAgICBSVCBjbGFzcw0KLQkgKi8NCi0JcHVibGljIFJlbW90ZU9iamVjdEV4Y2VwdGlvbihTdHJpbmcgY2xhc3NOYW1lKQ0KLQl7DQotCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdCgiQ2xhc3MgezB9IGlzIGEgcmVtb3RlIE9iamVjdCIsIGNsYXNzTmFtZSksIC8vJE5PTi1OTFMtMSQNCi0JCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuUmVtb3RlT2JqZWN0RXhjZXB0aW9uX0Vycm9yX01lc3NhZ2UsIGNsYXNzTmFtZSkpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL1R5cGVOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvVHlwZU5vdEZvdW5kRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM4ZjhjOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvVHlwZU5vdEZvdW5kRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnM7DQotDQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZU1lc3NhZ2VzOw0KLQ0KLS8qKg0KLSAqIENsYXNzIHVzZWQgd2hlbiB0eXBlIGlzIHNlYXJjaGVkIHRvIGRlZmluZSB0aGF0IHRoZSBjbGFzcyB3YXMgbm90IGZvdW5kLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgVHlwZU5vdEZvdW5kRXhjZXB0aW9uIGV4dGVuZHMgSW5hZG1pc3NhYmxlVHlwZUV4Y2VwdGlvbg0KLXsNCi0Jc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IuDQotCSAqIA0KLQkgKiBAcGFyYW0gY2xhc3NOYW1lIC0NCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBpcyBub3QgZm91bmQNCi0JICovDQotCXB1YmxpYyBUeXBlTm90Rm91bmRFeGNlcHRpb24oU3RyaW5nIGNsYXNzTmFtZSkNCi0Jew0KLQkJc3VwZXIoTWVzc2FnZUZvcm1hdC5mb3JtYXQoIkNsYXNzIHswfSBjYW5ub3QgYmUgZm91bmQiLCBjbGFzc05hbWUpLCAvLyROT04tTkxTLTEkDQotCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLlR5cGVOb3RGb3VuZEV4Y2VwdGlvbl9FcnJvcl9NZXNzYWdlLCBjbGFzc05hbWUpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vc2VpL1JlZHVuZGFudEF0dHJpYnV0ZXNDb25zdHJhaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vc2VpL1JlZHVuZGFudEF0dHJpYnV0ZXNDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ3NzVjMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3NlaS9SZWR1bmRhbnRBdHRyaWJ1dGVzQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5zZWk7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuRU5EUE9JTlRfSU5URVJGQUNFX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5QT1JUX05BTUVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLlNFUlZJQ0VfTkFNRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NETF9MT0NBVElPTl9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ubWVzc2FnZXMuVmFsaWRhdGlvbk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotDQotLyoqDQotICogQ2hlY2tzIGlmIFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBzZXQgb24gU0VJIGNvbnRhaW5zIHBvcnROYW1lLCBzZXJ2aWNlTmFtZSBvciBlbmRwb2ludEludGVyZmFjZSBhdHRyaWJ1dGVzLg0KLSAqIEFjY29yZGluZyB0byBqc3QtMTgxLCBwb2ludCAzLjIgc3ViLXBvaW50IDYgdGhpcyBpcyBub3QgYWxsb3dlZC4gIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUmVkdW5kYW50QXR0cmlidXRlc0NvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgW10gUkVEVU5EQU5UX0FUVFJJQlVURVMgPSB7UE9SVF9OQU1FX0FUVFJJQlVURSwgU0VSVklDRV9OQU1FX0FUVFJJQlVURSwgRU5EUE9JTlRfSU5URVJGQUNFX0FUVFJJQlVURSwgV1NETF9MT0NBVElPTl9BVFRSSUJVVEV9OyANCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciAtIG5vIHNwZWNpZmljIHByb2Nlc3NpbmcgaGVyZSANCi0JICovDQotCXB1YmxpYyBSZWR1bmRhbnRBdHRyaWJ1dGVzQ29uc3RyYWludCgpIHsNCi0JCXN1cGVyKG5ldyBTZWlDb25zdHJhaW50RGVzY3JpcHRvcigpKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9WYWxpZGF0ZShmaW5hbCBJVmFsaWRhdGlvbkNvbnRleHQgY3R4KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpY3R4LmdldFRhcmdldCgpOw0KLQkJaWYgKHNlaS5pc0ltcGxpY2l0KCkpIHsNCi0JCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMoc2VpKTsNCi0JCX0NCi0JCQ0KLQkJaWYgKGNvbnRhaW5zUmVkdW5kYW50QXR0cmlidXRlKHNlaSkpIHsNCi0JCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHNlaSwgVmFsaWRhdGlvbk1lc3NhZ2VzLlNlaVZhbGlkYXRpb25fUmVkdW5kYW50QXR0cmlidXRlcywgV1NfQU5OT1RBVElPTiwgbnVsbCk7DQotCQl9CQ0KLQ0KLQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHNlaSk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zUmVkdW5kYW50QXR0cmlidXRlKGZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpKQ0KLQl7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gZmluZEFubm90YXRpb24oc2VpLCBXU19BTk5PVEFUSU9OKTsNCi0JCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCWZvciAoU3RyaW5nIHJlZHVuZGFudEF0dHJpYnV0ZSA6IFJFRFVOREFOVF9BVFRSSUJVVEVTKSB7DQotCQkJaWYgKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShyZWR1bmRhbnRBdHRyaWJ1dGUpIT1udWxsKSB7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9zZWkvU2VpQ2xhc3NDb3JyZWN0Q29uc3RyYWludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3NlaS9TZWlDbGFzc0NvcnJlY3RDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkZjg0N2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3NlaS9TZWlDbGFzc0NvcnJlY3RDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnNlaTsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLkRvbTJSZXNvdXJjZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuU2VpVmFsaWRhdG9yOw0KLQ0KLS8qKg0KLSAqIENoZWNrcyB0aGUgU0VJIHVuZGVybGluZyBpbnRlcmZhY2UgaWYgaXMgY2FwYWJsZSB0byBiZSB1c2VkIGFzIFNFSSBhY2NvcmRpbmcgdG8gIA0KLSAqIGpzci0xODEgcG9pbnQgMy4yDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZWlDbGFzc0NvcnJlY3RDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludA0KLXsNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIC0gbm8gc3BlY2lmaWMgcHJvY2Vzc2luZyBoZXJlIA0KLQkgKi8NCi0JcHVibGljIFNlaUNsYXNzQ29ycmVjdENvbnN0cmFpbnQoKSANCi0Jew0KLQkJc3VwZXIobmV3IFNlaUNvbnN0cmFpbnREZXNjcmlwdG9yKCkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1ZhbGlkYXRlKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgU2VpVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBTZWlWYWxpZGF0b3IoKTsNCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpY3R4LmdldFRhcmdldCgpOw0KLQkJaWYgKHNlaS5pc0ltcGxpY2l0KCkpIHsNCi0JCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMoc2VpKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgSVR5cGUgc2VpVHlwZSA9IERvbTJSZXNvdXJjZU1hcHBlci5JTlNUQU5DRS5maW5kVHlwZShzZWkpOw0KLQkJaWYgKHNlaVR5cGUgPT0gbnVsbCkgew0KLQkJCXJldHVybiBjcmVhdGVPa1N0YXR1cyhzZWkpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZShzZWlUeXBlKTsNCi0JCWlmICghc3RhdHVzLmlzT0soKSkgew0KLQkJCXJldHVybiBjcmVhdGVTdGF0dXMoc2VpLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLCBXU19BTk5PVEFUSU9OLCBudWxsKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHNlaSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3NlaS9TZWlDb25zdHJhaW50RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3NlaS9TZWlDb25zdHJhaW50RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZWIzZGY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9zZWkvU2VpQ29uc3RyYWludERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uc2VpOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5tb2RlbC5Db25zdHJhaW50U2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4uSmF4V3NEb21SdW50aW1lUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5Eb21WYWxpZGF0aW9uQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5kb20udmFsaWRhdGlvbi5Eb21WYWxpZGF0aW9uQ29uc3RhbnRzOw0KLQ0KLS8qKg0KLSAqIFRoZSBjb25zdHJhaW50IGRlc2NyaXB0b3IgZm9yIFNFSSB2YWxpZGF0aW9uIGNvbnN0cmFpbnRzDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLWNsYXNzIFNlaUNvbnN0cmFpbnREZXNjcmlwdG9yIGV4dGVuZHMgRG9tVmFsaWRhdGlvbkNvbnN0cmFpbnREZXNjcmlwdG9yDQotew0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgew0KLQkJcmV0dXJuIERvbVZhbGlkYXRpb25Db25zdGFudHMuU0VJX0NPTlNUUkFJTlRfSUQ7DQotCX0NCi0NCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsNCi0JCXJldHVybiBKYXhXc0RvbVJ1bnRpbWVQbHVnaW4uUExVR0lOX0lEOw0KLQl9DQotDQotCXB1YmxpYyBDb25zdHJhaW50U2V2ZXJpdHkgZ2V0U2V2ZXJpdHkoKSB7DQotCQlyZXR1cm4gQ29uc3RyYWludFNldmVyaXR5LkVSUk9SOw0KLQl9DQotDQotCXB1YmxpYyBpbnQgZ2V0U3RhdHVzQ29kZSgpIHsNCi0JCXJldHVybiAtMjg7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3NlaS9TZWlDb25zdHJhaW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9zZWkvU2VpQ29uc3RyYWludFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2YzM2MTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3NlaS9TZWlDb25zdHJhaW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uc2VpOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLklNb2RlbENvbnN0cmFpbnQ7DQotDQotLyoqDQotICogQ29uc3RyYWludCBwcm92aWRlciBmb3IgU0VJIERPTSBvYmplY3RzDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZWlDb25zdHJhaW50UHJvdmlkZXIgDQotew0KLQlwcml2YXRlIFNldDxJTW9kZWxDb25zdHJhaW50PiBjb25zdHJhaW50czsNCi0JDQotCS8qKg0KLQkgKiBAcmV0dXJuIGNvbnN0cmFpbnRzIHJlbGF0ZWQgdG8gU0VJDQotCSAqLw0KLQlwdWJsaWMgQ29sbGVjdGlvbjxJTW9kZWxDb25zdHJhaW50PiBnZXRDb25zdHJhaW50cygpIA0KLQl7DQotCQlpZiAoY29uc3RyYWludHM9PW51bGwpIA0KLQkJew0KLQkJCWNvbnN0cmFpbnRzID0gbmV3IEhhc2hTZXQ8SU1vZGVsQ29uc3RyYWludD4oKTsNCi0JCQljb25zdHJhaW50cy5hZGQobmV3IFNlaU5hbWVJbk5DTmFtZUNvbnN0cmFpbnQoKSk7DQotCQkJY29uc3RyYWludHMuYWRkKG5ldyBUYXJnZXROc1ZhbGlkVXJpQ29uc3RyYWludCgpKTsNCi0JCQljb25zdHJhaW50cy5hZGQobmV3IFJlZHVuZGFudEF0dHJpYnV0ZXNDb25zdHJhaW50KCkpOw0KLQkJCWNvbnN0cmFpbnRzLmFkZChuZXcgU2VpQ2xhc3NDb3JyZWN0Q29uc3RyYWludCgpKTsNCi0JCX0NCi0NCi0JCXJldHVybiBjb25zdHJhaW50czsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vc2VpL1NlaU5hbWVJbk5DTmFtZUNvbnN0cmFpbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9zZWkvU2VpTmFtZUluTkNOYW1lQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MjI2NDJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9zZWkvU2VpTmFtZUluTkNOYW1lQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5zZWk7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuTkFNRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Xc2RsTmFtZXNWYWxpZGF0b3I7DQotDQotLyoqDQotICogQ2hlY2tzIGlmICduYW1lJyBhdHRyaWJ1dGUgaXMgdmFsaWQgTkNOYW1lICANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFNlaU5hbWVJbk5DTmFtZUNvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50DQotew0KLQlwdWJsaWMgU2VpTmFtZUluTkNOYW1lQ29uc3RyYWludCgpIHsNCi0JCXN1cGVyKG5ldyBTZWlDb25zdHJhaW50RGVzY3JpcHRvcigpKTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1ZhbGlkYXRlKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSljdHguZ2V0VGFyZ2V0KCk7DQotCQlmaW5hbCBJU3RhdHVzIHN0YXR1cyA9IFdzZGxOYW1lc1ZhbGlkYXRvci52YWxpZGF0ZU5DTmFtZTIoTkFNRV9BVFRSSUJVVEUsIHNlaS5nZXROYW1lKCkpOw0KLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7DQotCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhzZWksIHN0YXR1cy5nZXRNZXNzYWdlKCksIFdTX0FOTk9UQVRJT04sIE5BTUVfQVRUUklCVVRFKTsNCi0JCX0JDQotCQkNCi0JCXJldHVybiBjcmVhdGVPa1N0YXR1cyhzZWkpOw0KLQl9DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9zZWkvVGFyZ2V0TnNWYWxpZFVyaUNvbnN0cmFpbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9zZWkvVGFyZ2V0TnNWYWxpZFVyaUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTYzNDczMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vc2VpL1RhcmdldE5zVmFsaWRVcmlDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnNlaTsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5UQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC5VUkk7DQotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4uSmF4V3NEb21SdW50aW1lTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQ7DQotDQotLyoqDQotICogQ2hlY2tzIGlmIHRoZSAndGFyZ2V0TmFtZXNvYWNlJyBhdHRyaWJ1dGUgaW4gV2ViU2VydmljZSBhbm5vdGF0aW9uIGlzIHZhbGlkIFVSSSANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFRhcmdldE5zVmFsaWRVcmlDb25zdHJhaW50ICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQNCi17DQotCXB1YmxpYyBUYXJnZXROc1ZhbGlkVXJpQ29uc3RyYWludCgpIHsNCi0JCXN1cGVyKG5ldyBTZWlDb25zdHJhaW50RGVzY3JpcHRvcigpKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9WYWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgY3R4KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKWN0eC5nZXRUYXJnZXQoKTsgDQotCQl0cnkgew0KLQkJCW5ldyBVUkkoc2VpLmdldFRhcmdldE5hbWVzcGFjZSgpKTsNCi0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhzZWksIEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLmJpbmQoDQotCQkJCQkJCQkJCQlKYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5UYXJnZXROc1ZhbGlkVXJpQ29uc3RyYWludF9VUklfU1lOVEFYX0VSUk9SLA0KLQkJCQkJbmV3IE9iamVjdFtdIHtlLmdldEluZGV4KCksIGUuZ2V0SW5wdXQoKSwgZS5nZXRSZWFzb24oKX0pLCANCi0JCQkJCVdTX0FOTk9UQVRJT04sIFRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHNlaSk7DQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYm1ldGhvZC9NZXRob2ROb3RFeGNsdWRlZEluU2VpQ29uc3RyYWludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYm1ldGhvZC9NZXRob2ROb3RFeGNsdWRlZEluU2VpQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5N2YwZWFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJtZXRob2QvTWV0aG9kTm90RXhjbHVkZWRJblNlaUNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ud2VibWV0aG9kOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0FOTk9UQVRJT047DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV01Bbm5vdGF0aW9uRmVhdHVyZXMuV01fRVhDTFVERURfQVRUUklCVVRFOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5tZXNzYWdlcy5WYWxpZGF0aW9uTWVzc2FnZXM7DQotDQotLyoqDQotICogQ2hlY2tzIGlmIHRoZXJlIGlzIGEgPGI+ZXhjbHVkZT10cnVlPC9iPiBhdHRyaWJ1dGUgaW4gV2ViTWV0b2QgYW5ub3RhdGlvbiBpbiBTRUkuDQotICogQWNjb3JkaW5nIHRvIGpzci0xODEgc2VjdGlvbiA0LjIuMSBhdHRyaWJ1dGUgPGI+ZXhjbHVkZTwvYj4gdGhpcyBpcyBub3QgYWxsb3dlZC4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIE1ldGhvZE5vdEV4Y2x1ZGVkSW5TZWlDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludA0KLXsNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIC0gbm8gc3BlY2lmaWMgcHJvY2Vzc2luZyBoZXJlIA0KLQkgKi8NCi0JcHVibGljIE1ldGhvZE5vdEV4Y2x1ZGVkSW5TZWlDb25zdHJhaW50KCkgew0KLQkJc3VwZXIobmV3IFdtQ29uc3RyYWludERlc2NyaXB0b3IoKSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJU3RhdHVzIGRvVmFsaWRhdGUoZmluYWwgSVZhbGlkYXRpb25Db250ZXh0IGN0eCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdtID0gKElXZWJNZXRob2QpY3R4LmdldFRhcmdldCgpOw0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSl3bS5lQ29udGFpbmVyKCk7DQotCQkNCi0JCWlmICh3bS5pc0V4Y2x1ZGVkKCkgJiYgIXNlaS5pc0ltcGxpY2l0KCkpIA0KLQkJew0KLQkJCXJldHVybiBjcmVhdGVTdGF0dXMod20sIFZhbGlkYXRpb25NZXNzYWdlcy5XZWJNZXRob2RWYWxpZGF0aW9uX01ldGhvZFNob3VsZE5vdEJlRXhjbHVkZWQsIFdNX0FOTk9UQVRJT04sIFdNX0VYQ0xVREVEX0FUVFJJQlVURSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3bSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYm1ldGhvZC9OYW1lSXNOQ05hbWVDb25zdHJhaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VibWV0aG9kL05hbWVJc05DTmFtZUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmJlNDUyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VibWV0aG9kL05hbWVJc05DTmFtZUNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ud2VibWV0aG9kOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0FOTk9UQVRJT047DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV01Bbm5vdGF0aW9uRmVhdHVyZXMuV01fTkFNRV9BVFRSSUJVVEU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5JVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuV3NkbE5hbWVzVmFsaWRhdG9yOw0KLQ0KLS8qKg0KLSAqIENoZWNrcyBpZiA8Yj5vcGVyYXRpb25OYW1lPC9iPiBpcyB2YWxpZCBOQ05hbWUuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBOYW1lSXNOQ05hbWVDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludA0KLXsNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIC0gbm8gc3BlY2lmaWMgcHJvY2Vzc2luZyBoZXJlIA0KLQkgKi8NCi0JcHVibGljIE5hbWVJc05DTmFtZUNvbnN0cmFpbnQoKSB7DQotCQlzdXBlcihuZXcgV21Db25zdHJhaW50RGVzY3JpcHRvcigpKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9WYWxpZGF0ZShmaW5hbCBJVmFsaWRhdGlvbkNvbnRleHQgY3R4KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd20gPSAoSVdlYk1ldGhvZCljdHguZ2V0VGFyZ2V0KCk7DQotCQlpZighd20uaXNFeGNsdWRlZCgpKSANCi0JCXsNCi0JCQlmaW5hbCBJU3RhdHVzIHN0YXR1cyA9IFdzZGxOYW1lc1ZhbGlkYXRvci52YWxpZGF0ZU5DTmFtZTIoV01fTkFNRV9BVFRSSUJVVEUsIHdtLmdldE5hbWUoKSk7DQotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7DQotCQkJCXJldHVybiBjcmVhdGVTdGF0dXMod20sIHN0YXR1cy5nZXRNZXNzYWdlKCksIFdNX0FOTk9UQVRJT04sIFdNX05BTUVfQVRUUklCVVRFKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3bSk7DQotCX0NCi19DQotDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYm1ldGhvZC9OYW1lSXNVbmlxdWVDb25zdHJhaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VibWV0aG9kL05hbWVJc1VuaXF1ZUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMThjNDI2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VibWV0aG9kL05hbWVJc1VuaXF1ZUNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ud2VibWV0aG9kOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0FOTk9UQVRJT047DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV01Bbm5vdGF0aW9uRmVhdHVyZXMuV01fTkFNRV9BVFRSSUJVVEU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5JVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLm1lc3NhZ2VzLlZhbGlkYXRpb25NZXNzYWdlczsNCi0NCi0vKioNCi0gKiBDaGVja3MgaWYgdGhlIDxiPm9wZXJhdGlvbk5hbWU8L2I+IGF0dHJpYnV0ZSBpcyB1bmlxdWUgaW4gdGhlIHNjb3BlIG9mDQotICogU0VJIG1ldGhvZHMuIEFjY29yZGluZyB0byBXU0RMIHNwZWNpZmljYXRpb24gb3BlcmF0aW9ucyBzaG91bGQgaGF2ZSBkaWZmZXJlbnQNCi0gKiBuYW1lcyBlLmcuIG92ZXJsb2FkaW5nIGlzIG5vdCBzdXBwb3J0ZWQuIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTmFtZUlzVW5pcXVlQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQNCi17DQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciAtIG5vIHNwZWNpZmljIHByb2Nlc3NpbmcgaGVyZSANCi0JICovDQotCXB1YmxpYyBOYW1lSXNVbmlxdWVDb25zdHJhaW50KCkgew0KLQkJc3VwZXIobmV3IFdtQ29uc3RyYWludERlc2NyaXB0b3IoKSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1ZhbGlkYXRlKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZCljdHguZ2V0VGFyZ2V0KCk7DQotCQlpZiAoIXdlYk1ldGhvZC5pc0V4Y2x1ZGVkKCkgJiYgIWlzTmFtZVVuaXF1ZSh3ZWJNZXRob2QpKSANCi0JCXsNCi0JCQlmaW5hbCBTdHJpbmcgbXNnID0gVmFsaWRhdGlvbk1lc3NhZ2VzLmJpbmQoVmFsaWRhdGlvbk1lc3NhZ2VzLldlYk1ldGhvZFZhbGlkYXRpb25fTmFtZUV4aXN0cywgd2ViTWV0aG9kLmdldE5hbWUoKSk7DQotCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyh3ZWJNZXRob2QsIG1zZywgV01fQU5OT1RBVElPTiwgV01fTkFNRV9BVFRSSUJVVEUpOw0KLQkJfQkNCi0JCQ0KLQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdlYk1ldGhvZCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBib29sZWFuIGlzTmFtZVVuaXF1ZShmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCkgDQotCXsNCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upd2ViTWV0aG9kLmVDb250YWluZXIoKTsNCi0JCWZvcihJV2ViTWV0aG9kIHdtIDogc2VpLmdldFdlYk1ldGhvZHMoKSkgDQotCQl7DQotCQkJaWYgKHdtPT13ZWJNZXRob2QgfHwgd20uaXNFeGNsdWRlZCgpKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlpZiAod20uZ2V0TmFtZSgpLmVxdWFscyh3ZWJNZXRob2QuZ2V0TmFtZSgpKSkgew0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VibWV0aG9kL1JlZHVuZGFudEF0dHJpYnV0ZXNDb25zdHJhaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VibWV0aG9kL1JlZHVuZGFudEF0dHJpYnV0ZXNDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRjNjMxZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYm1ldGhvZC9SZWR1bmRhbnRBdHRyaWJ1dGVzQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJtZXRob2Q7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV01Bbm5vdGF0aW9uRmVhdHVyZXMuV01fQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5tZXNzYWdlcy5WYWxpZGF0aW9uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBDaGVjayBpZiBpbiB7QGxpbmsgV2ViTWV0aG9kfSBhbm5vdGF0aW9uIHdoZXJlIDxiPmV4Y2x1ZGU9dHJ1ZTwvYj4gbm8gb3RoZXIgYXR0cmlidXRlcw0KLSAqIGFyZSB1c2VkLiBBY2NvcmRpbmcgdG8ganNyLTE4MSAtIHBvaW50IDQuMi4xLCBleGNsdWRlIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbiB0aGlzIGlzIG5vdA0KLSAqIGFsbG93ZWQuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBSZWR1bmRhbnRBdHRyaWJ1dGVzQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQNCi17DQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciAtIG5vIHNwZWNpZmljIHByb2Nlc3NpbmcgaGVyZSANCi0JICovDQotCXB1YmxpYyBSZWR1bmRhbnRBdHRyaWJ1dGVzQ29uc3RyYWludCgpIHsNCi0JCXN1cGVyKG5ldyBXbUNvbnN0cmFpbnREZXNjcmlwdG9yKCkpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9WYWxpZGF0ZShmaW5hbCBJVmFsaWRhdGlvbkNvbnRleHQgY3R4KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kID0gKElXZWJNZXRob2QpY3R4LmdldFRhcmdldCgpOw0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSl3ZWJNZXRob2QuZUNvbnRhaW5lcigpOw0KLQkJDQotCQkvLyBpZiB0aGUgbWV0aG9kIGlzIG5vdCBleGNsdWRlZCB3ZSBkbyBub3QgbmVlZCB0aGlzIGNoZWNrDQotCQlpZiAoIXdlYk1ldGhvZC5pc0V4Y2x1ZGVkKCkgfHwgIXNlaS5pc0ltcGxpY2l0KCkpIHsNCi0JCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod2ViTWV0aG9kKTsNCi0JCX0NCi0NCi0JCWlmIChjb250YWluc090aGVyQXR0cmlidXRlcyh3ZWJNZXRob2QpKSB7DQotCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyh3ZWJNZXRob2QsIFZhbGlkYXRpb25NZXNzYWdlcy5XZWJNZXRob2RWYWxpZGF0aW9uX0V4Y2x1ZGVkSGFzT3RoZXJBdHRyaWJ1dGVzLCBXTV9BTk5PVEFUSU9OLCBudWxsKTsNCi0JCX0JCQ0KLQkJDQotCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod2ViTWV0aG9kKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNPdGhlckF0dHJpYnV0ZXMoZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QpIA0KLQl7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gamVlNURvbVV0aWwoKS5maW5kQW5ub3RhdGlvbih3ZWJNZXRob2QsIFdNX0FOTk9UQVRJT04pOw0KLQkJaWYgKGFubm90YXRpb249PW51bGwpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCWlmIChhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA+IDEpIHsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJtZXRob2QvV21Db25zdHJhaW50RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYm1ldGhvZC9XbUNvbnN0cmFpbnREZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlhNTAzNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYm1ldGhvZC9XbUNvbnN0cmFpbnREZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLndlYm1ldGhvZDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuQ29uc3RyYWludFNldmVyaXR5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZVBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uRG9tVmFsaWRhdGlvbkNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZG9tLnZhbGlkYXRpb24uRG9tVmFsaWRhdGlvbkNvbnN0YW50czsNCi0NCi1jbGFzcyBXbUNvbnN0cmFpbnREZXNjcmlwdG9yIGV4dGVuZHMgRG9tVmFsaWRhdGlvbkNvbnN0cmFpbnREZXNjcmlwdG9yDQotewkNCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsNCi0JCXJldHVybiBEb21WYWxpZGF0aW9uQ29uc3RhbnRzLldNX0NPTlNUUkFJTlRfSUQ7DQotCX0NCi0NCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsNCi0JCXJldHVybiBKYXhXc0RvbVJ1bnRpbWVQbHVnaW4uUExVR0lOX0lEOw0KLQl9DQotDQotCXB1YmxpYyBDb25zdHJhaW50U2V2ZXJpdHkgZ2V0U2V2ZXJpdHkoKSB7DQotCQlyZXR1cm4gQ29uc3RyYWludFNldmVyaXR5LkVSUk9SOw0KLQl9DQotDQotCXB1YmxpYyBpbnQgZ2V0U3RhdHVzQ29kZSgpIHsNCi0JCXJldHVybiAtMjc7DQotCX0JDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJtZXRob2QvV21Db25zdHJhaW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJtZXRob2QvV21Db25zdHJhaW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGFjOTMzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VibWV0aG9kL1dtQ29uc3RyYWludFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLndlYm1ldGhvZDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5tb2RlbC5JTW9kZWxDb25zdHJhaW50Ow0KLQ0KLXB1YmxpYyBjbGFzcyBXbUNvbnN0cmFpbnRQcm92aWRlciANCi17DQotCXByaXZhdGUgU2V0PElNb2RlbENvbnN0cmFpbnQ+IGNvbnN0cmFpbnRzOzsNCi0JDQotCXB1YmxpYyBDb2xsZWN0aW9uPElNb2RlbENvbnN0cmFpbnQ+IGdldENvbnN0cmFpbnRzKCkgDQotCXsNCi0JCWlmIChjb25zdHJhaW50cyA9PSBudWxsKSANCi0JCXsNCi0JCQljb25zdHJhaW50cyA9IG5ldyBIYXNoU2V0PElNb2RlbENvbnN0cmFpbnQ+KCk7DQotCQkJY29uc3RyYWludHMuYWRkKG5ldyBOYW1lSXNOQ05hbWVDb25zdHJhaW50KCkpOw0KLQkJCWNvbnN0cmFpbnRzLmFkZChuZXcgTmFtZUlzVW5pcXVlQ29uc3RyYWludCgpKTsNCi0JCQljb25zdHJhaW50cy5hZGQobmV3IFJlZHVuZGFudEF0dHJpYnV0ZXNDb25zdHJhaW50KCkpOw0KLQkJCWNvbnN0cmFpbnRzLmFkZChuZXcgTWV0aG9kTm90RXhjbHVkZWRJblNlaUNvbnN0cmFpbnQoKSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBjb25zdHJhaW50czsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VicGFyYW0vTmFtZUlzTkNOYW1lQ29uc3RyYWludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnBhcmFtL05hbWVJc05DTmFtZUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjczYzFlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VicGFyYW0vTmFtZUlzTkNOYW1lQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJwYXJhbTsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5OQU1FX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5JVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLkplZTVEb21VdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLldzZGxOYW1lc1ZhbGlkYXRvcjsNCi0NCi0vKioNCi0gKiBDaGVjayBpZiBuYW1lIGF0dHJpYnV0ZSBvZiB7QGxpbmsgV2ViUGFyYW19IGFubm90YXRpb24gaXMgY29ycmVjdCBOQ05hbWUuICANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIE5hbWVJc05DTmFtZUNvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUVVJOID0gInJldHVybiI7Ly8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgLSBubyBzcGVjaWZpYyBwcm9jZXNzaW5nIGhlcmUgDQotCSAqLw0KLQlwdWJsaWMgTmFtZUlzTkNOYW1lQ29uc3RyYWludCgpIHsNCi0JCXN1cGVyKG5ldyBXcENvbnN0cmFpbnREZXNjcmlwdG9yKCkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1ZhbGlkYXRlKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtID0gKElXZWJQYXJhbSljdHguZ2V0VGFyZ2V0KCk7DQotCQlpZiAoUkVUVVJOLmVxdWFscyh3ZWJQYXJhbS5nZXRJbXBsZW1lbnRhdGlvbigpKSB8fCAhaXNOYW1lVXNlZCh3ZWJQYXJhbSkpIHsNCi0JCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod2ViUGFyYW0pOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBJU3RhdHVzIHN0YXR1cyA9IFdzZGxOYW1lc1ZhbGlkYXRvci52YWxpZGF0ZU5DTmFtZTIoTkFNRV9BVFRSSUJVVEUsIHdlYlBhcmFtLmdldE5hbWUoKSk7DQotCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsNCi0JCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHdlYlBhcmFtLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLCBXUF9BTk5PVEFUSU9OLCBOQU1FX0FUVFJJQlVURSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3ZWJQYXJhbSk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBib29sZWFuIGlzTmFtZVVzZWQoZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlyZXR1cm4gSmVlNURvbVV0aWxzLmdldEluc3RhbmNlKCkuaXNOYW1lVXNlZCh3ZWJQYXJhbSk7DQotCX0NCi19DQotDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnBhcmFtL05hbWVJc1JlZHVuZGFudENvbnN0cmFpbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJwYXJhbS9OYW1lSXNSZWR1bmRhbnRDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkOGIwYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnBhcmFtL05hbWVJc1JlZHVuZGFudENvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ud2VicGFyYW07DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuTkFNRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuV1BfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5tb2RlbC5Db25zdHJhaW50U2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5KZWU1RG9tVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLm1lc3NhZ2VzLlZhbGlkYXRpb25NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIENoZWNrIGlmIG5hbWUgYXR0cmlidXRlIG9mIHtAbGluayBXZWJQYXJhbX0gYW5ub3RhdGlvbiBpcyByZWR1bmRhbnQuIA0KLSAqIFNlZSB7QGxpbmsgSmVlNURvbVV0aWxzI2lzTmFtZVVzZWQoSVdlYlBhcmFtKX0uDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBOYW1lSXNSZWR1bmRhbnRDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVFVSTiA9ICJyZXR1cm4iOy8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIC0gbm8gc3BlY2lmaWMgcHJvY2Vzc2luZyBoZXJlIA0KLQkgKi8NCi0JcHVibGljIE5hbWVJc1JlZHVuZGFudENvbnN0cmFpbnQoKSB7DQotCQlzdXBlcihuZXcgTmFtZVJlZHVuZGFudENvbnN0cmFpbnREZXNjcmlwdG9yKCkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1ZhbGlkYXRlKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtID0gKElXZWJQYXJhbSljdHguZ2V0VGFyZ2V0KCk7DQotCQlpZiAoUkVUVVJOLmVxdWFscyh3ZWJQYXJhbS5nZXRJbXBsZW1lbnRhdGlvbigpKSkgew0KLQkJCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3ZWJQYXJhbSk7DQotCQl9DQotCQkNCi0JCWZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSBqZWU1RG9tVXRpbCgpLmZpbmRBbm5vdGF0aW9uKHdlYlBhcmFtLCBXUF9BTk5PVEFUSU9OKTsNCi0JCWlmIChhbm5vdGF0aW9uIT1udWxsICYmIGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXUEFubm90YXRpb25GZWF0dXJlcy5OQU1FX0FUVFJJQlVURSkhPW51bGwpIA0KLQkJew0KLQkJCWlmICghamVlNURvbVV0aWwoKS5pc05hbWVVc2VkKHdlYlBhcmFtKSkgew0KLQkJCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHdlYlBhcmFtLCBWYWxpZGF0aW9uTWVzc2FnZXMuV2ViUGFyYW1WYWxpZGF0aW9uX05hbWVSZWR1bmRhbnQsIFdQX0FOTk9UQVRJT04sIE5BTUVfQVRUUklCVVRFKTsJCQkJDQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod2ViUGFyYW0pOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE5hbWVSZWR1bmRhbnRDb25zdHJhaW50RGVzY3JpcHRvciBleHRlbmRzIFdwQ29uc3RyYWludERlc2NyaXB0b3INCi0Jew0KLQkJQE92ZXJyaWRlDQotCQlwdWJsaWMgQ29uc3RyYWludFNldmVyaXR5IGdldFNldmVyaXR5KCkgew0KLQkJCXJldHVybiBDb25zdHJhaW50U2V2ZXJpdHkuV0FSTklORzsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VicGFyYW0vTmFtZUlzUmVxdWlyZWRDb25zdHJhaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VicGFyYW0vTmFtZUlzUmVxdWlyZWRDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM4NjZiNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnBhcmFtL05hbWVJc1JlcXVpcmVkQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJwYXJhbTsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5OQU1FX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5JVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuSmVlNURvbVV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5tZXNzYWdlcy5WYWxpZGF0aW9uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBDaGVjayBpZiBuYW1lIGF0dHJpYnV0ZSBvZiB7QGxpbmsgV2ViUGFyYW19IGFubm90YXRpb24gaXMgcmVxdWlyZWQuDQotICogU2VlIHtAbGluayBKZWU1RG9tVXRpbHMjaXNOYW1lUmVxdWlyZWQoSVdlYlBhcmFtKX0gZm9yIG1vcmUgZGV0YWlscy4gIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTmFtZUlzUmVxdWlyZWRDb25zdHJhaW50ICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVRVUk4gPSAicmV0dXJuIjsvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciAtIG5vIHNwZWNpZmljIHByb2Nlc3NpbmcgaGVyZSANCi0JICovDQotCXB1YmxpYyBOYW1lSXNSZXF1aXJlZENvbnN0cmFpbnQoKSB7DQotCQlzdXBlcihuZXcgV3BDb25zdHJhaW50RGVzY3JpcHRvcigpKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9WYWxpZGF0ZShmaW5hbCBJVmFsaWRhdGlvbkNvbnRleHQgY3R4KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSA9IChJV2ViUGFyYW0pY3R4LmdldFRhcmdldCgpOw0KLQkJaWYgKFJFVFVSTi5lcXVhbHMod2ViUGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKSkpIHsNCi0JCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod2ViUGFyYW0pOw0KLQkJfQ0KLQ0KLQkJZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9IGplZTVEb21VdGlsKCkuZmluZEFubm90YXRpb24od2ViUGFyYW0sIFdQX0FOTk9UQVRJT04pOw0KLQkJaWYgKGFubm90YXRpb249PW51bGwpIHsNCi0JCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod2ViUGFyYW0pOw0KLQkJfQ0KLQkJDQotCQlpZiAoamVlNURvbVV0aWwoKS5pc05hbWVSZXF1aXJlZCh3ZWJQYXJhbSkgJiYgYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKE5BTUVfQVRUUklCVVRFKT09bnVsbCkgew0KLQkJCXJldHVybiBjcmVhdGVTdGF0dXMod2ViUGFyYW0sIFZhbGlkYXRpb25NZXNzYWdlcy5XZWJQYXJhbVZhbGlkYXRpb25fTmFtZVJlcXVpcmVkLCBXUF9BTk5PVEFUSU9OLCBudWxsKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdlYlBhcmFtKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VicGFyYW0vTmFtZUlzVW5pcXVlQ29uc3RyYWludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnBhcmFtL05hbWVJc1VuaXF1ZUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDQ3ODU4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VicGFyYW0vTmFtZUlzVW5pcXVlQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJwYXJhbTsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5OQU1FX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5JVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ubWVzc2FnZXMuVmFsaWRhdGlvbk1lc3NhZ2VzOw0KLQ0KLS8qKg0KLSAqIENoZWNrIGlmIG5hbWUgYXR0cmlidXRlIG9mIHtAbGluayBXZWJQYXJhbX0gYW5ub3RhdGlvbiBpcyB1bmlxdWUgaW4gdGhlIHNjb3BlIG9mDQotICogdGhlIG1ldGhvZC4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIE5hbWVJc1VuaXF1ZUNvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUVVJOID0gInJldHVybiI7Ly8kTk9OLU5MUy0xJA0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIC0gbm8gc3BlY2lmaWMgcHJvY2Vzc2luZyBoZXJlIA0KLQkgKi8NCi0JcHVibGljIE5hbWVJc1VuaXF1ZUNvbnN0cmFpbnQoKSB7DQotCQlzdXBlcihuZXcgV3BDb25zdHJhaW50RGVzY3JpcHRvcigpKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJU3RhdHVzIGRvVmFsaWRhdGUoZmluYWwgSVZhbGlkYXRpb25Db250ZXh0IGN0eCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0gPSAoSVdlYlBhcmFtKWN0eC5nZXRUYXJnZXQoKTsNCi0JCWlmIChSRVRVUk4uZXF1YWxzKHdlYlBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkpKSB7DQotCQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdlYlBhcmFtKTsNCi0JCX0NCi0JCQkNCi0JCWlmICghaXNOYW1lVW5pcXVlKHdlYlBhcmFtKSkgDQotCQl7DQotCQkJZmluYWwgU3RyaW5nIG1zZyA9IFZhbGlkYXRpb25NZXNzYWdlcy5iaW5kKFZhbGlkYXRpb25NZXNzYWdlcy5XZWJQYXJhbVZhbGlkYXRpb25fTmFtZUV4aXN0cywgd2ViUGFyYW0uZ2V0TmFtZSgpKTsNCi0JCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHdlYlBhcmFtLCBtc2csIFdQX0FOTk9UQVRJT04sIE5BTUVfQVRUUklCVVRFKTsNCi0JCX0JDQotCQkNCi0JCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3ZWJQYXJhbSk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBib29sZWFuIGlzTmFtZVVuaXF1ZShmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0pIA0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKXdlYlBhcmFtLmVDb250YWluZXIoKTsNCi0JCWZvciAoSVdlYlBhcmFtIHdwIDogd2ViTWV0aG9kLmdldFBhcmFtZXRlcnMoKSkgDQotCQl7DQotCQkJaWYgKHdwPT13ZWJQYXJhbSkgew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJDQotCQkJaWYgKHdwLmdldE5hbWUoKS5lcXVhbHMod2ViUGFyYW0uZ2V0TmFtZSgpKSkgew0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VicGFyYW0vUGFydE5hbWVJc05DTmFtZUNvbnN0cmFpbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJwYXJhbS9QYXJ0TmFtZUlzTkNOYW1lQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZmY0ODViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJwYXJhbS9QYXJ0TmFtZUlzTkNOYW1lQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJwYXJhbTsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5QQVJUX05BTUVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLldQX0FOTk9UQVRJT047DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuSmVlNURvbVV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuV3NkbE5hbWVzVmFsaWRhdG9yOw0KLQ0KLS8qKg0KLSAqIENoZWNrIGlmIHBhcnROYW1lIGF0dHJpYnV0ZSBvZiB7QGxpbmsgV2ViUGFyYW19IGFubm90YXRpb24gaXMgY29ycmVjdCBOQ05hbWUuICANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFBhcnROYW1lSXNOQ05hbWVDb25zdHJhaW50ICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVRVUk4gPSAicmV0dXJuIjsvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciAtIG5vIHNwZWNpZmljIHByb2Nlc3NpbmcgaGVyZSANCi0JICovDQotCXB1YmxpYyBQYXJ0TmFtZUlzTkNOYW1lQ29uc3RyYWludCgpIHsNCi0JCXN1cGVyKG5ldyBXcENvbnN0cmFpbnREZXNjcmlwdG9yKCkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1ZhbGlkYXRlKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtID0gKElXZWJQYXJhbSljdHguZ2V0VGFyZ2V0KCk7DQotCQlpZiAoUkVUVVJOLmVxdWFscyh3ZWJQYXJhbS5nZXRJbXBsZW1lbnRhdGlvbigpKSB8fCAhSmVlNURvbVV0aWxzLmdldEluc3RhbmNlKCkuaXNQYXJ0TmFtZVVzZWQod2ViUGFyYW0pKSB7DQotCQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdlYlBhcmFtKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgSVN0YXR1cyBzdGF0dXMgPSBXc2RsTmFtZXNWYWxpZGF0b3IudmFsaWRhdGVOQ05hbWUyKFBBUlRfTkFNRV9BVFRSSUJVVEUsIHdlYlBhcmFtLmdldFBhcnROYW1lKCkpOw0KLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7DQotCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyh3ZWJQYXJhbSwgc3RhdHVzLmdldE1lc3NhZ2UoKSwgV1BfQU5OT1RBVElPTiwgUEFSVF9OQU1FX0FUVFJJQlVURSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3ZWJQYXJhbSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnBhcmFtL1RhcmdldE5zVmFsaWRVcmlDb25zdHJhaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VicGFyYW0vVGFyZ2V0TnNWYWxpZFVyaUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTVmNTIwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VicGFyYW0vVGFyZ2V0TnNWYWxpZFVyaUNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ud2VicGFyYW07DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuV1BfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgamF2YS5uZXQuVVJJOw0KLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludDsNCi0NCi0vKioNCi0gKiBDaGVjayBpZiB0YXJnZXROYW1lc3BhY2UgYXR0cmlidXRlIG9mIHtAbGluayBXZWJQYXJhbX0gYW5ub3RhdGlvbiBpcyBjb3JyZWN0IFVSSS4gIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgVGFyZ2V0TnNWYWxpZFVyaUNvbnN0cmFpbnQgIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVFVSTiA9ICJyZXR1cm4iOy8vJE5PTi1OTFMtMSQNCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciAtIG5vIHNwZWNpZmljIHByb2Nlc3NpbmcgaGVyZSANCi0JICovDQotCXB1YmxpYyBUYXJnZXROc1ZhbGlkVXJpQ29uc3RyYWludCgpIHsNCi0JCXN1cGVyKG5ldyBXcENvbnN0cmFpbnREZXNjcmlwdG9yKCkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1ZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCWZpbmFsIElXZWJQYXJhbSB3cCA9IChJV2ViUGFyYW0pY3R4LmdldFRhcmdldCgpOyANCi0JCWlmIChSRVRVUk4uZXF1YWxzKHdwLmdldEltcGxlbWVudGF0aW9uKCkpKSB7DQotCQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdwKTsNCi0JCX0NCi0JCQ0KLQkJdHJ5IHsNCi0JCQluZXcgVVJJKHdwLmdldFRhcmdldE5hbWVzcGFjZSgpKTsNCi0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7IC8vICRKTC1FWEMkDQotCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyh3cCwgSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuYmluZCgNCi0JCQkJCQkJCQkJCUpheFdzRG9tUnVudGltZU1lc3NhZ2VzLlRhcmdldE5zVmFsaWRVcmlDb25zdHJhaW50X1VSSV9TWU5UQVhfRVJST1IsDQotCQkJCQluZXcgT2JqZWN0W10ge2UuZ2V0SW5kZXgoKSwgZS5nZXRJbnB1dCgpLCBlLmdldFJlYXNvbigpfSksIFdQX0FOTk9UQVRJT04sIFRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdwKTsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VicGFyYW0vV3BDb25zdHJhaW50RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnBhcmFtL1dwQ29uc3RyYWludERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWEyMjI0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VicGFyYW0vV3BDb25zdHJhaW50RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJwYXJhbTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuQ29uc3RyYWludFNldmVyaXR5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZVBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uRG9tVmFsaWRhdGlvbkNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZG9tLnZhbGlkYXRpb24uRG9tVmFsaWRhdGlvbkNvbnN0YW50czsNCi0NCi0vKioNCi0gKiBUaGUgY29uc3RyYWludCBkZXNjcmlwdG9yIGZvciBXZWJQYXJhbSB2YWxpZGF0aW9uIGNvbnN0cmFpbnRzIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1jbGFzcyBXcENvbnN0cmFpbnREZXNjcmlwdG9yIGV4dGVuZHMgRG9tVmFsaWRhdGlvbkNvbnN0cmFpbnREZXNjcmlwdG9yDQotewkNCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsNCi0JCXJldHVybiBEb21WYWxpZGF0aW9uQ29uc3RhbnRzLldQX0NPTlNUUkFJTlRfSUQ7DQotCX0NCi0NCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsNCi0JCXJldHVybiBKYXhXc0RvbVJ1bnRpbWVQbHVnaW4uUExVR0lOX0lEOw0KLQl9DQotDQotCXB1YmxpYyBDb25zdHJhaW50U2V2ZXJpdHkgZ2V0U2V2ZXJpdHkoKSB7DQotCQlyZXR1cm4gQ29uc3RyYWludFNldmVyaXR5LkVSUk9SOw0KLQl9DQotDQotCXB1YmxpYyBpbnQgZ2V0U3RhdHVzQ29kZSgpIHsNCi0JCXJldHVybiAtMjk7DQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnBhcmFtL1dwQ29uc3RyYWludFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VicGFyYW0vV3BDb25zdHJhaW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDAyOGM0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VicGFyYW0vV3BDb25zdHJhaW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ud2VicGFyYW07DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuSU1vZGVsQ29uc3RyYWludDsNCi0NCi0vKioNCi0gKiBDb25zdHJhaW50IHByb3ZpZGVyIGZvciB2YWxpZGF0aW9uIG9mIHdlYlByYW0uIENvbGxlY3RzIGFsbCANCi0gKiBjb25zdHJhaW50cyBmb3IgV2ViUGFyYW0gYW5ub3RhdGlvbiBhbmQgcmV0dXJucyB0aGVtIGFzIGNvbGxlY3Rpb24uIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgV3BDb25zdHJhaW50UHJvdmlkZXIgDQotew0KLQlwcml2YXRlIFNldDxJTW9kZWxDb25zdHJhaW50PiBjb25zdHJhaW50czsNCi0JDQotCXB1YmxpYyBDb2xsZWN0aW9uPElNb2RlbENvbnN0cmFpbnQ+IGdldENvbnN0cmFpbnRzKCkgDQotCXsNCi0JCWlmIChjb25zdHJhaW50cyA9PSBudWxsKSANCi0JCXsNCi0JCQljb25zdHJhaW50cyA9IG5ldyBIYXNoU2V0PElNb2RlbENvbnN0cmFpbnQ+KCk7DQotCQkJY29uc3RyYWludHMuYWRkKG5ldyBOYW1lSXNOQ05hbWVDb25zdHJhaW50KCkpOw0KLQkJCWNvbnN0cmFpbnRzLmFkZChuZXcgTmFtZUlzVW5pcXVlQ29uc3RyYWludCgpKTsNCi0JCQljb25zdHJhaW50cy5hZGQobmV3IE5hbWVJc1JlZHVuZGFudENvbnN0cmFpbnQoKSk7DQotCQkJY29uc3RyYWludHMuYWRkKG5ldyBOYW1lSXNSZXF1aXJlZENvbnN0cmFpbnQoKSk7DQotCQkJY29uc3RyYWludHMuYWRkKG5ldyBQYXJ0TmFtZUlzTkNOYW1lQ29uc3RyYWludCgpKTsJCQkNCi0JCQljb25zdHJhaW50cy5hZGQobmV3IFRhcmdldE5zVmFsaWRVcmlDb25zdHJhaW50KCkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gY29uc3RyYWludHM7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvRW5kcG9pbnRDb3JyZWN0Q29uc3RyYWludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvRW5kcG9pbnRDb3JyZWN0Q29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMGYxNTRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJzZXJ2aWNlL0VuZHBvaW50Q29ycmVjdENvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ud2Vic2VydmljZTsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5Eb20yUmVzb3VyY2VNYXBwZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLkVuZHBvaW50VHlwZVZhbGlkYXRvcjsNCi0NCi0vKioNCi0gKiBDaGVja3MgdGhlIGVuZHBvaW50IGNsYXNzIGlmIGl0IGlzIGNhcGFibGUgdG8gYmUgdXNlZCBhcyBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGJlYW4NCi0gKiBhY2NvcmRpbmcgdG8ganNyLTE4MSBzZWN0aW9uIDMuMQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnRDb3JyZWN0Q29uc3RyYWludCAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50DQotew0KLQlwcml2YXRlIGZpbmFsIEVuZHBvaW50VHlwZVZhbGlkYXRvciB2YWxpZGF0b3I7DQotCQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgLSBubyBzcGVjaWZpYyBwcm9jZXNzaW5nIGhlcmUgDQotCSAqLw0KLQlwdWJsaWMgRW5kcG9pbnRDb3JyZWN0Q29uc3RyYWludCgpIA0KLQl7DQotCQlzdXBlcihuZXcgV3NDb25zdHJhaW50RGVzY3JpcHRvcigpKTsNCi0JCXZhbGlkYXRvciA9IG5ldyBFbmRwb2ludFR5cGVWYWxpZGF0b3IoKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9WYWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgY3R4KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZSB3cyA9IChJV2ViU2VydmljZSkgY3R4LmdldFRhcmdldCgpOwkJDQotCQlmaW5hbCBJVHlwZSB3c1R5cGUgPSBEb20yUmVzb3VyY2VNYXBwZXIuSU5TVEFOQ0UuZmluZFR5cGUod3MpOw0KLQkJaWYgKHdzVHlwZT09bnVsbCkgew0KLQkJCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3cyk7DQotCQl9DQotCQkNCi0JCWZpbmFsIElTdGF0dXMgc3RhdHVzID0gdmFsaWRhdG9yLnZhbGlkYXRlKHdzVHlwZSk7DQotCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsNCi0JCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHdzLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLCBXU19BTk5PVEFUSU9OLCBudWxsKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdzKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9FbmRwb2ludEltcGxlbWVudHNTZWlDb25zdHJhaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9FbmRwb2ludEltcGxlbWVudHNTZWlDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmNDYzODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvRW5kcG9pbnRJbXBsZW1lbnRzU2VpQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJzZXJ2aWNlOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLkVORFBPSU5UX0lOVEVSRkFDRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5JVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLkRvbTJSZXNvdXJjZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3I7DQotDQotLyoqDQotICogVmFsaWRhdGVzIGlmIHRoZSBXZWJTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGJlYW4gaW1wbGVtZW50cyBtZXRob2RzIGZyb20NCi0gKiByZWZlcmVuY2VkIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnRJbXBsZW1lbnRzU2VpQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQNCi17DQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciAtIG5vIHNwZWNpZmljIHByb2Nlc3NpbmcgaGVyZSANCi0JICovDQotCXB1YmxpYyBFbmRwb2ludEltcGxlbWVudHNTZWlDb25zdHJhaW50KCkgDQotCXsNCi0JCXN1cGVyKG5ldyBXc0NvbnN0cmFpbnREZXNjcmlwdG9yKCkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1ZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzID0gKElXZWJTZXJ2aWNlKSBjdHguZ2V0VGFyZ2V0KCk7DQotCQkNCi0JCWlmICh3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKT09bnVsbCB8fCB3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKS5pc0ltcGxpY2l0KCkpIHsNCi0JCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod3MpOw0KLQkJfQ0KLQkJCQ0KLQkJZmluYWwgSVR5cGUgd3NUeXBlID0gZmluZFR5cGUod3MpOw0KLQkJZmluYWwgSVR5cGUgc2VpVHlwZSA9IGZpbmRUeXBlKHdzLmdldFNlcnZpY2VFbmRwb2ludCgpKTsNCi0JCQ0KLQkJaWYgKHdzVHlwZT09bnVsbCB8fCBzZWlUeXBlPT1udWxsKSB7DQotCQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdzKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFNlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yKHNlaVR5cGUpOwkJDQotCQlmaW5hbCBJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZSh3c1R5cGUpOw0KLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7DQotCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyh3cywgc3RhdHVzLmdldE1lc3NhZ2UoKSwgV1NfQU5OT1RBVElPTiwgRU5EUE9JTlRfSU5URVJGQUNFX0FUVFJJQlVURSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3cyk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJVHlwZSBmaW5kVHlwZShmaW5hbCBFT2JqZWN0IGVPYmplY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KLQkJcmV0dXJuIERvbTJSZXNvdXJjZU1hcHBlci5JTlNUQU5DRS5maW5kVHlwZShlT2JqZWN0KTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9FbmRwb2ludEludGVyZmFjZUV4aXN0c0NvbnN0cmFpbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJzZXJ2aWNlL0VuZHBvaW50SW50ZXJmYWNlRXhpc3RzQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZjQ5ZWI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJzZXJ2aWNlL0VuZHBvaW50SW50ZXJmYWNlRXhpc3RzQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJzZXJ2aWNlOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLkVORFBPSU5UX0lOVEVSRkFDRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLkFubm90YXRpb25BZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uSUFubm90YXRpb25BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5tZXNzYWdlcy5WYWxpZGF0aW9uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBDaGVja3MgaWYgcmVmZXJlbmNlZCBieSBlbmRwb2ludCBTRUkgZXhpc3RzIGluIHRoZSBwcm9qZWN0LiANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEVuZHBvaW50SW50ZXJmYWNlRXhpc3RzQ29uc3RyYWludCAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50DQotew0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgLSBubyBzcGVjaWZpYyBwcm9jZXNzaW5nIGhlcmUgDQotCSAqLw0KLQlwdWJsaWMgRW5kcG9pbnRJbnRlcmZhY2VFeGlzdHNDb25zdHJhaW50KCkgew0KLQkJc3VwZXIobmV3IFdzQ29uc3RyYWludERlc2NyaXB0b3IoKSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJU3RhdHVzIGRvVmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGN0eCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSAoSVdlYlNlcnZpY2UpY3R4LmdldFRhcmdldCgpOyAgDQotCQlmaW5hbCBJQW5ub3RhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChJQW5ub3RhdGlvbkFkYXB0ZXIpQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdzLCBJQW5ub3RhdGlvbkFkYXB0ZXIuY2xhc3MpOw0KLQkJZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9IGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihXU19BTk5PVEFUSU9OKTsNCi0JCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCi0JCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod3MpOw0KLQkJfQ0KLQ0KLQkJZmluYWwgU3RyaW5nIHNlaUZRTmFtZSA9IGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShFTkRQT0lOVF9JTlRFUkZBQ0VfQVRUUklCVVRFKTsNCi0JCWlmIChzZWlGUU5hbWUgPT0gbnVsbCkgew0KLQkJCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3cyk7DQotCQl9DQotDQotCQlpZiAod3MuZ2V0U2VydmljZUVuZHBvaW50KCk9PW51bGwpIHsNCi0JCQlmaW5hbCBTdHJpbmcgbXNnID0gVmFsaWRhdGlvbk1lc3NhZ2VzLmJpbmQoVmFsaWRhdGlvbk1lc3NhZ2VzLldzVmFsaWRhdGlvbl9TZWlEb2VzTm90RXhpc3RzLCBzZWlGUU5hbWUpOw0KLQkJCXJldHVybiBjcmVhdGVTdGF0dXMod3MsIG1zZywgV1NfQU5OT1RBVElPTiwgRU5EUE9JTlRfSU5URVJGQUNFX0FUVFJJQlVURSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3cyk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvRW5kcG9pbnRJc1Nlc3Npb25CZWFuQ29uc3RyYWludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvRW5kcG9pbnRJc1Nlc3Npb25CZWFuQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NmIyYWMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJzZXJ2aWNlL0VuZHBvaW50SXNTZXNzaW9uQmVhbkNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ud2Vic2VydmljZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuRG9tMlJlc291cmNlTWFwcGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5tZXNzYWdlcy5WYWxpZGF0aW9uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5mYWNldHMuRmFjZXRVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmZhY2V0cy5JRmFjZXRVdGlsczsNCi0NCi0vKioNCi0gKiBDb25zdHJhaW50IGZvciB2YWxpZGF0aW5nIHdoZXRoZXIgYSBjbGFzcyBpbiBhIEVKQiBtb2R1bGUgYW5ub3RhdGVkIHdpdGggdGhlICJAV2ViU2VydmljZSIgYW5ub3RhdGlvbiBpcyBhIHNlc3Npb24gYmVhbg0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICovDQotcHVibGljIGNsYXNzIEVuZHBvaW50SXNTZXNzaW9uQmVhbkNvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50DQotew0KLQlwdWJsaWMgRW5kcG9pbnRJc1Nlc3Npb25CZWFuQ29uc3RyYWludCgpDQotCXsNCi0JCXN1cGVyKG5ldyBXc0NvbnN0cmFpbnREZXNjcmlwdG9yKCkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1ZhbGlkYXRlKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzID0gKElXZWJTZXJ2aWNlKSBjdHguZ2V0VGFyZ2V0KCk7DQotCQlmaW5hbCBJVHlwZSB3c1R5cGUgPSBEb20yUmVzb3VyY2VNYXBwZXIuSU5TVEFOQ0UuZmluZFR5cGUod3MpOw0KLQkJaWYgKHdzVHlwZSA9PSBudWxsIHx8IHdzVHlwZS5nZXRSZXNvdXJjZSgpID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdzKTsNCi0JCX0NCi0NCi0JCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSB3c1R5cGUuZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCk7DQotCQlpZiAoIWZhY2V0VXRpbHMoKS5oYXNGYWNldFdpdGhWZXJzaW9uKHByb2plY3QsIElGYWNldFV0aWxzLkVKQl8zMF9GQUNFVF9WRVJTSU9OLCBJRmFjZXRVdGlscy5FSkJfMzBfRkFDRVRfSUQpKQ0KLQkJew0KLQkJCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3cyk7DQotCQl9DQotDQotCQlpZiAoIWlzU2Vzc2lvbkJlYW4od3NUeXBlKSkNCi0JCXsNCi0JCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHdzLCBWYWxpZGF0aW9uTWVzc2FnZXMuV3NWYWxpZGF0aW9uX1dzQW5ub3RhdGlvbk9uTm9uU2Vzc2lvbkJlYW5fRXJyb3IsIFdTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT04sIG51bGwpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdzKTsNCi0NCi0JfQ0KLQ0KLQlwcml2YXRlIElGYWNldFV0aWxzIGZhY2V0VXRpbHMoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IEZhY2V0VXRpbHMoKTsNCi0JfQ0KLQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSBib29sZWFuIGlzU2Vzc2lvbkJlYW4oZmluYWwgSVR5cGUgZW5kcG9pbnRUeXBlKQ0KLQl7DQotCQlmaW5hbCBJTW9kZWxQcm92aWRlciBwcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIoZW5kcG9pbnRUeXBlLmdldFJlc291cmNlKCkuZ2V0UHJvamVjdCgpKTsNCi0JCWZpbmFsIE9iamVjdCBtb2RlbE9iamVjdCA9IHByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCk7DQotCQlmaW5hbCBMaXN0PFNlc3Npb25CZWFuPiBzZXNzaW9uQmVhbnMgPSAoKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphcikgbW9kZWxPYmplY3QpLmdldEVudGVycHJpc2VCZWFucygpLmdldFNlc3Npb25CZWFucygpOw0KLQkJZm9yIChTZXNzaW9uQmVhbiBiZWFuIDogc2Vzc2lvbkJlYW5zKQ0KLQkJew0KLQkJCWlmIChiZWFuLmdldEVqYkNsYXNzKCkuZXF1YWxzKGVuZHBvaW50VHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpDQotCQkJew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvTmFtZVJlZHVuZGFudENvbnN0cmFpbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJzZXJ2aWNlL05hbWVSZWR1bmRhbnRDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI4ZGMzN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvTmFtZVJlZHVuZGFudENvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ud2Vic2VydmljZTsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5OQU1FX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ubWVzc2FnZXMuVmFsaWRhdGlvbk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotDQotLyoqDQotICogQ2hlY2tzIGlmIHRoZXJlIGlzIGEgbmFtZSBhdHRyaWJ1dGUgb24gZWRucG9pbnQgdGhhdCByZWZlcmVuY2VzIFNFSS4NCi0gKiBBY2NvcmRpbmcgdG8ganNyLTE4MSBwb2ludCAzLjEgc3VicG9pbnQgNS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIE5hbWVSZWR1bmRhbnRDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludA0KLXsNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIC0gbm8gc3BlY2lmaWMgcHJvY2Vzc2luZyBoZXJlIA0KLQkgKi8NCi0JcHVibGljIE5hbWVSZWR1bmRhbnRDb25zdHJhaW50KCkgew0KLQkJc3VwZXIobmV3IFdzQ29uc3RyYWludERlc2NyaXB0b3IoKSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJU3RhdHVzIGRvVmFsaWRhdGUoZmluYWwgSVZhbGlkYXRpb25Db250ZXh0IGN0eCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZSB3cyA9IChJV2ViU2VydmljZSljdHguZ2V0VGFyZ2V0KCk7DQotCQlpZiAod3MuZ2V0U2VydmljZUVuZHBvaW50KCkhPW51bGwgJiYgd3MuZ2V0U2VydmljZUVuZHBvaW50KCkuaXNJbXBsaWNpdCgpKSB7CQkJDQotCQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdzKTsNCi0JCX0JDQotCQkNCi0JCWlmIChoYXNOYW1lQXR0cmlidXRlKHdzKSkgew0KLQkJCXJldHVybiBjcmVhdGVTdGF0dXMod3MsIFZhbGlkYXRpb25NZXNzYWdlcy5Xc1ZhbGlkYXRpb25fTmFtZVNob3VsZE5vdEJlVXNlZFdpdGhTZWksIFdTX0FOTk9UQVRJT04sIE5BTUVfQVRUUklCVVRFKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdzKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTmFtZUF0dHJpYnV0ZShmaW5hbCBJV2ViU2VydmljZSB3ZWJTZXJ2aWNlKQ0KLQl7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gZmluZEFubm90YXRpb24od2ViU2VydmljZSwgV1NfQU5OT1RBVElPTik7DQotCQlpZiAoYW5ub3RhdGlvbj09bnVsbCkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShOQU1FX0FUVFJJQlVURSkhPW51bGw7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvUG9ydE5hbWVJc05DTmFtZUNvbnN0cmFpbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJzZXJ2aWNlL1BvcnROYW1lSXNOQ05hbWVDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2YjUyNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvUG9ydE5hbWVJc05DTmFtZUNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ud2Vic2VydmljZTsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5QT1JUX05BTUVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT047DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5JVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLldzZGxOYW1lc1ZhbGlkYXRvcjsNCi0NCi0vKioNCi0gKiBDaGVja3MgaWYgcG9ydE5hbWUgYXR0cmlidXRlIG9mIFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBpcyB2YWxpZCBOQ05hbWUgDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQb3J0TmFtZUlzTkNOYW1lQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQNCi17DQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciAtIG5vIHNwZWNpZmljIHByb2Nlc3NpbmcgaGVyZSANCi0JICovDQotCXB1YmxpYyBQb3J0TmFtZUlzTkNOYW1lQ29uc3RyYWludCgpIHsNCi0JCXN1cGVyKG5ldyBXc0NvbnN0cmFpbnREZXNjcmlwdG9yKCkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1ZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzID0gKElXZWJTZXJ2aWNlKWN0eC5nZXRUYXJnZXQoKTsNCi0JCWZpbmFsIElTdGF0dXMgc3RhdHVzID0gV3NkbE5hbWVzVmFsaWRhdG9yLnZhbGlkYXRlTkNOYW1lMihQT1JUX05BTUVfQVRUUklCVVRFLCB3cy5nZXRQb3J0TmFtZSgpKTsNCi0JCWlmICghc3RhdHVzLmlzT0soKSkgew0KLQkJCXJldHVybiBjcmVhdGVTdGF0dXMod3MsIHN0YXR1cy5nZXRNZXNzYWdlKCksIFdTX0FOTk9UQVRJT04sIFBPUlRfTkFNRV9BVFRSSUJVVEUpOw0KLQkJfQkNCi0JCQ0KLQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdzKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9TZXJ2aWNlTmFtZUlzTkNOYW1lQ29uc3RyYWludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvU2VydmljZU5hbWVJc05DTmFtZUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTc5ZGJhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9TZXJ2aWNlTmFtZUlzTkNOYW1lQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJzZXJ2aWNlOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLlNFUlZJQ0VfTkFNRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuV3NkbE5hbWVzVmFsaWRhdG9yOw0KLQ0KLS8qKg0KLSAqIENoZWNrcyBpZiBzZXJ2aWNlTmFtZSBhdHRyaWJ1dGUgb2YgV2ViU2VydmljZSBhbm5vdGF0aW9uIGlzIHZhbGlkIE5DTmFtZQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2VydmljZU5hbWVJc05DTmFtZUNvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50DQotew0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgLSBubyBzcGVjaWZpYyBwcm9jZXNzaW5nIGhlcmUgDQotCSAqLw0KLQlwdWJsaWMgU2VydmljZU5hbWVJc05DTmFtZUNvbnN0cmFpbnQoKSB7DQotCQlzdXBlcihuZXcgV3NDb25zdHJhaW50RGVzY3JpcHRvcigpKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9WYWxpZGF0ZShmaW5hbCBJVmFsaWRhdGlvbkNvbnRleHQgY3R4KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzID0gKElXZWJTZXJ2aWNlKWN0eC5nZXRUYXJnZXQoKTsNCi0JCWZpbmFsIElTdGF0dXMgc3RhdHVzID0gV3NkbE5hbWVzVmFsaWRhdG9yLnZhbGlkYXRlTkNOYW1lMihTRVJWSUNFX05BTUVfQVRUUklCVVRFLCB3cy5nZXROYW1lKCkpOw0KLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7DQotCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyh3cywgc3RhdHVzLmdldE1lc3NhZ2UoKSwgV1NfQU5OT1RBVElPTiwgU0VSVklDRV9OQU1FX0FUVFJJQlVURSk7DQotCQl9CQ0KLQkJDQotCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod3MpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJzZXJ2aWNlL1RhcmdldE5zVmFsaWRVcmlDb25zdHJhaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9UYXJnZXROc1ZhbGlkVXJpQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZDE1Yzg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJzZXJ2aWNlL1RhcmdldE5zVmFsaWRVcmlDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLndlYnNlcnZpY2U7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgamF2YS5uZXQuVVJJOw0KLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5JVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludDsNCi0NCi0vKioNCi0gKiBDaGVja3MgaWYgdGFyZ2V0TmFtZXNwYWNlIGF0dHJpYnV0ZSBvZiBXZWJTZXJ2aWNlIGFubm90YXRpb24gaXMgdmFsaWQgVVJJDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBUYXJnZXROc1ZhbGlkVXJpQ29uc3RyYWludCAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50DQotew0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgLSBubyBzcGVjaWZpYyBwcm9jZXNzaW5nIGhlcmUgDQotCSAqLw0KLQlwdWJsaWMgVGFyZ2V0TnNWYWxpZFVyaUNvbnN0cmFpbnQoKSB7DQotCQlzdXBlcihuZXcgV3NDb25zdHJhaW50RGVzY3JpcHRvcigpKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9WYWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgY3R4KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZSB3cyA9IChJV2ViU2VydmljZSljdHguZ2V0VGFyZ2V0KCk7IA0KLQkJdHJ5IHsNCi0JCQluZXcgVVJJKHdzLmdldFRhcmdldE5hbWVzcGFjZSgpKTsNCi0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7IC8vICRKTC1FWEMkDQotCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyh3cywgSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuYmluZCgNCi0JCQkJCQkJCQkJCUpheFdzRG9tUnVudGltZU1lc3NhZ2VzLlRhcmdldE5zVmFsaWRVcmlDb25zdHJhaW50X1VSSV9TWU5UQVhfRVJST1IsDQotCQkJCQluZXcgT2JqZWN0W10ge2UuZ2V0SW5kZXgoKSwgZS5nZXRJbnB1dCgpLCBlLmdldFJlYXNvbigpfSkNCi0JCQkJCSwgV1NfQU5OT1RBVElPTiwgVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEUpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod3MpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJzZXJ2aWNlL1dzQ29uc3RyYWludERlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJzZXJ2aWNlL1dzQ29uc3RyYWludERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWQyOGNiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9Xc0NvbnN0cmFpbnREZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLndlYnNlcnZpY2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLkNvbnN0cmFpbnRTZXZlcml0eTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLkRvbVZhbGlkYXRpb25Db25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmRvbS52YWxpZGF0aW9uLkRvbVZhbGlkYXRpb25Db25zdGFudHM7DQotDQotLyoqDQotICogVGhlIGNvbnN0cmFpbnQgZGVzY3JpcHRvciBmb3IgV1MgY29uc3RyYWludHMgDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLWNsYXNzIFdzQ29uc3RyYWludERlc2NyaXB0b3IgZXh0ZW5kcyBEb21WYWxpZGF0aW9uQ29uc3RyYWludERlc2NyaXB0b3INCi17CQ0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgew0KLQkJcmV0dXJuIERvbVZhbGlkYXRpb25Db25zdGFudHMuV1NfQ09OU1RSQUlOVF9JRDsNCi0JfQ0KLQkNCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsNCi0JCXJldHVybiBKYXhXc0RvbVJ1bnRpbWVQbHVnaW4uUExVR0lOX0lEOw0KLQl9DQotDQotCXB1YmxpYyBDb25zdHJhaW50U2V2ZXJpdHkgZ2V0U2V2ZXJpdHkoKSB7DQotCQlyZXR1cm4gQ29uc3RyYWludFNldmVyaXR5LkVSUk9SOw0KLQl9DQotDQotCXB1YmxpYyBpbnQgZ2V0U3RhdHVzQ29kZSgpIHsNCi0JCXJldHVybiAtMjY7DQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvV3NDb25zdHJhaW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJzZXJ2aWNlL1dzQ29uc3RyYWludFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI3OWMyYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvV3NDb25zdHJhaW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ud2Vic2VydmljZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5tb2RlbC5JTW9kZWxDb25zdHJhaW50Ow0KLQ0KLS8qKg0KLSAqIFRoZSBjb25zdHJhaW50IHByb3ZpZGVyIGZvciBXZWJTZXJ2aWNlIG9iamVjdHMNCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFdzQ29uc3RyYWludFByb3ZpZGVyIA0KLXsNCi0JcHJpdmF0ZSBTZXQ8SU1vZGVsQ29uc3RyYWludD4gY29uc3RyYWludHM7Ow0KLQkNCi0JcHVibGljIENvbGxlY3Rpb248SU1vZGVsQ29uc3RyYWludD4gZ2V0Q29uc3RyYWludHMoKSANCi0Jew0KLQkJaWYgKGNvbnN0cmFpbnRzID09IG51bGwpIA0KLQkJew0KLQkJCWNvbnN0cmFpbnRzID0gbmV3IEhhc2hTZXQ8SU1vZGVsQ29uc3RyYWludD4oKTsNCi0JCQljb25zdHJhaW50cy5hZGQobmV3IFNlcnZpY2VOYW1lSXNOQ05hbWVDb25zdHJhaW50KCkpOw0KLQkJCWNvbnN0cmFpbnRzLmFkZChuZXcgUG9ydE5hbWVJc05DTmFtZUNvbnN0cmFpbnQoKSk7DQotCQkJY29uc3RyYWludHMuYWRkKG5ldyBUYXJnZXROc1ZhbGlkVXJpQ29uc3RyYWludCgpKTsNCi0JCQljb25zdHJhaW50cy5hZGQobmV3IEVuZHBvaW50SW50ZXJmYWNlRXhpc3RzQ29uc3RyYWludCgpKTsNCi0JCQljb25zdHJhaW50cy5hZGQobmV3IFdzZGxMb2NhdGlvbkNvcnJlY3RDb25zdHJhaW50KCkpOw0KLQkJCWNvbnN0cmFpbnRzLmFkZChuZXcgTmFtZVJlZHVuZGFudENvbnN0cmFpbnQoKSk7DQotCQkJY29uc3RyYWludHMuYWRkKG5ldyBFbmRwb2ludENvcnJlY3RDb25zdHJhaW50KCkpOw0KLQkJCWNvbnN0cmFpbnRzLmFkZChuZXcgRW5kcG9pbnRJbXBsZW1lbnRzU2VpQ29uc3RyYWludCgpKTsNCi0JCQljb25zdHJhaW50cy5hZGQobmV3IEVuZHBvaW50SXNTZXNzaW9uQmVhbkNvbnN0cmFpbnQoKSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBjb25zdHJhaW50czsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9Xc2RsTG9jYXRpb25Db3JyZWN0Q29uc3RyYWludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvV3NkbExvY2F0aW9uQ29ycmVjdENvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjRhNDUwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9Xc2RsTG9jYXRpb25Db3JyZWN0Q29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ud2Vic2VydmljZTsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5XU0RMX0xPQ0FUSU9OX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuQ29uc3RyYWludFNldmVyaXR5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLklBbm5vdGF0aW9uQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuRG9tMlJlc291cmNlTWFwcGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5tZXNzYWdlcy5WYWxpZGF0aW9uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBDaGVja3MgaWYgdGhlIFdTREwgbG9jYXRpb24gY29udGFpbnMgdmFsaWQgdmFsdWUuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXc2RsTG9jYXRpb25Db3JyZWN0Q29uc3RyYWludCAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50DQotew0KLQlwdWJsaWMgV3NkbExvY2F0aW9uQ29ycmVjdENvbnN0cmFpbnQoKSB7DQotCQlzdXBlcihuZXcgV2FybmluZ0NvbnN0cmFpbnREZXNjcmlwdG9yKCkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1ZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSAoSVdlYlNlcnZpY2UpY3R4LmdldFRhcmdldCgpOw0KLQkJZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9IGZpbmRBbm5vdGF0aW9uKHdzLCBXU19BTk5PVEFUSU9OKTsNCi0JCWlmIChhbm5vdGF0aW9uPT1udWxsIHx8IGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXU0RMX0xPQ0FUSU9OX0FUVFJJQlVURSk9PW51bGwpIHsNCi0JCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod3MpOw0KLQkJfQ0KLQkJDQotCQlpZiAoY2hlY2tXc2RsTG9jYXRpb25JblByb2plY3Qod3MpKSB7DQotCQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdzKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGNoZWNrV3NkbFVybCh3cywgYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdTRExfTE9DQVRJT05fQVRUUklCVVRFKSk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJU3RhdHVzIGNoZWNrV3NkbFVybChmaW5hbCBJV2ViU2VydmljZSB3cywgZmluYWwgU3RyaW5nIHdzZGxVcmwpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdHJ5IHsNCi0JCQluZXcgVVJMKHdzZGxVcmwpOw0KLQkJfQ0KLQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7IC8vICRKTC1FWEMkDQotCQkJU3RyaW5nIG1zZyA9IFZhbGlkYXRpb25NZXNzYWdlcy5iaW5kKFZhbGlkYXRpb25NZXNzYWdlcy5Xc1ZhbGlkYXRpb25fV3NkbERvZXNOb3RFeGlzdHMsDQotCQkJCQllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7DQotCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyh3cywgbXNnLCBXU19BTk5PVEFUSU9OLCBXU0RMX0xPQ0FUSU9OX0FUVFJJQlVURSk7DQotCQl9IA0KLQkJDQotCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod3MpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1dzZGxMb2NhdGlvbkluUHJvamVjdChmaW5hbCBJV2ViU2VydmljZSB3ZWJTZXJ2aWNlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlmaW5hbCBJQW5ub3RhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChJQW5ub3RhdGlvbkFkYXB0ZXIpQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdlYlNlcnZpY2UsIElBbm5vdGF0aW9uQWRhcHRlci5jbGFzcyk7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gYWRhcHRlci5nZXRBbm5vdGF0aW9uKFdTX0FOTk9UQVRJT04pOw0KLQkJaWYgKGFubm90YXRpb249PW51bGwpIHsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXU0RMX0xPQ0FUSU9OX0FUVFJJQlVURSk7DQotCQlpZiAod3NkbExvY2F0aW9uID09IG51bGwpIHsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJaWYgKHdzZGxMb2NhdGlvbi50cmltKCkubGVuZ3RoKCk9PTApIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCXJldHVybiBmaW5kRmlsZSh3ZWJTZXJ2aWNlLCB3c2RsTG9jYXRpb24pOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaW5kRmlsZShmaW5hbCBJV2ViU2VydmljZSB3ZWJTZXJ2aWNlLCBmaW5hbCBTdHJpbmcgZmlsZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gRG9tMlJlc291cmNlTWFwcGVyLklOU1RBTkNFLmZpbmRQcm9qZWN0KChJV2ViU2VydmljZVByb2plY3Qpd2ViU2VydmljZS5lQ29udGFpbmVyKCkpOw0KLQkJSVJlc291cmNlIHJlc291cmNlID0gcHJvamVjdC5maW5kTWVtYmVyKGZpbGUpOw0KLQkJaWYgKHJlc291cmNlIT1udWxsKQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQkNCi0JCWZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsNCi0JCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA6IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCkpIA0KLQkJew0KLQkJCWlmIChyb290LmdldFJlc291cmNlKCk9PW51bGwpIHsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCQ0KLQkJCWlmIChyb290LmdldFJlc291cmNlKCkuZ2V0VHlwZSgpPT1JUmVzb3VyY2UuRk9MREVSKSB7DQotCQkJCWlmICgoKElGb2xkZXIpIHJvb3QuZ2V0UmVzb3VyY2UoKSkuZmluZE1lbWJlcihmaWxlKSAhPSBudWxsKSB7DQotCQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFdhcm5pbmdDb25zdHJhaW50RGVzY3JpcHRvciBleHRlbmRzIFdzQ29uc3RyYWludERlc2NyaXB0b3INCi0Jew0KLQkJQE92ZXJyaWRlDQotCQlwdWJsaWMgQ29uc3RyYWludFNldmVyaXR5IGdldFNldmVyaXR5KCkgew0KLQkJCXJldHVybiBDb25zdHJhaW50U2V2ZXJpdHkuV0FSTklORzsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDFhNDMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk3ODRhYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzBiYjJiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jVHVlIEp1biAyMyAxMDozODoyMiBFRVNUIDIwMDkNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTI2NWQ5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wDQotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMA0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWk7c2luZ2xldG9uOj10cnVlDQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQotQnVuZGxlLVZlcnNpb246IDEuMC4wDQotQnVuZGxlLUNsYXNzUGF0aDogLg0KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwucGx1Z2luLkRvbVVpJEltcGxlbWVudGF0aW9uDQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41DQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWksDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwuaW1wbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzIiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5pbnRlcm5hbC5wbHVnaW4NCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU7dmlzaWJpbGl0eTo9cmVleHBvcnQsDQotIG9yZy5lY2xpcHNlLmVtZi5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LA0KLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLA0KLSBvcmcuZWNsaXBzZS5qZmFjZQ0KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQxMGFmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+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+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNmVlYmZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1RodSBEZWMgMTggMTE6MDA6MjYgR01UIDIwMDgNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlmYzhkMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuNS4yLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjIwNCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlO2J1bmRsZS12ZXJzaW9uPSIwLjUuMCIsCi0gb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3Jpbmc7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNS4wIiwKLSBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUltcG9ydC1QYWNrYWdlOiBqYXZheC5qd3MsCi0gamF2YXguandzLnNvYXAsCi0gamF2YXgueG1sLndzO3ZlcnNpb249IjIuMS4wIiwKLSBqYXZheC54bWwud3MuaHR0cDt2ZXJzaW9uPSIyLjEuMCIsCi0gamF2YXgueG1sLndzLnNvYXA7dmVyc2lvbj0iMi4xLjAiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmNvcnJlY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmEwMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAxOSwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNGU2MzMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgaWNvbnMvLFwNCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcw0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL2VsY2wxNi9maWx0ZXJfcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvZWxjbDE2L2ZpbHRlcl9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YzllNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvZWxjbDE2L2ZpbHRlcl9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9ldmlldzE2L2Fubm90YXRpb25fb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL2V2aWV3MTYvYW5ub3RhdGlvbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MzVkNjJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL2V2aWV3MTYvYW5ub3RhdGlvbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvZXZpZXcxNi9wcm9wX3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL2V2aWV3MTYvcHJvcF9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMWM5OTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvZXZpZXcxNi9wcm9wX3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL29iajE2L2JpbmRpbmdfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL29iajE2L2JpbmRpbmdfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk2ZTJmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9vYmoxNi9iaW5kaW5nX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9vYmoxNi9mYWxzZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9vYmoxNi9mYWxzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZDliMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvb2JqMTYvZmFsc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvb2JqMTYvaHR0cGJpbmRpbmdfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL29iajE2L2h0dHBiaW5kaW5nX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MjhlZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvb2JqMTYvaHR0cGJpbmRpbmdfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL29iajE2L3NvYXBiaW5kaW5nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9vYmoxNi9zb2FwYmluZGluZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTVmNmJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL29iajE2L3NvYXBiaW5kaW5nX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9vYmoxNi90cnVlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL29iajE2L3RydWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2FjYjk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL29iajE2L3RydWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIxMjAxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI3Byb3BlcnRpZXMgZmlsZSBmb3IgSkFYV1MgVUkKLXBsdWdpbk5hbWU9SkFYLVdTIFRvb2xzIFVJIChJbmN1YmF0aW9uKQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotQU5OT1RBVElPTlNfVklFV19DQVRFR09SWV9OQU1FPUpBWC1XUwotQU5OT1RBVElPTlNfVklFV19OQU1FPUFubm90YXRpb24gUHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJhOTJmMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4NCi08cGx1Z2luPg0KLQ0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4NCi0gICAgICA8Y2F0ZWdvcnkNCi0gICAgICAgICAgICBuYW1lPSIlQU5OT1RBVElPTlNfVklFV19DQVRFR09SWV9OQU1FIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuandzdC51aSI+DQotICAgICAgPC9jYXRlZ29yeT4NCi0gICAgICA8dmlldw0KLSAgICAgICAgICAgIG5hbWU9IiVBTk5PVEFUSU9OU19WSUVXX05BTUUiDQotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZXZpZXcxNi9wcm9wX3BzLmdpZiINCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LndzLmp3c3QudWkiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS52aWV3cy5Bbm5vdGF0aW9uc1ZpZXciDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS52aWV3cy5Bbm5vdGF0aW9uc1ZpZXciPg0KLSAgICAgIDwvdmlldz4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICANCi0gPCEtLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4NCi0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24gdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmpkdC51aS5KYXZhUGVyc3BlY3RpdmUiPg0KLSAgICAgICAgIDx2aWV3DQotICAgICAgICAgICAgICAgcmVsYXRpdmU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb2JsZW1WaWV3Ig0KLSAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcD0ic3RhY2siDQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS52aWV3cy5Bbm5vdGF0aW9uc1ZpZXciPg0KLSAgICAgICAgIDwvdmlldz4NCi0gICAgICA8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPg0KLSAgIDwvZXh0ZW5zaW9uPiAtLT4NCi0NCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uSW5pdGlhbGl6ZXIiPg0KLSAgICAgIDxpbml0aWFsaXplcg0KLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJTZXJ2aWNlIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuaW5pdGlhbGl6YXRpb24uV2ViU2VydmljZUF0dHJpYnV0ZUluaXRpYWxpemVyIj4NCi0gICAgICA8L2luaXRpYWxpemVyPg0KLSAgICAgIDxpbml0aWFsaXplcg0KLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJNZXRob2QiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbi5XZWJNZXRob2RBdHRyaWJ1dGVJbml0aWFsaXplciI+DQotICAgICAgPC9pbml0aWFsaXplcj4NCi0gICAgICA8aW5pdGlhbGl6ZXINCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViUGFyYW0iDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbi5XZWJQYXJhbUF0dHJpYnV0ZUluaXRpYWxpemVyIj4NCi0gICAgICA8L2luaXRpYWxpemVyPg0KLSAgICAgIDxpbml0aWFsaXplcg0KLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJSZXN1bHQiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbi5XZWJSZXN1bHRBdHRyaWJ1dGVJbml0aWFsaXplciI+DQotICAgICAgPC9pbml0aWFsaXplcj4NCi0gICAgICA8aW5pdGlhbGl6ZXINCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmluaXRpYWxpemF0aW9uLlNPQVBCaW5kaW5nQXR0cmlidXRlSW5pdGlhbGl6ZXIiPg0KLSAgICAgIDwvaW5pdGlhbGl6ZXI+ICAgICAgDQotICAgICAgPGluaXRpYWxpemVyDQotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuaW5pdGlhbGl6YXRpb24uUmVxdWVzdFdyYXBwZXJBdHRyaWJ1dGVJbml0aWFsaXplciI+DQotICAgICAgPC9pbml0aWFsaXplcj4NCi0gICAgICA8aW5pdGlhbGl6ZXINCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuaW5pdGlhbGl6YXRpb24uUmVzcG9uc2VXcmFwcGVyQXR0cmlidXRlSW5pdGlhbGl6ZXIiPg0KLSAgICAgIDwvaW5pdGlhbGl6ZXI+DQotICAgICAgPGluaXRpYWxpemVyDQotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXgueG1sLndzLkJpbmRpbmdUeXBlIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuaW5pdGlhbGl6YXRpb24uQmluZGluZ1R5cGVBdHRyaWJ1dGVJbml0aWFsaXplciI+DQotICAgICAgPC9pbml0aWFsaXplcj4NCi0gICA8L2V4dGVuc2lvbj4NCi0gIA0KLSAgIDxleHRlbnNpb24gaWQ9ImpheHdzUHJvcG9zYWxDb21wdXRlciINCi0gICAgICAgICBuYW1lPSJKQVgtV1MgUHJvcG9zYWxzIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZHQudWkuamF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIj4NCi0gICAgICA8cHJvcG9zYWxDYXRlZ29yeQ0KLSAgICAgICAgICAgIGljb249Imljb25zL2V2aWV3MTYvYW5ub3RhdGlvbl9vYmouZ2lmIj4NCi0gICAgICA8L3Byb3Bvc2FsQ2F0ZWdvcnk+DQotICAgPC9leHRlbnNpb24+DQotDQotICAgPGV4dGVuc2lvbiBpZD0iSkFYV1NKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIiDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC51aS5qYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIiPg0KLSAgICAgIDxqYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXINCi0gICAgICAgICAgICBhY3RpdmF0ZT0idHJ1ZSINCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkuamF4d3NQcm9wb3NhbENvbXB1dGVyIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuY29udGVudGFzc2lzdC5Bbm5vdGF0aW9uQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIiPg0KLSAgICAgICAgIDxwYXJ0aXRpb24NCi0gICAgICAgICAgICAgICB0eXBlPSJfX2RmdGxfcGFydGl0aW9uX2NvbnRlbnRfdHlwZSI+DQotICAgICAgICAgPC9wYXJ0aXRpb24+DQotICAgICAgICAgPHBhcnRpdGlvbg0KLSAgICAgICAgICAgICAgIHR5cGU9Il9famF2YV9zdHJpbmciPg0KLSAgICAgICAgIDwvcGFydGl0aW9uPg0KLSAgICAgIDwvamF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLQ0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC51aS5xdWlja0ZpeFByb2Nlc3NvcnMiPg0KLSAgICAgIDxxdWlja0ZpeFByb2Nlc3Nvcg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuY29ycmVjdGlvbi5KQVhXU1F1aWNrRml4UHJvY2Vzc29yIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkuYW5ub3RhdGlvbnMuY29ycmVjdGlvbi5KQVhXU1F1aWNrRml4UHJvY2Vzc29yIj4NCi0gICAgICAgICA8aGFuZGxlZE1hcmtlclR5cGVzPg0KLSAgICAgICAgICAgIDxtYXJrZXJUeXBlIGlkPSJvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmUuY29tcGlsZS5wcm9ibGVtIi8+DQotICAgICAgICAgICAgPG1hcmtlclR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS5ub25yZWNvbmNpbGUuY29tcGlsZS5wcm9ibGVtIi8+DQotICAgICAgICAgPC9oYW5kbGVkTWFya2VyVHlwZXM+DQotICAgICAgPC9xdWlja0ZpeFByb2Nlc3Nvcj4NCi0gICA8L2V4dGVuc2lvbj4NCi0NCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pZGUubWFya2VyUmVzb2x1dGlvbiI+DQotICAgICAgPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3INCi0gICAgICAgICAgICBtYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmUuY29tcGlsZS5wcm9ibGVtIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuY29ycmVjdGlvbi5BUFRDb21waWxlUHJvYmxlbU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IiPg0KLSAgICAgIDwvbWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcj4NCi0gICAgICA8bWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcg0KLSAgICAgICAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS5ub25yZWNvbmNpbGUuY29tcGlsZS5wcm9ibGVtIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuY29ycmVjdGlvbi5BUFRDb21waWxlUHJvYmxlbU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IiPg0KLSAgICAgIDwvbWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcj4NCi0gICA8L2V4dGVuc2lvbj4NCi0NCi08L3BsdWdpbj4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL0pBWFdTVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9KQVhXU1VJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGU0N2RiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL0pBWFdTVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBKQVhXU1VJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSU1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfQUREX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfQlJPV1NFX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfRE9XTl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX0VESVRfQVJSQVlfVkFMVUVTX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfUkVNT1ZFX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfU0VMRUNUX0NMQVNTX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfVVBfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9ORVNURURfQVJSQVlTX05PVF9TVVBQT1JURUQ7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTl9FRElUSU5HX1NVUFBPUlRfTk9UX1ZBTElEX01FU1NBR0VfUFJFRklYOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTlNfVklFV19BTk5PVEFUSU9OU19DT0xVTU5fTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OU19WSUVXX0FOTk9UQVRJT05TX05PVF9BVkFJTEFCTEVfT05fU0VMRUNUSU9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05TX1ZJRVdfQU5OT1RBVElPTlNfVkFMVUVTX0NPTFVNTl9OQU1FOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTlNfVklFV19GSUxURVJfQUNUSU9OX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTlNfVklFV19GSUxURVJfQUNUSU9OX1NFTEVDVF9DQVRFR09SSUVTX01FU1NBR0U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OU19WSUVXX05PX1NVSVRBQkxFX0xJQlJBUllfRk9VTkQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTlNfVklFV19PVEhFUl9BTk5PVEFUSU9OX0xJQlJBUklFU19VU0U7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ09ORklHVVJFX0pBVkFfMV82X0xJQlJBUlk7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX0FOTk9UQVRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX01JU1NJTkdfTUVUSE9EOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9VTklNUExFTUVOVEVEX01FVEhPRFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ0hBTkdFX01FVEhPRF9WSVNJQklMSVRZOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENIQU5HRV9NRVRIT0RfUkVUVVJOX1RZUEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1JFQVRFX0NPTlNUUlVDVE9SOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTU9WRV9BTk5PVEFUSU9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTU9WRV9NRVRIT0Q7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNT1ZFX0ZJTkFMX01PRElGSUVSOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTU9WRV9JTExFR0FMX01PRElGSUVSOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTU9WRV9TVEFUSUNfTU9ESUZJRVI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNT1ZFX01FTUJFUlZBTFVFUEFJUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRU1PVkVfQUxMX09USEVSX01FTUJFUlZBTFVFUEFJUlM7Ci0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLSAgICAgICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSkFYV1NVSU1lc3NhZ2VzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEpBWFdTVUlNZXNzYWdlcygpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL0pBWFdTVUlNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9KQVhXU1VJTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE0YzMzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL0pBWFdTVUlNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1BTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX0FERF9MQUJFTD1BZGQKLUFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfQlJPV1NFX0xBQkVMPUJyb3dzZS4uLgotQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9ET1dOX0xBQkVMPURvd24KLUFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfRURJVF9BUlJBWV9WQUxVRVNfVElUTEU9RWRpdCBBcnJheSBWYWx1ZXMKLUFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfUkVNT1ZFX0xBQkVMPVJlbW92ZQotQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9TRUxFQ1RfQ0xBU1NfVElUTEU9U2VsZWN0IENsYXNzCi1BTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX1VQX0xBQkVMPVVwCi1BTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX05FU1RFRF9BUlJBWVNfTk9UX1NVUFBPUlRFRD1OZXN0ZWQgQXJyYXlzIHdpdGhpbiBBcnJheXMgbm90IHlldCBzdXBwb3J0ZWQKLUFOTk9UQVRJT05fRURJVElOR19TVVBQT1JUX05PVF9WQUxJRF9NRVNTQUdFX1BSRUZJWD1Ob3QgYSB2YWxpZCAKLQotQU5OT1RBVElPTlNfVklFV19BTk5PVEFUSU9OU19OT1RfQVZBSUxBQkxFX09OX1NFTEVDVElPTj1Bbm5vdGF0aW9ucyBub3QgYXZhaWxhYmxlIGZvciBjdXJyZW50IHNlbGVjdGlvbgotQU5OT1RBVElPTlNfVklFV19BTk5PVEFUSU9OU19WQUxVRVNfQ09MVU1OX05BTUU9VmFsdWVzCi1BTk5PVEFUSU9OU19WSUVXX0FOTk9UQVRJT05TX0NPTFVNTl9OQU1FPUFubm90YXRpb25zCi0KLUFOTk9UQVRJT05TX1ZJRVdfRklMVEVSX0FDVElPTl9OQU1FPUZpbHRlcnMuLi4KLUFOTk9UQVRJT05TX1ZJRVdfRklMVEVSX0FDVElPTl9TRUxFQ1RfQ0FURUdPUklFU19NRVNTQUdFPVNlbGVjdCBBbm5vdGF0aW9uIENhdGVnb3JpZXMgdG8gRmlsdGVyCi0KLUFOTk9UQVRJT05TX1ZJRVdfTk9fU1VJVEFCTEVfTElCUkFSWV9GT1VORD1ObyBzdWl0YWJsZSB7MH0gbGlicmFyeSBjYW4gYmUgZm91bmQgb24gdGhlIHByb2plY3RzIGNsYXNzcGF0aC5cblxuCi0KLUFOTk9UQVRJT05TX1ZJRVdfT1RIRVJfQU5OT1RBVElPTl9MSUJSQVJJRVNfVVNFPVxuKEZvciB1c2Ugd2l0aCBub24gSkFYLVdTIGxpYnJhcmllcyBwbGVhc2Ugc2V0dXAgdGhlIHByb2plY3Qgd2l0aCB0aGUgcmVxdWlyZWQgbGlicmFyaWVzLilcblxuCi0KLUNPTkZJR1VSRV9KQVZBXzFfNl9MSUJSQVJZPVRvIHNlbGVjdCBhIDEuNiBvciBhYm92ZSBjb21wbGlhbnQgSlJFIGNvbmZpZ3VyZSB0aGUgPGEgaHJlZj0iMSIgPkluc3RhbGxlZCBKUkVzPC9hPiBvciBjaGFuZ2UgdGhlIEpSRSBvbiB0aGUgPGEgaHJlZj0iMiIgPkphdmEgYnVpbGQgcGF0aDwvYT4uCi0KLUFERF9BTk5PVEFUSU9OPUFkZCBhbm5vdGF0aW9uICcnQHswfScnCi1BRERfTUlTU0lOR19NRVRIT0Q9QWRkIG1pc3NpbmcgbWV0aG9kCi1BRERfVU5JTVBMRU1FTlRFRF9NRVRIT0RTPUFkZCB1bmltcGxlbWVudGVkIG1ldGhvZHMKLUNIQU5HRV9NRVRIT0RfVklTSUJJTElUWT1DaGFuZ2UgbWV0aG9kIHZpc2liaWxpdHkgdG8gJyd7MH0nJwotQ0hBTkdFX01FVEhPRF9SRVRVUk5fVFlQRT1DaGFuZ2UgbWV0aG9kIHJldHVybiB0eXBlIHRvIG1hdGNoIFNFSSBtZXRob2QgcmV0dXJuIHR5cGUKLUNSRUFURV9DT05TVFJVQ1RPUj1DcmVhdGUgY29uc3RydWN0b3IgJyd7MH0oKScnCi1SRU1PVkVfQU5OT1RBVElPTj1SZW1vdmUgYW5ub3RhdGlvbiAnJ0B7MH0nJwotUkVNT1ZFX01FVEhPRD1SZW1vdmUgbWV0aG9kICcnezB9JycKLVJFTU9WRV9GSU5BTF9NT0RJRklFUj1SZW1vdmUgJydmaW5hbCcnIG1vZGlmaWVyIG9mICcnezB9JycoLi4pCi1SRU1PVkVfSUxMRUdBTF9NT0RJRklFUj1SZW1vdmUgSWxsZWdhbCBtb2RpZmllcgotUkVNT1ZFX1NUQVRJQ19NT0RJRklFUj1SZW1vdmUgJydzdGF0aWMnJyBtb2RpZmllciBvZiAnJ3swfScnKC4uKQotUkVNT1ZFX01FTUJFUlZBTFVFUEFJUj1SZW1vdmUgbWVtYmVyIHZhbHVlIHBhaXIgJyd7MH0nJwotUkVNT1ZFX0FMTF9PVEhFUl9NRU1CRVJWQUxVRVBBSVJTPVJlbW92ZSBhbGwgb3RoZXIgbWVtYmVyIHZhbHVlIHBhaXJzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL0pBWFdTVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvSkFYV1NVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzYxZGM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvSkFYV1NVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOw0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsNCi0NCi0vKioNCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSkFYV1NVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gew0KLQ0KLQkvLyBUaGUgcGx1Zy1pbiBJRA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlDQotCXByaXZhdGUgc3RhdGljIEpBWFdTVUlQbHVnaW4gcGx1Z2luOw0KLQkNCi0JLyoqDQotCSAqIFRoZSBjb25zdHJ1Y3Rvcg0KLQkgKi8NCi0JcHVibGljIEpBWFdTVUlQbHVnaW4oKSB7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOw0KLQkJcGx1Z2luID0gdGhpczsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXBsdWdpbiA9IG51bGw7DQotCQlzdXBlci5zdG9wKGNvbnRleHQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JICoNCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEpBWFdTVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsNCi0JCXJldHVybiBwbHVnaW47DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuDQotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aA0KLQkgKg0KLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aA0KLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsNCi0JCXJldHVybiBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgcGF0aCk7DQotCX0NCi0JDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsNCi0gICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKG5ldyBTdGF0dXMoc2V2ZXJpdHksIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgew0KLSAgICAgICAgSkFYV1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZXhjZXB0aW9uKSB7DQotICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELCANCi0gICAgICAgIAkJZXhjZXB0aW9uLnRvU3RyaW5nKCksIGV4Y2VwdGlvbikpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYWN0aW9ucy9Bbm5vdGF0aW9uc1ZpZXdGaWx0ZXJBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYWN0aW9ucy9Bbm5vdGF0aW9uc1ZpZXdGaWx0ZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI4ZjMzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2FjdGlvbnMvQW5ub3RhdGlvbnNWaWV3RmlsdGVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLnZpZXdzLkFubm90YXRpb25zVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkudmlld3MuQW5ub3RhdGlvbnNWaWV3Q2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25zVmlld0ZpbHRlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0gICAgcHJpdmF0ZSBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcjsKLSAgICBwcml2YXRlIEFubm90YXRpb25zVmlld0NhdGVnb3J5RmlsdGVyIGNhdGVnb3J5RmlsdGVyOwotICAgIAotICAgIHB1YmxpYyBBbm5vdGF0aW9uc1ZpZXdGaWx0ZXJBY3Rpb24oQW5ub3RhdGlvbnNWaWV3IGFubm90YXRpb25zVmlldywgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIsIFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHN1cGVyKHRleHQpOwotICAgICAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgICAgICAgdGhpcy5zZXRJbWFnZURlc2NyaXB0b3IoSkFYV1NVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL2VsY2wxNi9maWx0ZXJfcHMuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGNhdGVnb3J5RmlsdGVyID0gbmV3IEFubm90YXRpb25zVmlld0NhdGVnb3J5RmlsdGVyKGFubm90YXRpb25zVmlldywgdmlld2VyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIExpc3RTZWxlY3Rpb25EaWFsb2cgbGlzdFNlbGVjdGlvbkRpYWxvZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKHZpZXdlci5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uc01hbmFnZXIuZ2V0QW5ub3RhdGlvbkNhdGVnb3JpZXMoKSwgbmV3IEFubm90YXRpb25zQ2F0ZWdvcnlEaWFsb2dDb250ZW50UHJvdmlkZXIoKSwKLSAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvbnNDYXRlZ29yeURpYWxvZ0xhYmVsUHJvdmlkZXIoKSwgCi0gICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkFOTk9UQVRJT05TX1ZJRVdfRklMVEVSX0FDVElPTl9TRUxFQ1RfQ0FURUdPUklFU19NRVNTQUdFKTsKLSAgICAgICAgCi0gICAgICAgIGxpc3RTZWxlY3Rpb25EaWFsb2cuc2V0SW5pdGlhbEVsZW1lbnRTZWxlY3Rpb25zKGNhdGVnb3J5RmlsdGVyLmdldENhdGVnb3JpZXMoKSk7Ci0gICAgICAgIAotICAgICAgICBpbnQgcmV0dXJuVmFsdWUgPSBsaXN0U2VsZWN0aW9uRGlhbG9nLm9wZW4oKTsKLSAgICAgICAgaWYgKHJldHVyblZhbHVlID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgT2JqZWN0W10gcmVzdWx0ID0gbGlzdFNlbGVjdGlvbkRpYWxvZy5nZXRSZXN1bHQoKTsKLSAgICAgICAgICAgIGNhdGVnb3J5RmlsdGVyLmZpbHRlckFubm90YXRpb25zKEFycmF5cy5hc0xpc3QocmVzdWx0KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgaW5pdChJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIGNhdGVnb3J5RmlsdGVyLmluaXQobWVtZW50byk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIGNhdGVnb3J5RmlsdGVyLnNhdmVTdGF0ZShtZW1lbnRvKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQW5ub3RhdGlvbnNDYXRlZ29yeURpYWxvZ0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotICAgICAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChMaXN0PFN0cmluZz4paW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBbm5vdGF0aW9uc0NhdGVnb3J5RGlhbG9nTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb250ZW50YXNzaXN0L0Fubm90YXRpb25Db21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb250ZW50YXNzaXN0L0Fubm90YXRpb25Db21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjgyZDk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29udGVudGFzc2lzdC9Bbm5vdGF0aW9uQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb250ZW50YXNzaXN0Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ29tcGxldGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUV4dGVuZGVkTW9kaWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUGFja2FnZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5Db250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5KYXZhQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsNCi0NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIGltcGxlbWVudHMgSUphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciB7DQotDQotCXB1YmxpYyBBbm5vdGF0aW9uQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwdWJsaWMgTGlzdCBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQotCSAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQpIHsNCi0JICAgICAgICByZXR1cm4gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoKEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQpIGNvbnRleHQpOw0KLQkgICAgfQ0KLSAJICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCi0JfQ0KLQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgew0KLSAgICAgICAgQ29tcGxldGlvbkNvbnRleHQgY29tcGxldGlvbkNvbnRleHQgPSBjb250ZXh0LmdldENvcmVDb250ZXh0KCk7DQotICAgICAgICBpbnQgdG9rZW5TdGFydCA9IGNvbXBsZXRpb25Db250ZXh0LmdldE9mZnNldCgpOw0KLQkgICAgDQotCSAgICBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSA9IGNvbnRleHQuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQl0cnkgew0KLQkJCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IHNvdXJjZS5nZXRFbGVtZW50QXQodG9rZW5TdGFydCk7DQotCQkJaWYgKGphdmFFbGVtZW50ICE9IG51bGwpIHsNCi0JCSAgICAgICAgDQotCQkJICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBKRFRVdGlscy5nZXRDb21waWxhdGlvblVuaXQoc291cmNlKTsNCi0JCQkgICAgaW50IGVsZW1lbnRUeXBlID0gamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKTsNCi0JCQkgICAgDQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTikgew0KLSAgICAgICAgICAgICAgICAgICAgUGFja2FnZURlY2xhcmF0aW9uIHBhY2thZ2VEZWNsYXJhdGlvbiA9IGNvbXBpbGF0aW9uVW5pdC5nZXRQYWNrYWdlKCk7DQotICAgICAgICAgICAgICAgICAgICBMaXN0PEFubm90YXRpb24+IHBhY2thZ2VBbm5vdGF0aW9ucyA9IHBhY2thZ2VEZWNsYXJhdGlvbi5hbm5vdGF0aW9ucygpOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBwYWNrYWdlQW5ub3RhdGlvbnMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE5vcm1hbEFubm90YXRpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9ybWFsQW5ub3RhdGlvbiBub3JtYWxBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb247DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgPSBnZXRNZW1iZXJWYWx1ZVBhaXJGb3JQb3NpdGlvbihub3JtYWxBbm5vdGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuU3RhcnQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yQVNUTm9kZShub3JtYWxBbm5vdGF0aW9uLCBtZW1iZXJWYWx1ZVBhaXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VEZWNsYXJhdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuVFlQRSB8fCBlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuRklFTEQpIHsNCi0JCQkgICAgICAgIHJldHVybiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9ySmF2YUVsZW1lbnQoQW5ub3RhdGlvblV0aWxzLmdldEV4dGVuZGVkTW9kaWZpZXJzKA0KLQkJCSAgICAgICAgICAgICAgICBjb21waWxhdGlvblVuaXQsIGphdmFFbGVtZW50KSwgamF2YUVsZW1lbnQsIHRva2VuU3RhcnQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFR5cGUgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCkgew0KLSAgICAgICAgICAgICAgICAgICAgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TWV0aG9kUGFyYW1ldGVyKGNvbXBpbGF0aW9uVW5pdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKElNZXRob2QpamF2YUVsZW1lbnQsIHRva2VuU3RhcnQpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlciAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JBU1ROb2RlKHBhcmFtZXRlci5tb2RpZmllcnMoKSwgcGFyYW1ldGVyLCB0b2tlblN0YXJ0KTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JKYXZhRWxlbWVudChBbm5vdGF0aW9uVXRpbHMuZ2V0RXh0ZW5kZWRNb2RpZmllcnMoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxhdGlvblVuaXQsIGphdmFFbGVtZW50KSwgamF2YUVsZW1lbnQsIHRva2VuU3RhcnQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotCQkJfQ0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgew0KLQkJICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7DQotCQl9DQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQotCX0NCi0JDQotCXByaXZhdGUgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yQVNUTm9kZShMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBtb2RpZmllcnMsDQotCSAgICAgICAgQVNUTm9kZSBhc3ROb2RlLCBpbnQgb2Zmc2V0KSB7DQotICAgICAgICBmb3IgKElFeHRlbmRlZE1vZGlmaWVyIGV4dGVuZGVkTW9kaWZpZXIgOiBtb2RpZmllcnMpIHsNCi0gICAgICAgICAgICBpZiAoZXh0ZW5kZWRNb2RpZmllci5pc0Fubm90YXRpb24oKSAmJiBleHRlbmRlZE1vZGlmaWVyIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbikgew0KLSAgICAgICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZXh0ZW5kZWRNb2RpZmllcjsNCi0gICAgICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA9IGdldE1lbWJlclZhbHVlUGFpckZvclBvc2l0aW9uKG5vcm1hbEFubm90YXRpb24sIG9mZnNldCk7DQotICAgICAgICAgICAgICAgIGlmKG1lbWJlclZhbHVlUGFpciAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvckFTVE5vZGUobm9ybWFsQW5ub3RhdGlvbiwgbWVtYmVyVmFsdWVQYWlyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3ROb2RlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0JICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvckphdmFFbGVtZW50KExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IG1vZGlmaWVycywNCi0JICAgICAgICBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIGludCBvZmZzZXQpIHsNCi0gICAgICAgIGZvciAoSUV4dGVuZGVkTW9kaWZpZXIgZXh0ZW5kZWRNb2RpZmllciA6IG1vZGlmaWVycykgew0KLSAgICAgICAgICAgIGlmIChleHRlbmRlZE1vZGlmaWVyLmlzQW5ub3RhdGlvbigpICYmIGV4dGVuZGVkTW9kaWZpZXIgaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKSB7DQotICAgICAgICAgICAgICAgIE5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBleHRlbmRlZE1vZGlmaWVyOw0KLSAgICAgICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyID0gZ2V0TWVtYmVyVmFsdWVQYWlyRm9yUG9zaXRpb24obm9ybWFsQW5ub3RhdGlvbiwgb2Zmc2V0KTsNCi0gICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpciAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvckphdmFFbGVtZW50KG5vcm1hbEFubm90YXRpb24sIG1lbWJlclZhbHVlUGFpciwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFFbGVtZW50KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCi0gICAgfQ0KLQkNCi0JcHJpdmF0ZSBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JBU1ROb2RlKE5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiwNCi0JICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyLCBBU1ROb2RlIGFzdE5vZGUpIHsNCi0JICAgIElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyID0gQW5ub3RhdGlvbnNNYW5hZ2VyDQotICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXJGb3JOYW1lKG5vcm1hbEFubm90YXRpb24uZ2V0VHlwZU5hbWUoKSk7DQotCSAgICBpZiAoYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyICE9IG51bGwpIHsNCi0JICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JNZW1iZXJWYWx1ZVBhaXIoYXN0Tm9kZSwNCi0JICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcik7DQotCSAgICB9DQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQotCX0NCi0JDQotCXByaXZhdGUgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9ySmF2YUVsZW1lbnQoTm9ybWFsQW5ub3RhdGlvbiBub3JtYWxBbm5vdGF0aW9uLA0KLQkgICAgICAgIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIsIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgew0KLSAgICAgICAgSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciBhbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgPSBBbm5vdGF0aW9uc01hbmFnZXINCi0gICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplckZvck5hbWUobm9ybWFsQW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpKTsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihqYXZhRWxlbWVudCwNCi0gICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQotICAgIH0NCi0NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByaXZhdGUgTWVtYmVyVmFsdWVQYWlyIGdldE1lbWJlclZhbHVlUGFpckZvclBvc2l0aW9uKE5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiwgaW50IG9mZnNldCkgew0KLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBub3JtYWxBbm5vdGF0aW9uLnZhbHVlcygpOw0KLSAgICAgICAgZm9yIChNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyIDogbWVtYmVyVmFsdWVQYWlycykgew0KLSAgICAgICAgICAgIEV4cHJlc3Npb24gdmFsdWUgPSBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsNCi0gICAgICAgICAgICBpbnQgdmFsdWVTdGFydFBvc2l0aW9uID0gdmFsdWUuZ2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICAgICAgICAgIGludCB2YWx1ZUxlbmd0aCA9IHZhbHVlLmdldExlbmd0aCgpOw0KLSAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gdmFsdWVTdGFydFBvc2l0aW9uDQotICAgICAgICAgICAgICAgICAgICAmJiBvZmZzZXQgPD0gdmFsdWVTdGFydFBvc2l0aW9uICsgdmFsdWVMZW5ndGgpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1lbWJlclZhbHVlUGFpcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXB1YmxpYyBMaXN0IGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KLQl9DQotDQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2Vzc2lvbkVuZGVkKCkgew0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNlc3Npb25TdGFydGVkKCkgew0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9BUFRDb21waWxlUHJvYmxlbU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9BUFRDb21waWxlUHJvYmxlbU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjOWQ2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vQVBUQ29tcGlsZVByb2JsZW1NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuY29ycmVjdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmUudXRpbC5FY2xpcHNlTWVzc2FnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNvcnJlY3Rpb25FbmdpbmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbE1hcmtlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LmNvcnJlY3Rpb24uQXNzaXN0Q29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuY29ycmVjdGlvbi5KYXZhQ29ycmVjdGlvblByb2Nlc3NvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuY29ycmVjdGlvbi5Qcm9ibGVtTG9jYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LmNvcnJlY3Rpb24uQ29ycmVjdGlvbk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IuQ29ycmVjdGlvbk1hcmtlclJlc29sdXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuQ29tcGxldGlvblByb3Bvc2FsQ29tcGFyYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSW52b2NhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUphdmFDb21wbGV0aW9uUHJvcG9zYWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSVByb2JsZW1Mb2NhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yMjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7DQotDQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikNCi1wdWJsaWMgY2xhc3MgQVBUQ29tcGlsZVByb2JsZW1NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIGltcGxlbWVudHMgSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IyIHsNCi0NCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSU1hcmtlclJlc29sdXRpb25bXSBOT19SRVNPTFVUSU9OUyA9IG5ldyBJTWFya2VyUmVzb2x1dGlvblswXTsNCi0NCi0JcHVibGljIGJvb2xlYW4gaGFzUmVzb2x1dGlvbnMoSU1hcmtlciBtYXJrZXIpIHsNCi0JCWludCBpZCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoSUphdmFNb2RlbE1hcmtlci5JRCwgLTEpOw0KLSAgICAgICAgaWYgKGlkID09IEVjbGlwc2VNZXNzYWdlci5BUFRfUVVJQ0tfRklYX1BST0JMRU1fSUQpIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXB1YmxpYyBJTWFya2VyUmVzb2x1dGlvbltdIGdldFJlc29sdXRpb25zKElNYXJrZXIgbWFya2VyKSB7DQotCQlpZiAoIWhhc1Jlc29sdXRpb25zKG1hcmtlcikpIHsNCi0JCQlyZXR1cm4gTk9fUkVTT0xVVElPTlM7DQotCQl9DQotCQkNCi0JCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KG1hcmtlcik7DQotCQkNCi0JCWlmIChjb21waWxhdGlvblVuaXQgIT0gbnVsbCkgew0KLQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBGaWxlRWRpdG9ySW5wdXQoKElGaWxlKSBjb21waWxhdGlvblVuaXQuZ2V0UmVzb3VyY2UoKSk7DQotCQkJaWYgKGVkaXRvcklucHV0ICE9IG51bGwpIHsNCi0JCQkJSVByb2JsZW1Mb2NhdGlvbiBwcm9ibGVtTG9jYXRpb24gPSBjcmVhdGVQcm9ibGVtTG9jYXRpb24obWFya2VyKTsNCi0JCQkJaWYgKHByb2JsZW1Mb2NhdGlvbiAhPSBudWxsKSB7DQotCQkJCQlJSW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQgPSBuZXcgQXNzaXN0Q29udGV4dChjb21waWxhdGlvblVuaXQsDQotCQkJCQkJCXByb2JsZW1Mb2NhdGlvbi5nZXRPZmZzZXQoKSwgcHJvYmxlbUxvY2F0aW9uLmdldExlbmd0aCgpKTsNCi0JCQkJCQ0KLQkJCQkJTGlzdDxJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbD4gY29tcGxldGlvblByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8SUphdmFDb21wbGV0aW9uUHJvcG9zYWw+KCk7DQotCQkJCQkNCi0JCQkJCUlTdGF0dXMgc3RhdHVzID0gSmF2YUNvcnJlY3Rpb25Qcm9jZXNzb3IuY29sbGVjdENvcnJlY3Rpb25zKGludm9jYXRpb25Db250ZXh0LCANCi0JCQkJCQkJbmV3IElQcm9ibGVtTG9jYXRpb25bXSB7IHByb2JsZW1Mb2NhdGlvbiB9LCBjb21wbGV0aW9uUHJvcG9zYWxzKTsNCi0gICAgICAgICAgICAgICAgICAgIA0KLQkJCQkJaWYgKHN0YXR1cy5pc09LKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGNvbXBsZXRpb25Qcm9wb3NhbHMsIG5ldyBDb21wbGV0aW9uUHJvcG9zYWxDb21wYXJhdG9yKCkpOw0KLQ0KLSAgICAJCQkJCUlNYXJrZXJSZXNvbHV0aW9uW10gbWFya2VyUmVzb2x1dGlvbnMgPSBuZXcgSU1hcmtlclJlc29sdXRpb25bY29tcGxldGlvblByb3Bvc2Fscy5zaXplKCldOw0KLSAgICAJCQkJCWZvciAoaW50IGk9IDA7IGkgPCBjb21wbGV0aW9uUHJvcG9zYWxzLnNpemUoKTsgaSsrKSB7DQotICAgIAkJCQkJCW1hcmtlclJlc29sdXRpb25zW2ldID0gbmV3IENvcnJlY3Rpb25NYXJrZXJSZXNvbHV0aW9uKGNvbXBpbGF0aW9uVW5pdCwgDQotICAgIAkJCQkJCQkJcHJvYmxlbUxvY2F0aW9uLmdldE9mZnNldCgpLCBwcm9ibGVtTG9jYXRpb24uZ2V0TGVuZ3RoKCksIA0KLSAgICAJCQkJCQkJCWNvbXBsZXRpb25Qcm9wb3NhbHMuZ2V0KGkpLCBtYXJrZXIpOw0KLSAgICAJCQkJCX0NCi0gICAgCQkJCQlyZXR1cm4gbWFya2VyUmVzb2x1dGlvbnM7DQotICAgICAgICAgICAgICAgICAgICB9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gTk9fUkVTT0xVVElPTlM7DQotCX0NCi0NCi0JcHJpdmF0ZSBJUHJvYmxlbUxvY2F0aW9uIGNyZWF0ZVByb2JsZW1Mb2NhdGlvbihJTWFya2VyIG1hcmtlcikgew0KLQkJdHJ5IHsNCi0JCQlpbnQgaWQgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKElKYXZhTW9kZWxNYXJrZXIuSUQsIC0xKTsNCi0JCQlpbnQgb2Zmc2V0ID0gbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQsIC0xKTsNCi0JCQlpbnQgZW5kID0gbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5ELCAtMSk7DQotCQkJaW50IHNldmVyaXR5ID0gbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0lORk8pOw0KLQkJCVN0cmluZ1tdIGFyZ3VtZW50cyA9IENvcnJlY3Rpb25FbmdpbmUuZ2V0UHJvYmxlbUFyZ3VtZW50cyhtYXJrZXIpOw0KLQkJCVN0cmluZyBtYXJrZXJUeXBlID0gbWFya2VyLmdldFR5cGUoKTsNCi0JCQlpZiAoaWQgIT0gLTEgJiYgb2Zmc2V0ICE9IC0xICYmIGVuZCAhPSAtMSAmJiBhcmd1bWVudHMgIT0gbnVsbCkgew0KLQkJCQlpbnQgbGVuZ3RoID0gZW5kIC0gb2Zmc2V0Ow0KLQkJCQlib29sZWFuIGlzRXJyb3IgPSAoc2V2ZXJpdHkgPT0gSU1hcmtlci5TRVZFUklUWV9FUlJPUik7DQotCQkJCXJldHVybiBuZXcgUHJvYmxlbUxvY2F0aW9uKG9mZnNldCwgbGVuZ3RoLCBpZCwgYXJndW1lbnRzLCBpc0Vycm9yLCBtYXJrZXJUeXBlKTsNCi0JCQl9DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7DQotCQkJSkFYV1NVSVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOw0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdChJTWFya2VyIG1hcmtlcikgew0KLQkJSVJlc291cmNlIHJlc291cmNlID0gbWFya2VyLmdldFJlc291cmNlKCk7DQotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSAmJiByZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgew0KLSAgICAgICAgICAgIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IEphdmFDb3JlLmNyZWF0ZSgoSUZpbGUpIHJlc291cmNlKTsNCi0JCQlpZiAoamF2YUVsZW1lbnQgIT0gbnVsbCAmJiBqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsNCi0JCQkJcmV0dXJuIChJQ29tcGlsYXRpb25Vbml0KSBqYXZhRWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vQWJzdHJhY3RKYXZhQ29ycmVjdGlvblByb3Bzb2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vQWJzdHJhY3RKYXZhQ29ycmVjdGlvblByb3Bzb2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNjIzOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0Fic3RyYWN0SmF2YUNvcnJlY3Rpb25Qcm9wc29hbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuY29ycmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuSVVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YUNvcnJlY3Rpb25Qcm9wc29hbCBpbXBsZW1lbnRzIElKYXZhQ29tcGxldGlvblByb3Bvc2FsIHsKLQotICAgIHByaXZhdGUgaW50IHJlbGV2YW5jZTsKLSAgICBwcml2YXRlIFN0cmluZyBkaXNwbGF5U3RyaW5nOwotICAgIHByaXZhdGUgSW1hZ2UgaW1hZ2U7Ci0gICAgcHJpdmF0ZSBUZXh0RmlsZUNoYW5nZSB0ZXh0Q2hhbmdlOwotCi0gICAgcHJvdGVjdGVkIElJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dDsKLSAgICAKLSAgICBwdWJsaWMgQWJzdHJhY3RKYXZhQ29ycmVjdGlvblByb3Bzb2FsKElJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCwgU3RyaW5nIGRpc3BsYXlTdHJpbmcsIGludCByZWxldmFuY2UsIEltYWdlIGltYWdlKSB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbkNvbnRleHQgPSBpbnZvY2F0aW9uQ29udGV4dDsKLSAgICAgICAgdGhpcy5kaXNwbGF5U3RyaW5nID0gZGlzcGxheVN0cmluZzsKLSAgICAgICAgdGhpcy5yZWxldmFuY2UgPSByZWxldmFuY2U7Ci0gICAgICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRSZWxldmFuY2UoKSB7Ci0gICAgICAgIHJldHVybiByZWxldmFuY2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZEVkaXRzKFRleHRGaWxlQ2hhbmdlIHRleHRDaGFuZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotICAgIHByaXZhdGUgVGV4dEZpbGVDaGFuZ2UgZ2V0VGV4dENoYW5nZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRleHRDaGFuZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBpbnZvY2F0aW9uQ29udGV4dC5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgICAgIHRleHRDaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoZ2V0RGlzcGxheVN0cmluZygpLCAoSUZpbGUpIGNvbXBpbGF0aW9uVW5pdC5nZXRSZXNvdXJjZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgICAgIHRleHRDaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLSAgICAgICAgICAgIHRleHRDaGFuZ2Uuc2V0S2VlcFByZXZpZXdFZGl0cyh0cnVlKTsKLSAgICAgICAgICAgIHRleHRDaGFuZ2Uuc2V0U2F2ZU1vZGUoVGV4dEZpbGVDaGFuZ2UuTEVBVkVfRElSVFkpOwotICAgICAgICAgICAgYWRkRWRpdHModGV4dENoYW5nZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRleHRDaGFuZ2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFwcGx5KElEb2N1bWVudCBkb2N1bWVudCkgewotICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotICAgICAgICBJVW5kb01hbmFnZXIgbWFuYWdlcj0gUmVmYWN0b3JpbmdDb3JlLmdldFVuZG9NYW5hZ2VyKCk7Ci0gICAgICAgIGJvb2xlYW4gc3VjY2Vzc2Z1bCA9IGZhbHNlOwotICAgICAgICBDaGFuZ2UgdW5kb0NoYW5nZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0ZXh0Q2hhbmdlID0gZ2V0VGV4dENoYW5nZSgpOwotICAgICAgICAgICAgdGV4dENoYW5nZS5pbml0aWFsaXplVmFsaWRhdGlvbkRhdGEobW9uaXRvcik7Ci0gICAgICAgICAgICBSZWZhY3RvcmluZ1N0YXR1cyB2YWxpZCA9IHRleHRDaGFuZ2UuaXNWYWxpZChtb25pdG9yKTsKLSAgICAgICAgICAgIGlmICh2YWxpZC5pc09LKCkpIHsKLSAgICAgICAgICAgICAgICBtYW5hZ2VyLmFib3V0VG9QZXJmb3JtQ2hhbmdlKHRleHRDaGFuZ2UpOwotICAgICAgICAgICAgICAgIHVuZG9DaGFuZ2UgPSB0ZXh0Q2hhbmdlLnBlcmZvcm0obW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1hbmFnZXIuY2hhbmdlUGVyZm9ybWVkKHRleHRDaGFuZ2UsIHN1Y2Nlc3NmdWwpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1bmRvQ2hhbmdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHVuZG9DaGFuZ2UuaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKG1vbml0b3IpOwotICAgICAgICAgICAgbWFuYWdlci5hZGRVbmRvKHVuZG9DaGFuZ2UuZ2V0TmFtZSgpLCB1bmRvQ2hhbmdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbiBnZXRDb250ZXh0SW5mb3JtYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGRpc3BsYXlTdHJpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKCkgewotICAgICAgICByZXR1cm4gaW1hZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIFBvaW50IGdldFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vQWRkQW5ub3RhdGlvblRvVHlwZUNvcnJlY3Rpb25Qcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0FkZEFubm90YXRpb25Ub1R5cGVDb3JyZWN0aW9uUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0NThjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vQWRkQW5ub3RhdGlvblRvVHlwZUNvcnJlY3Rpb25Qcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb3JyZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkFTVFJld3JpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuSW1wb3J0UmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuQ29kZVN0eWxlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotCi1wdWJsaWMgY2xhc3MgQWRkQW5ub3RhdGlvblRvVHlwZUNvcnJlY3Rpb25Qcm9wb3NhbCBleHRlbmRzIEFic3RyYWN0SmF2YUNvcnJlY3Rpb25Qcm9wc29hbCB7Ci0KLSAgICBwcml2YXRlIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3M7Ci0gICAgCi0gICAgcHVibGljIEFkZEFubm90YXRpb25Ub1R5cGVDb3JyZWN0aW9uUHJvcG9zYWwoSUludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0LAotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb25DbGFzcywgU3RyaW5nIGRpc3BsYXlTdHJpbmcsIGludCByZWxldmFuY2UsIEltYWdlIGltYWdlKSB7Ci0gICAgICAgIHN1cGVyKGludm9jYXRpb25Db250ZXh0LCBkaXNwbGF5U3RyaW5nLCByZWxldmFuY2UsIGltYWdlKTsKLSAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2xhc3MgPSBhbm5vdGF0aW9uQ2xhc3M7Ci0gICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRFZGl0cyhUZXh0RmlsZUNoYW5nZSB0ZXh0Q2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gaW52b2NhdGlvbkNvbnRleHQuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgIAotICAgICAgICBDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IGludm9jYXRpb25Db250ZXh0LmdldEFTVFJvb3QoKTsKLSAgICAgICAgCi0gICAgICAgIEFTVCBhc3QgPSBhc3RSb290LmdldEFTVCgpOwotICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUoYXN0KTsKLQotICAgICAgICBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciA9IAotICAgICAgICAgICAgQW5ub3RhdGlvbnNNYW5hZ2VyLmdldEFubm90YXRpb25EZWZpbml0aW9uRm9yQ2xhc3MoYW5ub3RhdGlvbkNsYXNzKS4KLSAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIoKTsKLSAgICAgICAgCi0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmdldE1lbWJlclZhbHVlUGFpcnMoCi0gICAgICAgICAgICAgICAgY29tcGlsYXRpb25Vbml0LmZpbmRQcmltYXJ5VHlwZSgpLCBhc3QsIGFubm90YXRpb25DbGFzcyk7Ci0gICAgICAgIAotICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlQW5ub3RhdGlvbihhc3QsIGFubm90YXRpb25DbGFzcywKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICAgICAgCi0gICAgICAgIEFubm90YXRpb25VdGlscy5hZGRBbm5vdGF0aW9uVG9UeXBlKGNvbXBpbGF0aW9uVW5pdCwgYXN0Um9vdCwgcmV3cml0ZXIsIGNvbXBpbGF0aW9uVW5pdC5maW5kUHJpbWFyeVR5cGUoKSwKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLCB0ZXh0Q2hhbmdlKTsKLSAgICAgICAgICAgIAotICAgICAgICBJbXBvcnRSZXdyaXRlIGltcG9ydFJld3JpdGUgPSBDb2RlU3R5bGVDb25maWd1cmF0aW9uLmNyZWF0ZUltcG9ydFJld3JpdGUoY29tcGlsYXRpb25Vbml0LCB0cnVlKTsKLSAgICAgICAgaW1wb3J0UmV3cml0ZS5hZGRJbXBvcnQoYW5ub3RhdGlvbkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7Ci0gICAgICAgIGlmIChpbXBvcnRSZXdyaXRlLmhhc1JlY29yZGVkQ2hhbmdlcygpKSB7Ci0gICAgICAgICAgICBUZXh0RWRpdCBpbXBvcnRUZXh0RWRpdCA9IGltcG9ydFJld3JpdGUucmV3cml0ZUltcG9ydHMobnVsbCk7Ci0gICAgICAgICAgICB0ZXh0Q2hhbmdlLmFkZEVkaXQoaW1wb3J0VGV4dEVkaXQpOyAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9BZGRVbmltcGxlbWVudGVkTWV0aG9kQ29ycmVjdGlvblByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vQWRkVW5pbXBsZW1lbnRlZE1ldGhvZENvcnJlY3Rpb25Qcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2FkMzM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9BZGRVbmltcGxlbWVudGVkTWV0aG9kQ29ycmVjdGlvblByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb3JyZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JTWV0aG9kQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuQVNUUmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5JbXBvcnRSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkxpc3RSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQuY29kZW1hbmlwdWxhdGlvbi5Db2RlR2VuZXJhdGlvblNldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQuY29kZW1hbmlwdWxhdGlvbi5TdHViVXRpbGl0eTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkphdmFQcmVmZXJlbmNlc1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgQWRkVW5pbXBsZW1lbnRlZE1ldGhvZENvcnJlY3Rpb25Qcm9wb3NhbCBleHRlbmRzIEFic3RyYWN0SmF2YUNvcnJlY3Rpb25Qcm9wc29hbCB7Ci0KLSAgICBwcml2YXRlIEFTVE5vZGUgdHlwZURlY2xhcmF0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIGVuZHBvaW50SW50ZXJmYWNlOwotCi0gICAgcHVibGljIEFkZFVuaW1wbGVtZW50ZWRNZXRob2RDb3JyZWN0aW9uUHJvcG9zYWwoSUludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0LCBBU1ROb2RlIHR5cGVEZWNsYXJhdGlvbiwgCi0gICAgICAgICAgICBTdHJpbmcgZW5kcG9pbnRJbnRlcmZhY2UsIFN0cmluZyBkaXNwbGF5U3RyaW5nLCBpbnQgcmVsZXZhbmNlLCBJbWFnZSBpbWFnZSkgewotICAgICAgICBzdXBlcihpbnZvY2F0aW9uQ29udGV4dCwgZGlzcGxheVN0cmluZywgcmVsZXZhbmNlLCBpbWFnZSk7Ci0gICAgICAgIHRoaXMuZW5kcG9pbnRJbnRlcmZhY2UgPSBlbmRwb2ludEludGVyZmFjZTsKLSAgICAgICAgdGhpcy50eXBlRGVjbGFyYXRpb24gPSB0eXBlRGVjbGFyYXRpb247Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkRWRpdHMoVGV4dEZpbGVDaGFuZ2UgdGV4dENoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJTWV0aG9kQmluZGluZ1tdIHVuaW1wbGVtZW50ZWRNZXRob2RzID0gZ2V0VW5pbXBsZW1lbnRlZE1ldGhvZHModHlwZURlY2xhcmF0aW9uLCBlbmRwb2ludEludGVyZmFjZSk7Ci0gICAgICAgIGlmICh1bmltcGxlbWVudGVkTWV0aG9kcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBpbnZvY2F0aW9uQ29udGV4dC5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgCi0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gaW52b2NhdGlvbkNvbnRleHQuZ2V0QVNUUm9vdCgpOwotICAgICAgICAKLSAgICAgICAgQVNUIGFzdCA9IGFzdFJvb3QuZ2V0QVNUKCk7Ci0gICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShhc3QpOwotICAgICAgICAKLSAgICAgICAgQ29kZUdlbmVyYXRpb25TZXR0aW5ncyBzZXR0aW5ncyA9IEphdmFQcmVmZXJlbmNlc1NldHRpbmdzLmdldENvZGVHZW5lcmF0aW9uU2V0dGluZ3MoY29tcGlsYXRpb25Vbml0LmdldEphdmFQcm9qZWN0KCkpOwotICAgICAgICBzZXR0aW5ncy5vdmVycmlkZUFubm90YXRpb24gPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGFic3RyYWN0VHlwZURlY2xhcmF0aW9uID0gKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb247Ci0gICAgICAgIExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUoYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24sIAotICAgICAgICAgICAgICAgIGFic3RyYWN0VHlwZURlY2xhcmF0aW9uLmdldEJvZHlEZWNsYXJhdGlvbnNQcm9wZXJ0eSgpKTsKLSAKLSAgICAgICAgSW1wb3J0UmV3cml0ZSBpbXBvcnRSZXdyaXRlID0gSW1wb3J0UmV3cml0ZS5jcmVhdGUoYXN0Um9vdCwgdHJ1ZSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmltcGxlbWVudGVkTWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IHVuaW1wbGVtZW50ZWRNZXRob2RzW2ldOwotICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBTdHViVXRpbGl0eTIuY3JlYXRlSW1wbGVtZW50YXRpb25TdHViKGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgIGltcG9ydFJld3JpdGUsIGltcG9ydFJld3JpdGUuZ2V0RGVmYXVsdEltcG9ydFJld3JpdGVDb250ZXh0KCksIG1ldGhvZEJpbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgIG1ldGhvZEJpbmRpbmcuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCksIHNldHRpbmdzLCBmYWxzZSk7Ci0gICAgICAgICAgICBsaXN0UmV3cml0ZS5pbnNlcnRMYXN0KG1ldGhvZERlY2xhcmF0aW9uLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICB0ZXh0Q2hhbmdlLmFkZEVkaXQocmV3cml0ZXIucmV3cml0ZUFTVCgpKTsKLSAgICAgICAgaWYgKGltcG9ydFJld3JpdGUuaGFzUmVjb3JkZWRDaGFuZ2VzKCkpIHsKLSAgICAgICAgICAgIHRleHRDaGFuZ2UuYWRkRWRpdChpbXBvcnRSZXdyaXRlLnJld3JpdGVJbXBvcnRzKG51bGwpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSU1ldGhvZEJpbmRpbmdbXSBnZXRNZXRob2RzVG9JbXBsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRVbmltcGxlbWVudGVkTWV0aG9kcyh0eXBlRGVjbGFyYXRpb24sIGVuZHBvaW50SW50ZXJmYWNlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJTWV0aG9kQmluZGluZ1tdIGdldFVuaW1wbGVtZW50ZWRNZXRob2RzKEFTVE5vZGUgdHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgZW5kcG9pbnRJbnRlcmZhY2UpIHsKLSAgICAgICAgTGlzdDxJTWV0aG9kQmluZGluZz4gbWV0aG9kQmluZGluZ3MgPSBuZXcgQXJyYXlMaXN0PElNZXRob2RCaW5kaW5nPigpOwotICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uLmdldFBhcmVudCgpIGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICBDb21waWxhdGlvblVuaXQgaW1wbGVtZW50YXRpb25Db21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSB0eXBlRGVjbGFyYXRpb24uZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBpZiAoaW1wbGVtZW50YXRpb25Db21waWxhdGlvblVuaXQuZ2V0SmF2YUVsZW1lbnQoKSBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBpbXBsZW1lbnRhdGlvbkNvbXBpbGF0aW9uVW5pdC5nZXRKYXZhRWxlbWVudCgpLmdldEphdmFQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIElUeXBlIHNlaVR5cGUgPSBqYXZhUHJvamVjdC5maW5kVHlwZShlbmRwb2ludEludGVyZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoc2VpVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNlaSA9IHNlaVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb21waWxhdGlvblVuaXQgc2VpQ29tcGlsYXRpb25Vbml0ID0gQW5ub3RhdGlvblV0aWxzLmdldEFTVFBhcnNlcihzZWksIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1ldGhvZERlY2xhcmF0aW9uPiBpbXBsZW1lbnRhdGlvbk1ldGhvZHMgPSBnZXRNZXRob2REZWNsYXJhdGlvbnMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uQ29tcGlsYXRpb25Vbml0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IHNlaU1ldGhvZHMgPSBnZXRNZXRob2REZWNsYXJhdGlvbnMoc2VpQ29tcGlsYXRpb25Vbml0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gc2VpTWV0aG9kIDogc2VpTWV0aG9kcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW1wbGVtZW50ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIGltcGxNZXRob2QgOiBpbXBsZW1lbnRhdGlvbk1ldGhvZHMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQW5ub3RhdGlvblV0aWxzLmNvbXBhcmVNZXRob2RzKHNlaU1ldGhvZCwgaW1wbE1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWltcGxlbWVudGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEJpbmRpbmdzLmFkZChzZWlNZXRob2QucmVzb2x2ZUJpbmRpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXRob2RCaW5kaW5ncy50b0FycmF5KG5ldyBJTWV0aG9kQmluZGluZ1ttZXRob2RCaW5kaW5ncy5zaXplKCldKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBMaXN0PE1ldGhvZERlY2xhcmF0aW9uPiBnZXRNZXRob2REZWNsYXJhdGlvbnMoQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICBmaW5hbCBMaXN0PE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2REZWNsYXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZERlY2xhcmF0aW9uPigpOwotICAgICAgICAKLSAgICAgICAgY29tcGlsYXRpb25Vbml0LmFjY2VwdChuZXcgQVNUVmlzaXRvcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBtZXRob2REZWNsYXJhdGlvbnMuYWRkKG1ldGhvZERlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gbWV0aG9kRGVjbGFyYXRpb25zOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0NoYW5nZU1vZGlmaWVyQ29ycmVjdGlvblByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vQ2hhbmdlTW9kaWZpZXJDb3JyZWN0aW9uUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0YzdlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vQ2hhbmdlTW9kaWZpZXJDb3JyZWN0aW9uUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklFeHRlbmRlZE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5BU1RSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkxpc3RSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIENoYW5nZU1vZGlmaWVyQ29ycmVjdGlvblByb3Bvc2FsIGV4dGVuZHMgQWJzdHJhY3RKYXZhQ29ycmVjdGlvblByb3Bzb2FsIHsKLSAgICAKLSAgICBwcml2YXRlIElCaW5kaW5nIGJpbmRpbmc7Ci0gICAgcHJpdmF0ZSBpbnQgaW5jbHVkZWRNb2RpZmllcnM7Ci0gICAgcHJpdmF0ZSBpbnQgZXhjbHVkZWRNb2RpZmllcnM7Ci0gICAgCi0gICAgCi0gICAgcHVibGljIENoYW5nZU1vZGlmaWVyQ29ycmVjdGlvblByb3Bvc2FsKElJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCwgSUJpbmRpbmcgYmluZGluZywgCi0gICAgICAgICAgICBpbnQgaW5jbHVkZWRNb2RpZmllcnMsIGludCBleGNsdWRlZE1vZGlmaWVycywgU3RyaW5nIGRpc3BsYXlTdHJpbmcsIGludCByZWxldmFuY2UsIEltYWdlIGltYWdlKSB7Ci0gICAgICAgIHN1cGVyKGludm9jYXRpb25Db250ZXh0LCBkaXNwbGF5U3RyaW5nLCByZWxldmFuY2UsIGltYWdlKTsKLSAgICAgICAgdGhpcy5iaW5kaW5nID0gYmluZGluZzsKLSAgICAgICAgdGhpcy5pbmNsdWRlZE1vZGlmaWVycyA9IGluY2x1ZGVkTW9kaWZpZXJzOwotICAgICAgICB0aGlzLmV4Y2x1ZGVkTW9kaWZpZXJzID0gZXhjbHVkZWRNb2RpZmllcnM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHZvaWQgYWRkRWRpdHMoVGV4dEZpbGVDaGFuZ2UgdGV4dENoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IGludm9jYXRpb25Db250ZXh0LmdldEFTVFJvb3QoKTsKLSAgICAgICAgCi0gICAgICAgIEFTVCBhc3QgPSBhc3RSb290LmdldEFTVCgpOwotICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUoYXN0KTsKLQotICAgICAgICBBU1ROb2RlIGRlY2xhcmluZ05vZGUgPSBhc3RSb290LmZpbmREZWNsYXJpbmdOb2RlKGJpbmRpbmcpOwotICAgICAgICAKLSAgICAgICAgaW50IGNvbnNpZGVyZWRNb2RpZmllckZsYWdzID0gaW5jbHVkZWRNb2RpZmllcnMgfCBleGNsdWRlZE1vZGlmaWVyczsgCi0gICAgICAgIGludCBuZXdNb2RpZmllckZsYWdzID0gaW5jbHVkZWRNb2RpZmllcnMgJiBjb25zaWRlcmVkTW9kaWZpZXJGbGFnczsKLQotICAgICAgICBMaXN0UmV3cml0ZSBsaXN0UmV3cml0ZSA9IGdldExpc3RSZXdyaXRlKGRlY2xhcmluZ05vZGUsIHJld3JpdGVyKTsKLSAgICAgICAgaWYgKGxpc3RSZXdyaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8QVNUTm9kZT4gb3JpZ2luYWxMaXN0ID0gbGlzdFJld3JpdGUuZ2V0T3JpZ2luYWxMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKEFTVE5vZGUgYXN0Tm9kZSA6IG9yaWdpbmFsTGlzdCkgewotICAgICAgICAgICAgICAgIGlmIChhc3ROb2RlIGluc3RhbmNlb2YgTW9kaWZpZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgTW9kaWZpZXIgbW9kaWZpZXIgPSAoTW9kaWZpZXIpIGFzdE5vZGU7Ci0gICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllckZsYWcgPSBtb2RpZmllci5nZXRLZXl3b3JkKCkudG9GbGFnVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjb25zaWRlcmVkTW9kaWZpZXJGbGFncyAmIG1vZGlmaWVyRmxhZykgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuZXdNb2RpZmllckZsYWdzICYgbW9kaWZpZXJGbGFnKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFJld3JpdGUucmVtb3ZlKG1vZGlmaWVyLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vZGlmaWVyRmxhZ3MgJj0gfm1vZGlmaWVyRmxhZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgTGlzdDxNb2RpZmllcj4gbW9kaWZlcnMgPSBhc3QubmV3TW9kaWZpZXJzKG5ld01vZGlmaWVyRmxhZ3MpOwotICAgICAgICAgICAgQVNUTm9kZSBsYXN0QW5ub3RhdGlvbiA9IGdldExhc3RBbm5vdGF0aW9uKGxpc3RSZXdyaXRlKTsKLSAgICAgICAgICAgIGZvciAoTW9kaWZpZXIgbW9kaWZpZXIgOiBtb2RpZmVycykgewotICAgICAgICAgICAgICAgIGludCBtb2RpZmllckZsYWcgPSBtb2RpZmllci5nZXRLZXl3b3JkKCkudG9GbGFnVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoKG1vZGlmaWVyRmxhZyAmIChNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5QUklWQVRFIHwgTW9kaWZpZXIuUFJPVEVDVEVEKSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFJld3JpdGUuaW5zZXJ0QWZ0ZXIobW9kaWZpZXIsIGxhc3RBbm5vdGF0aW9uLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgCWxpc3RSZXdyaXRlLmluc2VydEZpcnN0KG1vZGlmaWVyLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGV4dENoYW5nZS5hZGRFZGl0KHJld3JpdGVyLnJld3JpdGVBU1QoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBBU1ROb2RlIGdldExhc3RBbm5vdGF0aW9uKExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlKSB7Ci0gICAgICAgIEFTVE5vZGUgbGFzdEFubm90YXRpb24gPSBudWxsOwotICAgICAgICBMaXN0PEFTVE5vZGU+IHJld3JpdHRlbkxpc3QgPSBsaXN0UmV3cml0ZS5nZXRSZXdyaXR0ZW5MaXN0KCk7Ci0gICAgICAgIGZvciAoQVNUTm9kZSBhc3ROb2RlIDogcmV3cml0dGVuTGlzdCkgewotICAgICAgICAgICAgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBJRXh0ZW5kZWRNb2RpZmllcikgewotICAgICAgICAgICAgICAgIElFeHRlbmRlZE1vZGlmaWVyIGV4dGVuZGVkTW9kaWZpZXIgPSAoSUV4dGVuZGVkTW9kaWZpZXIpIGFzdE5vZGU7Ci0gICAgICAgICAgICAgICAgaWYgKGV4dGVuZGVkTW9kaWZpZXIuaXNBbm5vdGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbGFzdEFubm90YXRpb24gPSBhc3ROb2RlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGFzdEFubm90YXRpb247Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTGlzdFJld3JpdGUgZ2V0TGlzdFJld3JpdGUoQVNUTm9kZSBhc3ROb2RlLCBBU1RSZXdyaXRlIGFzdFJld3JpdGUpIHsKLSAgICAgICAgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIGFzdE5vZGU7Ci0gICAgICAgICAgICByZXR1cm4gYXN0UmV3cml0ZS5nZXRMaXN0UmV3cml0ZShtZXRob2REZWNsYXJhdGlvbiwgTWV0aG9kRGVjbGFyYXRpb24uTU9ESUZJRVJTMl9QUk9QRVJUWSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSBhc3ROb2RlOwotICAgICAgICAgICAgcmV0dXJuIGFzdFJld3JpdGUuZ2V0TGlzdFJld3JpdGUodHlwZURlY2xhcmF0aW9uLCBUeXBlRGVjbGFyYXRpb24uTU9ESUZJRVJTMl9QUk9QRVJUWSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0NoYW5nZVJldHVyblR5cGVDb3JyZWN0aW9uUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9DaGFuZ2VSZXR1cm5UeXBlQ29ycmVjdGlvblByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MmFmODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0NoYW5nZVJldHVyblR5cGVDb3JyZWN0aW9uUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkFTVFJld3JpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuSW1wb3J0UmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuQ29kZVN0eWxlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgQ2hhbmdlUmV0dXJuVHlwZUNvcnJlY3Rpb25Qcm9wb3NhbCBleHRlbmRzIEFic3RyYWN0SmF2YUNvcnJlY3Rpb25Qcm9wc29hbCB7Ci0JCi0JcHJpdmF0ZSBUeXBlRGVjbGFyYXRpb24gaW1wbFR5cGVEZWNsYXJhdGlvbjsKLQlwcml2YXRlIE1ldGhvZERlY2xhcmF0aW9uIGltcGxNZXRob2REZWNsYXJhdGlvbjsKLQlwcml2YXRlIFN0cmluZyBlbmRwb2ludEludGVyZmFjZTsKLQkKLQlwdWJsaWMgQ2hhbmdlUmV0dXJuVHlwZUNvcnJlY3Rpb25Qcm9wb3NhbCgKLQkJCUlJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCwgVHlwZURlY2xhcmF0aW9uIGltcGxUeXBlRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uIGltcGxNZXRob2REZWNsYXJhdGlvbiwgU3RyaW5nIGVuZHBvaW50SW50ZXJmYWNlLCBTdHJpbmcgZGlzcGxheVN0cmluZywKLQkJCWludCByZWxldmFuY2UsIEltYWdlIGltYWdlKSB7Ci0JCXN1cGVyKGludm9jYXRpb25Db250ZXh0LCBkaXNwbGF5U3RyaW5nLCByZWxldmFuY2UsIGltYWdlKTsKLQkgICAgdGhpcy5pbXBsVHlwZURlY2xhcmF0aW9uID0gaW1wbFR5cGVEZWNsYXJhdGlvbjsKLQkgICAgdGhpcy5pbXBsTWV0aG9kRGVjbGFyYXRpb24gPSBpbXBsTWV0aG9kRGVjbGFyYXRpb247Ci0JICAgIHRoaXMuZW5kcG9pbnRJbnRlcmZhY2UgPSBlbmRwb2ludEludGVyZmFjZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRFZGl0cyhUZXh0RmlsZUNoYW5nZSB0ZXh0Q2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU1ldGhvZERlY2xhcmF0aW9uIHNlaU1ldGhvZERlY2xhcmF0aW9uID0gZ2V0U0VJTWV0aG9kRGVjbGFyYXRpb24oKTsKLQkJaWYgKHNlaU1ldGhvZERlY2xhcmF0aW9uID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLSAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBpbnZvY2F0aW9uQ29udGV4dC5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgCi0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gaW52b2NhdGlvbkNvbnRleHQuZ2V0QVNUUm9vdCgpOwotICAgICAgICAKLSAgICAgICAgQVNUIGFzdCA9IGFzdFJvb3QuZ2V0QVNUKCk7Ci0gICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShhc3QpOwotICAgICAgICBJVHlwZUJpbmRpbmcgcmV0dXJuVHlwZSA9IHNlaU1ldGhvZERlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nKCkuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICBJbXBvcnRSZXdyaXRlIGltcG9ydFJld3JpdGUgPSBDb2RlU3R5bGVDb25maWd1cmF0aW9uLmNyZWF0ZUltcG9ydFJld3JpdGUoY29tcGlsYXRpb25Vbml0LCB0cnVlKTsKLSAgICAgICAgVHlwZSB0eXBlID0gaW1wb3J0UmV3cml0ZS5hZGRJbXBvcnQocmV0dXJuVHlwZSwgYXN0KTsKLSAgICAgICAgcmV3cml0ZXIuc2V0KGltcGxNZXRob2REZWNsYXJhdGlvbiwgTWV0aG9kRGVjbGFyYXRpb24uUkVUVVJOX1RZUEUyX1BST1BFUlRZLCB0eXBlLCBudWxsKTsKLSAgICAgICAgcmV3cml0ZXIuc2V0KGltcGxNZXRob2REZWNsYXJhdGlvbiwgTWV0aG9kRGVjbGFyYXRpb24uRVhUUkFfRElNRU5TSU9OU19QUk9QRVJUWSwgbmV3IEludGVnZXIoMCksIG51bGwpOwotICAgICAgICAKLSAgICAgICAgdGV4dENoYW5nZS5hZGRFZGl0KHJld3JpdGVyLnJld3JpdGVBU1QoKSk7Ci0gICAgICAgIGlmIChpbXBvcnRSZXdyaXRlLmhhc1JlY29yZGVkQ2hhbmdlcygpKSB7Ci0gICAgICAgIAl0ZXh0Q2hhbmdlLmFkZEVkaXQoaW1wb3J0UmV3cml0ZS5yZXdyaXRlSW1wb3J0cyhudWxsKSk7Ci0gICAgICAgIH0KLQl9Ci0KLSAgICBwcml2YXRlIE1ldGhvZERlY2xhcmF0aW9uIGdldFNFSU1ldGhvZERlY2xhcmF0aW9uKCkgewotICAgICAgICBpZiAoaW1wbFR5cGVEZWNsYXJhdGlvbi5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgQ29tcGlsYXRpb25Vbml0IGltcGxDb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBpbXBsVHlwZURlY2xhcmF0aW9uLmdldFBhcmVudCgpOwotICAgICAgICAgICAgaWYgKGltcGxDb21waWxhdGlvblVuaXQuZ2V0SmF2YUVsZW1lbnQoKSBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBpbXBsQ29tcGlsYXRpb25Vbml0LmdldEphdmFFbGVtZW50KCkuZ2V0SmF2YVByb2plY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgSVR5cGUgc2VpVHlwZSA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKGVuZHBvaW50SW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChzZWlUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgc2VpQ29tcGlsYXRpb25Vbml0ID0gc2VpVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBpbGF0aW9uVW5pdCBzZWlBU1RSb290ID0gQW5ub3RhdGlvblV0aWxzLmdldEFTVFBhcnNlcihzZWlDb21waWxhdGlvblVuaXQsIHRydWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1ldGhvZERlY2xhcmF0aW9uPiBzZWlNZXRob2REZWNsYXJhdGlvbnMgPSBnZXRNZXRob2REZWNsYXJhdGlvbnMoc2VpQVNUUm9vdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIHNlaU1ldGhvZERlY2xhcmF0aW9uIDogc2VpTWV0aG9kRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJaWYgKEFubm90YXRpb25VdGlscy5jb21wYXJlTWV0aG9kcyhpbXBsTWV0aG9kRGVjbGFyYXRpb24sIHNlaU1ldGhvZERlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgCQlyZXR1cm4gc2VpTWV0aG9kRGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLQl9Ci0KLSAgICBwcml2YXRlIExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IGdldE1ldGhvZERlY2xhcmF0aW9ucyhDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZERlY2xhcmF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kRGVjbGFyYXRpb24+KCk7Ci0gICAgICAgIAotICAgICAgICBjb21waWxhdGlvblVuaXQuYWNjZXB0KG5ldyBBU1RWaXNpdG9yKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIG1ldGhvZERlY2xhcmF0aW9ucy5hZGQobWV0aG9kRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiBtZXRob2REZWNsYXJhdGlvbnM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0pBWFdTUXVpY2tGaXhQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9KQVhXU1F1aWNrRml4UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZTcwMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0pBWFdTUXVpY2tGaXhQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUE1lc3NhZ2VIYW5kbGVyczsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlLnV0aWwuRWNsaXBzZU1lc3NhZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnZpZXdzdXBwb3J0LkphdmFFbGVtZW50SW1hZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklQcm9ibGVtTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JUXVpY2tGaXhQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotQFN1cHByZXNzV2FybmluZ3MoeyAicmVzdHJpY3Rpb24iLCAiZGVwcmVjYXRpb24iIH0pCi1wdWJsaWMgY2xhc3MgSkFYV1NRdWlja0ZpeFByb2Nlc3NvciBpbXBsZW1lbnRzIElRdWlja0ZpeFByb2Nlc3NvciB7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb3JyZWN0aW9ucyhJQ29tcGlsYXRpb25Vbml0IHVuaXQsIGludCBwcm9ibGVtSWQpIHsKLSAgICAgICAgaWYgKHByb2JsZW1JZCA9PSBFY2xpcHNlTWVzc2FnZXIuQVBUX1FVSUNLX0ZJWF9QUk9CTEVNX0lEKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIElKYXZhQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0Q29ycmVjdGlvbnMoSUludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ibGVtTG9jYXRpb25bXSBsb2NhdGlvbnMpCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAobG9jYXRpb25zID09IG51bGwgfHwgbG9jYXRpb25zLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8SUphdmFDb21wbGV0aW9uUHJvcG9zYWw+IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8SUphdmFDb21wbGV0aW9uUHJvcG9zYWw+KCk7Ci0KLSAgICAgICAgU2V0PFN0cmluZz4gaGFuZGxlZCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChJUHJvYmxlbUxvY2F0aW9uIHByb2JsZW1Mb2NhdGlvbiA6IGxvY2F0aW9ucykgewotICAgICAgICAgICAgU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cyA9IHByb2JsZW1Mb2NhdGlvbi5nZXRQcm9ibGVtQXJndW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAocHJvYmxlbUFyZ3VtZW50cy5sZW5ndGggPj0gMikgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcm9ibGVtID0gcHJvYmxlbUFyZ3VtZW50c1sxXTsKLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlZC5hZGQocHJvYmxlbSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcyhjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2Fscyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gKElKYXZhQ29tcGxldGlvblByb3Bvc2FsW10pIHByb3Bvc2Fscy50b0FycmF5KG5ldyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wb3NhbHMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3MoSUludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ibGVtTG9jYXRpb24gcHJvYmxlbUxvY2F0aW9uLCAKLSAgICAgICAgICAgIExpc3Q8SUphdmFDb21wbGV0aW9uUHJvcG9zYWw+IHByb3Bvc2FscykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHByb2JsZW0gPSBwcm9ibGVtTG9jYXRpb24uZ2V0UHJvYmxlbUFyZ3VtZW50cygpWzFdOwotCi0gICAgICAgIGlmIChwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTVVTVF9JTVBMRU1FTlQpKSB7Ci0gICAgICAgICAgICBhZGRVbmltcGxlbWVudGVkTWV0aG9kc1Byb3Bvc2FsKGNvbnRleHQsIHByb2JsZW1Mb2NhdGlvbiwgcHJvcG9zYWxzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfT05MWV9TVVBQT1JURURfT05fQ0xBU1NFU19XSVRIX1dFQlNFUlZJQ0UpKSB7Ci0gICAgICAgICAgICBhZGRBbm5vdGF0aW9uVG9UeXBlUHJvcG9zYWwoY29udGV4dCwgcHJvcG9zYWxzLCBXZWJTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fTkFNRV9BVFRSSUJVVEUpCi0gICAgICAgICAgICAgICAgfHwgcHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9QT1JUTkFNRV9TRUkpCi0gICAgICAgICAgICAgICAgfHwgcHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9TRVJWSUNFTkFNRV9TRUkpCi0gICAgICAgICAgICAgICAgfHwgcHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTkRQT0lOVElOVEVSRkFDRV9TRUkpCi0gICAgICAgICAgICAgICAgfHwgcHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX0VYQ0xVREVfTk9UX0FMTE9XRURfT05fU0VJKSkgewotICAgICAgICAgICAgYWRkUmVtb3ZlTWVtYmVyVmFsdWVQYWlyUHJvcG9zYWwoY29udGV4dCwgcHJvYmxlbUxvY2F0aW9uLCBwcm9wb3NhbHMsIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9FWENMVURFX1NQRUNJRklFRF9OT19PVEhFUl9BVFRSSUJVVEVTX0FMTE9XRUQpKSB7Ci0gICAgICAgICAgICBhZGRSZW1vdmVNZW1iZXJWYWx1ZVBhaXJQcm9wb3NhbChjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2FscywgdHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQk1FVEhPRFMpKSB7Ci0gICAgICAgICAgICBhZGRSZW1vdmVBbm5vdGF0aW9uUHJvcG9zYWwoY29udGV4dCwgcHJvYmxlbUxvY2F0aW9uLCBwcm9wb3NhbHMsIFdlYk1ldGhvZC5jbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1NPQVBCSU5ESU5HKQotICAgICAgICAgICAgICAgIHx8IHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLlNPQVBCSU5ESU5HX05PX1JQQ19TVFlMRV9PTl9NRVRIT0RTKSkgewotICAgICAgICAgICAgYWRkUmVtb3ZlQW5ub3RhdGlvblByb3Bvc2FsKGNvbnRleHQsIHByb2JsZW1Mb2NhdGlvbiwgcHJvcG9zYWxzLCBTT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQlJFU1VMVCkpIHsKLSAgICAgICAgICAgIGFkZFJlbW92ZUFubm90YXRpb25Qcm9wb3NhbChjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2FscywgV2ViUmVzdWx0LmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fV0VCUEFSQU0pKSB7Ci0gICAgICAgICAgICBhZGRSZW1vdmVBbm5vdGF0aW9uUHJvcG9zYWwoY29udGV4dCwgcHJvYmxlbUxvY2F0aW9uLCBwcm9wb3NhbHMsIFdlYlBhcmFtLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fT05FV0FZKSkgewotICAgICAgICAgICAgYWRkUmVtb3ZlQW5ub3RhdGlvblByb3Bvc2FsKGNvbnRleHQsIHByb2JsZW1Mb2NhdGlvbiwgcHJvcG9zYWxzLCBPbmV3YXkuY2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfUFVCTElDX0FCU1RSQUNUX0ZJTkFMKSkgewotICAgICAgICAgICAgYWRkQ2hhbmdlTW9kaWZpZXJQcm9wb3NhbChjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2FscywgNSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9ERUZBVUxUX1BVQkxJQ19DT05TVFJVQ1RPUikpIHsKLSAgICAgICAgICAgIGFkZENvbnN0cnVjdG9yUHJvcG9zYWwoY29udGV4dCwgcHJvYmxlbUxvY2F0aW9uLCBwcm9wb3NhbHMsIDUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfV0VCU0VSVklDRVBST1ZJREVSX0NPTUJJTkFUSU9OKSkgewotICAgICAgICAgICAgYWRkUmVtb3ZlQW5ub3RhdGlvblByb3Bvc2FsKGNvbnRleHQsIHByb2JsZW1Mb2NhdGlvbiwgcHJvcG9zYWxzLCBXZWJTZXJ2aWNlUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuSEFORExFUl9DSEFJTl9TT0FQX01FU1NBR0VfSEFORExFUlMpKSB7Ci0gICAgICAgICAgICBhZGRSZW1vdmVBbm5vdGF0aW9uUHJvcG9zYWwoY29udGV4dCwgcHJvYmxlbUxvY2F0aW9uLCBwcm9wb3NhbHMsIFNPQVBNZXNzYWdlSGFuZGxlcnMuY2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfT1ZFUlJJREVfRklOQUxJWkUpKSB7Ci0gICAgICAgICAgICBhZGRSZW1vdmVNZXRob2RQcm9wb3NhbChjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2Fscyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfT05MWV9PTl9QVUJMSUNfTUVUSE9EUykKLSAgICAgICAgICAgICAgICB8fCBwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfTk9fU1RBVElDX01PRElGSUVSX0FMTE9XRUQpCi0gICAgICAgICAgICAgICAgfHwgcHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX05PX0ZJTkFMX01PRElGSUVSX0FMTE9XRUQpKSB7Ci0gICAgICAgICAgICBhZGRDaGFuZ2VNb2RpZmllclByb3Bvc2FsKGNvbnRleHQsIHByb2JsZW1Mb2NhdGlvbiwgcHJvcG9zYWxzLCA1KTsKLSAgICAgICAgICAgIGFkZFJlbW92ZUFubm90YXRpb25Qcm9wb3NhbChjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2FscywgV2ViTWV0aG9kLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfUkVEVUNFRF9WSVNJQklMSVRZKSkgewotICAgICAgICAgICAgYWRkQ2hhbmdlTW9kaWZpZXJQcm9wb3NhbChjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2FscywgNSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX0lOQ09NUEFUSUJMRV9SRVRVUk5fVFlQRSkpIHsKLSAgICAgICAgCWFkZENoYW5nZVJldHVyblR5cGVQcm9wb3NhbChjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2Fscyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQW5ub3RhdGlvblRvVHlwZVByb3Bvc2FsKElJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBMaXN0PElKYXZhQ29tcGxldGlvblByb3Bvc2FsPiBwcm9wb3NhbHMsIAotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgewotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBKQVhXU1VJTWVzc2FnZXMuYmluZChKQVhXU1VJTWVzc2FnZXMuQUREX0FOTk9UQVRJT04sIGFubm90YXRpb25DbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwotICAgICAgICBJbWFnZSBpbWFnZSA9IEphdmFQbHVnaW5JbWFnZXMuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX0NPUlJFQ1RJT05fQ0hBTkdFKTsKLSAgICAgICAgcHJvcG9zYWxzLmFkZChuZXcgQWRkQW5ub3RhdGlvblRvVHlwZUNvcnJlY3Rpb25Qcm9wb3NhbChjb250ZXh0LCBhbm5vdGF0aW9uQ2xhc3MsIGRpc3BsYXlTdHJpbmcsIDUsIGltYWdlKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBhZGRSZW1vdmVNZXRob2RQcm9wb3NhbChJSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwgSVByb2JsZW1Mb2NhdGlvbiBwcm9ibGVtTG9jYXRpb24sCi0gICAgICAgICAgICBMaXN0PElKYXZhQ29tcGxldGlvblByb3Bvc2FsPiBwcm9wb3NhbHMpIHsKLSAgICAgICAgCi0gICAgICAgIEFTVE5vZGUgc2VsZWN0ZWROb2RlID0gcHJvYmxlbUxvY2F0aW9uLmdldENvdmVyaW5nTm9kZShjb250ZXh0LmdldEFTVFJvb3QoKSk7Ci0KLSAgICAgICAgaWYgKHNlbGVjdGVkTm9kZS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIE5vcm1hbEFubm90YXRpb24pIHsKLSAgICAgICAgICAgIE5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBzZWxlY3RlZE5vZGUuZ2V0UGFyZW50KCk7IAotICAgICAgICAgICAgQVNUTm9kZSBwYXJlbnROb2RlID0gbm9ybWFsQW5ub3RhdGlvbi5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZE5vZGUgPSAoKE1ldGhvZERlY2xhcmF0aW9uKSBwYXJlbnROb2RlKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gPSAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgcGFyZW50Tm9kZTsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZE5vZGUgPSAoKE1ldGhvZERlY2xhcmF0aW9uKSBzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLmdldFBhcmVudCgpKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChzZWxlY3RlZE5vZGUgaW5zdGFuY2VvZiBTaW1wbGVOYW1lKSB7Ci0gICAgICAgICAgICBTaW1wbGVOYW1lIG1ldGhvZE5hbWUgPSAoU2ltcGxlTmFtZSkgc2VsZWN0ZWROb2RlOwotICAgICAgICAgICAgU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBKQVhXU1VJTWVzc2FnZXMuYmluZChKQVhXU1VJTWVzc2FnZXMuUkVNT1ZFX01FVEhPRCwgbWV0aG9kTmFtZS5nZXRJZGVudGlmaWVyKCkpOwotICAgICAgICAgICAgSW1hZ2UgaW1hZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKTsKLQotICAgICAgICAgICAgcHJvcG9zYWxzLmFkZChuZXcgUmVtb3ZlTWV0aG9kQ29ycmVjdGlvblByb3Bvc2FsKGNvbnRleHQsIG1ldGhvZE5hbWUsIGRpc3BsYXlTdHJpbmcsIDUsIGltYWdlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUmVtb3ZlQW5ub3RhdGlvblByb3Bvc2FsKElJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBJUHJvYmxlbUxvY2F0aW9uIHByb2JsZW1Mb2NhdGlvbiwgCi0gICAgICAgICAgICBMaXN0PElKYXZhQ29tcGxldGlvblByb3Bvc2FsPiBwcm9wb3NhbHMsIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uKSB7Ci0JCQotICAgICAgICBBU1ROb2RlIGNvdmVyaW5nTm9kZSA9IHByb2JsZW1Mb2NhdGlvbi5nZXRDb3ZlcmluZ05vZGUoY29udGV4dC5nZXRBU1RSb290KCkpOwotICAgICAgICBBU1ROb2RlIHBhcmVudE5vZGUgPSBjb3ZlcmluZ05vZGUuZ2V0UGFyZW50KCk7Ci0gICAgICAgIAotCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9IEpBWFdTVUlNZXNzYWdlcy5iaW5kKEpBWFdTVUlNZXNzYWdlcy5SRU1PVkVfQU5OT1RBVElPTiwgYW5ub3RhdGlvbi5nZXRTaW1wbGVOYW1lKCkpOwotICAgICAgICBJbWFnZSBpbWFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ERUxFVEUpOwotICAgICAgICBwcm9wb3NhbHMuYWRkKG5ldyBSZW1vdmVBbm5vdGF0aW9uQ29ycmVjdGlvblByb3Bvc2FsKGNvbnRleHQsIGFubm90YXRpb24sIHBhcmVudE5vZGUsIGRpc3BsYXlTdHJpbmcsIDUsIGltYWdlKSk7Ci0gICAgfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFJlbW92ZU1lbWJlclZhbHVlUGFpclByb3Bvc2FsKElJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBJUHJvYmxlbUxvY2F0aW9uIHByb2JsZW1Mb2NhdGlvbiwKLQkgICAgICAgIExpc3Q8SUphdmFDb21wbGV0aW9uUHJvcG9zYWw+IHByb3Bvc2FscywgYm9vbGVhbiByZW1vdmVBbGxPdGhlck1WUHMpIHsKLQkgICAgCi0JCUFTVE5vZGUgY292ZXJpbmdOb2RlID0gcHJvYmxlbUxvY2F0aW9uLmdldENvdmVyaW5nTm9kZShjb250ZXh0LmdldEFTVFJvb3QoKSk7Ci0JCQotCQlpZiAoY292ZXJpbmdOb2RlLmdldFBhcmVudCgpIGluc3RhbmNlb2YgTWVtYmVyVmFsdWVQYWlyKSB7Ci0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyID0gKE1lbWJlclZhbHVlUGFpcikgY292ZXJpbmdOb2RlLmdldFBhcmVudCgpOwotICAgICAgICAgICAgU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBKQVhXU1VJTWVzc2FnZXMuYmluZChKQVhXU1VJTWVzc2FnZXMuUkVNT1ZFX01FTUJFUlZBTFVFUEFJUiwgbWVtYmVyVmFsdWVQYWlyCi0gICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgaWYgKHJlbW92ZUFsbE90aGVyTVZQcykgewotICAgICAgICAgICAgICAgIGRpc3BsYXlTdHJpbmcgPSBKQVhXU1VJTWVzc2FnZXMuUkVNT1ZFX0FMTF9PVEhFUl9NRU1CRVJWQUxVRVBBSVJTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSW1hZ2UgaW1hZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKTsKLSAgICAgICAgICAgIHByb3Bvc2Fscy5hZGQobmV3IFJlbW92ZU1lbWJlclZhbHVlUGFpckNvcnJlY3Rpb25Qcm9wb3NhbChjb250ZXh0LCBtZW1iZXJWYWx1ZVBhaXIsCi0gICAgICAgICAgICAgICAgICAgIHJlbW92ZUFsbE90aGVyTVZQcywgZGlzcGxheVN0cmluZywgNSwgaW1hZ2UpKTsKLSAgICAgICAgfQkJCi0JfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFVuaW1wbGVtZW50ZWRNZXRob2RzUHJvcG9zYWwoSUludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ibGVtTG9jYXRpb24gcHJvYmxlbUxvY2F0aW9uLAotICAgICAgICAgICAgTGlzdDxJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbD4gcHJvcG9zYWxzKSB7Ci0KLSAgICAgICAgQVNUTm9kZSBlbmRwb2ludEludGVyZmFjZVZhbHVlID0gcHJvYmxlbUxvY2F0aW9uLmdldENvdmVyaW5nTm9kZShjb250ZXh0LmdldEFTVFJvb3QoKSk7Ci0gICAgICAgIGlmIChlbmRwb2ludEludGVyZmFjZVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nTGl0ZXJhbCkgewotICAgICAgICAgICAgQVNUTm9kZSBlbmRwb2ludEludGVyZmFjZU1WUCA9IGVuZHBvaW50SW50ZXJmYWNlVmFsdWUuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBBU1ROb2RlIHdlYlNlcnZpY2VBbm5vdGF0aW9uID0gZW5kcG9pbnRJbnRlcmZhY2VNVlAuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBBU1ROb2RlIHR5cGVEZWNsYXJhdGlvbiA9IHdlYlNlcnZpY2VBbm5vdGF0aW9uLmdldFBhcmVudCgpOwotCi0gICAgICAgICAgICBTdHJpbmcgZW5kcG9pbnRJbnRlcmZhY2UgPSAoKFN0cmluZ0xpdGVyYWwpIGVuZHBvaW50SW50ZXJmYWNlVmFsdWUpLmdldExpdGVyYWxWYWx1ZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBJbWFnZSBpbWFnZSA9IEphdmFQbHVnaW5JbWFnZXMuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX0NPUlJFQ1RJT05fQ0hBTkdFKTsKLSAgICAgICAgICAgIHByb3Bvc2Fscy5hZGQobmV3IEFkZFVuaW1wbGVtZW50ZWRNZXRob2RDb3JyZWN0aW9uUHJvcG9zYWwoY29udGV4dCwgdHlwZURlY2xhcmF0aW9uLCBlbmRwb2ludEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkFERF9VTklNUExFTUVOVEVEX01FVEhPRFMsIDUsIGltYWdlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSB2b2lkIGFkZENoYW5nZU1vZGlmaWVyUHJvcG9zYWwoSUludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ibGVtTG9jYXRpb24gcHJvYmxlbUxvY2F0aW9uLAotCSAgICAgICAgTGlzdDxJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbD4gcHJvcG9zYWxzLCBpbnQgcmVsZXZhbmNlKSB7Ci0JCQotICAgICAgICBDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IGNvbnRleHQuZ2V0QVNUUm9vdCgpOwotICAgICAgICBBU1ROb2RlIHNlbGVjdGVkTm9kZSA9IHByb2JsZW1Mb2NhdGlvbi5nZXRDb3ZlcmluZ05vZGUoYXN0Um9vdCk7Ci0KLQkJaWYgKCEoc2VsZWN0ZWROb2RlIGluc3RhbmNlb2YgU2ltcGxlTmFtZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlCaW5kaW5nIGJpbmRpbmcgPSAoKFNpbXBsZU5hbWUpIHNlbGVjdGVkTm9kZSkucmVzb2x2ZUJpbmRpbmcoKTsKLQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgewotCQkJU3RyaW5nIGJpbmRpbmdOYW1lID0gYmluZGluZy5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9ICIiOwotCQkJCi0JCQlpbnQgZXhjbHVkZWRNb2RpZmllcnMgPSAwOwotCQkJaW50IGluY2x1ZGVkTW9kaWZpZXJzID0gMDsKLQkJCQotICAgICAgICAJU3RyaW5nIHByb2JsZW0gPSBwcm9ibGVtTG9jYXRpb24uZ2V0UHJvYmxlbUFyZ3VtZW50cygpWzFdOwotCi0gICAgICAgICAgICBpZihwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfT05MWV9PTl9QVUJMSUNfTUVUSE9EUykKLSAgICAgICAgICAgIAkJfHwgcHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX1JFRFVDRURfVklTSUJJTElUWSkpIHsKLSAgICAJCQlleGNsdWRlZE1vZGlmaWVycyA9IH4oTW9kaWZpZXIuUFVCTElDKTsKLSAgICAJCQlpbmNsdWRlZE1vZGlmaWVycyA9IE1vZGlmaWVyLlBVQkxJQyA7Ci0gICAgCQkJZGlzcGxheVN0cmluZyA9IEpBWFdTVUlNZXNzYWdlcy5iaW5kKEpBWFdTVUlNZXNzYWdlcy5DSEFOR0VfTUVUSE9EX1ZJU0lCSUxJVFksICJwdWJsaWMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfTk9fRklOQUxfTU9ESUZJRVJfQUxMT1dFRCkpIHsKLSAgICAgICAgICAgIAlleGNsdWRlZE1vZGlmaWVycyA9IE1vZGlmaWVyLkZJTkFMOwotICAgICAgICAgICAgCWRpc3BsYXlTdHJpbmcgPSBKQVhXU1VJTWVzc2FnZXMuYmluZChKQVhXU1VJTWVzc2FnZXMuUkVNT1ZFX0ZJTkFMX01PRElGSUVSLCBiaW5kaW5nTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9OT19TVEFUSUNfTU9ESUZJRVJfQUxMT1dFRCkpIHsKLSAgICAgICAgICAgIAlleGNsdWRlZE1vZGlmaWVycyA9IE1vZGlmaWVyLlNUQVRJQzsKLSAgICAgICAgICAgIAlkaXNwbGF5U3RyaW5nID0gSkFYV1NVSU1lc3NhZ2VzLmJpbmQoSkFYV1NVSU1lc3NhZ2VzLlJFTU9WRV9TVEFUSUNfTU9ESUZJRVIsIGJpbmRpbmdOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfUFVCTElDX0FCU1RSQUNUX0ZJTkFMKSkgewotICAgIAkJCWV4Y2x1ZGVkTW9kaWZpZXJzID0gTW9kaWZpZXIuQUJTVFJBQ1QgfCBNb2RpZmllci5GSU5BTDsKLSAgICAJCQlkaXNwbGF5U3RyaW5nID0gSkFYV1NVSU1lc3NhZ2VzLlJFTU9WRV9JTExFR0FMX01PRElGSUVSOwotICAgICAgICAgICAgfQotCi0JCQlJbWFnZSBpbWFnZSA9IEphdmFQbHVnaW5JbWFnZXMuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX0NPUlJFQ1RJT05fQ0hBTkdFKTsKLQkgICAgICAgIHByb3Bvc2Fscy5hZGQobmV3IENoYW5nZU1vZGlmaWVyQ29ycmVjdGlvblByb3Bvc2FsKGNvbnRleHQsIGJpbmRpbmcsIGluY2x1ZGVkTW9kaWZpZXJzLAotICAgICAgICAgICAgICAgICAgICBleGNsdWRlZE1vZGlmaWVycywgZGlzcGxheVN0cmluZywgNSwgaW1hZ2UpKTsgICAgICAgICAgIAotCQl9Ci0JfQotCQotICAgIHByaXZhdGUgdm9pZCBhZGRDb25zdHJ1Y3RvclByb3Bvc2FsKElJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBJUHJvYmxlbUxvY2F0aW9uIHByb2JsZW1Mb2NhdGlvbiwKLSAgICAgICAgICAgIExpc3Q8SUphdmFDb21wbGV0aW9uUHJvcG9zYWw+IHByb3Bvc2FscywgaW50IHJlbGV2YW5jZSkgewotCi0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gY29udGV4dC5nZXRBU1RSb290KCk7Ci0gICAgICAgIEFTVE5vZGUgc2VsZWN0ZWROb2RlID0gcHJvYmxlbUxvY2F0aW9uLmdldENvdmVyaW5nTm9kZShhc3RSb290KTsKLQotICAgICAgICBJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSAoKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uKSBzZWxlY3RlZE5vZGUuZ2V0UGFyZW50KCkpLnJlc29sdmVCaW5kaW5nKCk7Ci0gICAgICAgIGlmICh0eXBlQmluZGluZyAhPSBudWxsICYmIHR5cGVCaW5kaW5nLmlzRnJvbVNvdXJjZSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZGlzcGxheVN0cmluZyA9IEpBWFdTVUlNZXNzYWdlcy5iaW5kKEpBWFdTVUlNZXNzYWdlcy5DUkVBVEVfQ09OU1RSVUNUT1IsCi0gICAgICAgICAgICAgICAgICAgIHR5cGVCaW5kaW5nLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEltYWdlIGltYWdlID0gSmF2YUVsZW1lbnRJbWFnZVByb3ZpZGVyLmdldERlY29yYXRlZEltYWdlKEphdmFQbHVnaW5JbWFnZXMuREVTQ19NSVNDX1BVQkxJQywKLSAgICAgICAgICAgICAgICAgICAgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuQ09OU1RSVUNUT1IsIEphdmFFbGVtZW50SW1hZ2VQcm92aWRlci5TTUFMTF9TSVpFKTsKLQotICAgICAgICAgICAgcHJvcG9zYWxzLmFkZChuZXcgTmV3RGVmYXVsdENvbnN0cnVjdG9yQ29ycmVjdGlvblByb3Bvc2FsKGNvbnRleHQsIHR5cGVCaW5kaW5nLCBkaXNwbGF5U3RyaW5nLCA1LAotICAgICAgICAgICAgICAgICAgICBpbWFnZSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBhZGRDaGFuZ2VSZXR1cm5UeXBlUHJvcG9zYWwoSUludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ibGVtTG9jYXRpb24gcHJvYmxlbUxvY2F0aW9uLAotICAgICAgICAgICAgTGlzdDxJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbD4gcHJvcG9zYWxzKSB7Ci0KLSAgICAJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSBjb250ZXh0LmdldEFTVFJvb3QoKTsKLSAgICAgICAgQVNUTm9kZSBzZWxlY3RlZE5vZGUgPSBwcm9ibGVtTG9jYXRpb24uZ2V0Q292ZXJpbmdOb2RlKGFzdFJvb3QpOwotCi0JCWlmICghKHNlbGVjdGVkTm9kZSBpbnN0YW5jZW9mIFNpbXBsZU5hbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCU1ldGhvZERlY2xhcmF0aW9uIGltcGxNZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikoKFNpbXBsZU5hbWUpIHNlbGVjdGVkTm9kZSkuZ2V0UGFyZW50KCk7Ci0JCVR5cGVEZWNsYXJhdGlvbiBpbXBsVHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbilpbXBsTWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyZW50KCk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGltcGxUeXBlRGVjbGFyYXRpb24sIFdlYlNlcnZpY2UuY2xhc3MpOwotCQlTdHJpbmcgZW5kcG9pbnRJbnRlcmZhY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgImVuZHBvaW50SW50ZXJmYWNlIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBKQVhXU1VJTWVzc2FnZXMuQ0hBTkdFX01FVEhPRF9SRVRVUk5fVFlQRTsKLQkJSW1hZ2UgaW1hZ2UgPSBKYXZhUGx1Z2luSW1hZ2VzLmdldChKYXZhUGx1Z2luSW1hZ2VzLklNR19DT1JSRUNUSU9OX0NIQU5HRSk7Ci0JCXByb3Bvc2Fscy5hZGQobmV3IENoYW5nZVJldHVyblR5cGVDb3JyZWN0aW9uUHJvcG9zYWwoY29udGV4dCwgaW1wbFR5cGVEZWNsYXJhdGlvbiwKLQkJCQlpbXBsTWV0aG9kRGVjbGFyYXRpb24sIGVuZHBvaW50SW50ZXJmYWNlLCBkaXNwbGF5U3RyaW5nLCA1LCBpbWFnZSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9OZXdEZWZhdWx0Q29uc3RydWN0b3JDb3JyZWN0aW9uUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9OZXdEZWZhdWx0Q29uc3RydWN0b3JDb3JyZWN0aW9uUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUyMDczMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vTmV3RGVmYXVsdENvbnN0cnVjdG9yQ29ycmVjdGlvblByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb3JyZWN0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQWJzdHJhY3RUeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5CbG9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTW9kaWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVOYW1lOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5BU1RSZXdyaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5MaXN0UmV3cml0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkNvZGVHZW5lcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklJbnZvY2F0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCi0NCi1wdWJsaWMgY2xhc3MgTmV3RGVmYXVsdENvbnN0cnVjdG9yQ29ycmVjdGlvblByb3Bvc2FsIGV4dGVuZHMgQWJzdHJhY3RKYXZhQ29ycmVjdGlvblByb3Bzb2FsIHsNCi0NCi0JcHJpdmF0ZSBJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmc7DQotCQ0KLQlwdWJsaWMgTmV3RGVmYXVsdENvbnN0cnVjdG9yQ29ycmVjdGlvblByb3Bvc2FsKA0KLQkJCUlJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCwgSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLCBTdHJpbmcgZGlzcGxheVN0cmluZywNCi0JCQlpbnQgcmVsZXZhbmNlLCBJbWFnZSBpbWFnZSkgew0KLQkJc3VwZXIoaW52b2NhdGlvbkNvbnRleHQsIGRpc3BsYXlTdHJpbmcsIHJlbGV2YW5jZSwgaW1hZ2UpOw0KLQkJdGhpcy50eXBlQmluZGluZyA9IHR5cGVCaW5kaW5nOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0gICAgcHVibGljIHZvaWQgYWRkRWRpdHMoVGV4dEZpbGVDaGFuZ2UgdGV4dENoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSBpbnZvY2F0aW9uQ29udGV4dC5nZXRBU1RSb290KCk7DQotICAgICAgICBBU1QgYXN0ID0gYXN0Um9vdC5nZXRBU1QoKTsNCi0gICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShhc3QpOw0KLQ0KLQkJQVNUTm9kZSB0eXBlRGVjbGFyYXRpb24gPSBhc3RSb290LmZpbmREZWNsYXJpbmdOb2RlKHR5cGVCaW5kaW5nKTsNCi0NCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gYXN0Lm5ld01ldGhvZERlY2xhcmF0aW9uKCk7DQotDQotCQlTaW1wbGVOYW1lIG5ld05hbWVOb2RlID0gYXN0Lm5ld1NpbXBsZU5hbWUodHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsNCi0NCi0JCW1ldGhvZERlY2xhcmF0aW9uLnNldENvbnN0cnVjdG9yKHRydWUpOw0KLQ0KLQkJbWV0aG9kRGVjbGFyYXRpb24ubW9kaWZpZXJzKCkuYWRkQWxsKGFzdC5uZXdNb2RpZmllcnMoTW9kaWZpZXIuUFVCTElDKSk7DQotDQotCQltZXRob2REZWNsYXJhdGlvbi5zZXROYW1lKG5ld05hbWVOb2RlKTsNCi0NCi0JCUJsb2NrIGJvZHkgPSBhc3QubmV3QmxvY2soKTsNCi0NCi0JCVN0cmluZyBwbGFjZUhvbGRlciA9IENvZGVHZW5lcmF0aW9uLmdldE1ldGhvZEJvZHlDb250ZW50KGludm9jYXRpb25Db250ZXh0LmdldENvbXBpbGF0aW9uVW5pdCgpLA0KLSAgICAgICAgICAgICAgICB0eXBlQmluZGluZy5nZXROYW1lKCksIG5ld05hbWVOb2RlLmdldElkZW50aWZpZXIoKSwgdHJ1ZSwgIiIsIFN0cmluZy52YWx1ZU9mKCdcbicpKTsNCi0JCWlmIChwbGFjZUhvbGRlciAhPSBudWxsKSB7DQotCQkgICAgQVNUTm9kZSB0b2RvTm9kZSA9IHJld3JpdGVyLmNyZWF0ZVN0cmluZ1BsYWNlaG9sZGVyKHBsYWNlSG9sZGVyLCBBU1ROb2RlLlJFVFVSTl9TVEFURU1FTlQpOw0KLQkJICAgIGJvZHkuc3RhdGVtZW50cygpLmFkZCh0b2RvTm9kZSk7DQotCQl9DQotCQltZXRob2REZWNsYXJhdGlvbi5zZXRCb2R5KGJvZHkpOw0KLQkJDQotCQlDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkgPSAoKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLmdldEJvZHlEZWNsYXJhdGlvbnNQcm9wZXJ0eSgpOw0KLQkJTGlzdDxBU1ROb2RlPiBtZW1iZXJzID0gKExpc3Q8QVNUTm9kZT4pIHR5cGVEZWNsYXJhdGlvbi5nZXRTdHJ1Y3R1cmFsUHJvcGVydHkocHJvcGVydHkpOw0KLQkJTGlzdEl0ZXJhdG9yPEFTVE5vZGU+IG1lbWJlcnNJdGVyYXRvciA9IG1lbWJlcnMubGlzdEl0ZXJhdG9yKCk7DQotCQlpbnQgaW5zZXJ0QXQgPSAwOw0KLQkJd2hpbGUgKG1lbWJlcnNJdGVyYXRvci5oYXNQcmV2aW91cygpKSB7DQotCQkJQVNUTm9kZSBhc3ROb2RlID0gKEFTVE5vZGUpIG1lbWJlcnNJdGVyYXRvci5wcmV2aW91cygpOw0KLQkJCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24gJiYgKChNZXRob2REZWNsYXJhdGlvbikgYXN0Tm9kZSkuaXNDb25zdHJ1Y3RvcigpKSB7DQotCQkJCWluc2VydEF0ID0gbWVtYmVyc0l0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSArIDE7DQotCQkJfQ0KLQkJfQ0KLQkJTGlzdFJld3JpdGUgbGlzdFJld3JpdGVyPSByZXdyaXRlci5nZXRMaXN0UmV3cml0ZSh0eXBlRGVjbGFyYXRpb24sIHByb3BlcnR5KTsNCi0JCWxpc3RSZXdyaXRlci5pbnNlcnRBdChtZXRob2REZWNsYXJhdGlvbiwgaW5zZXJ0QXQsIG51bGwpOw0KLQkJdGV4dENoYW5nZS5hZGRFZGl0KHJld3JpdGVyLnJld3JpdGVBU1QoKSk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL1JlbW92ZUFubm90YXRpb25Db3JyZWN0aW9uUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9SZW1vdmVBbm5vdGF0aW9uQ29ycmVjdGlvblByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMGEwOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL1JlbW92ZUFubm90YXRpb25Db3JyZWN0aW9uUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuY29ycmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkFTVFJld3JpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIFJlbW92ZUFubm90YXRpb25Db3JyZWN0aW9uUHJvcG9zYWwgZXh0ZW5kcyBBYnN0cmFjdEphdmFDb3JyZWN0aW9uUHJvcHNvYWwgewotICAgIAotICAgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb247Ci0gICAgcHJpdmF0ZSBBU1ROb2RlIHBhcmVudE5vZGU7Ci0gICAgCi0gICAgcHVibGljIFJlbW92ZUFubm90YXRpb25Db3JyZWN0aW9uUHJvcG9zYWwoSUludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0LCAKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uLCBBU1ROb2RlIHBhcmVudE5vZGUsIFN0cmluZyBkaXNwbGF5U3RyaW5nLAotICAgICAgICAgICAgaW50IHJlbGV2YW5jZSwgSW1hZ2UgaW1hZ2UpIHsKLSAgICAgICAgc3VwZXIoaW52b2NhdGlvbkNvbnRleHQsIGRpc3BsYXlTdHJpbmcsIHJlbGV2YW5jZSwgaW1hZ2UpOwotICAgICAgICB0aGlzLmFubm90YXRpb24gPSBhbm5vdGF0aW9uOwotICAgICAgICB0aGlzLnBhcmVudE5vZGUgPSBwYXJlbnROb2RlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZEVkaXRzKFRleHRGaWxlQ2hhbmdlIHRleHRDaGFuZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgQVNUUmV3cml0ZSByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKHBhcmVudE5vZGUuZ2V0QVNUKCkpOwotCi0gICAgICAgIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgQW5ub3RhdGlvbikgewotICAgICAgICAgICAgQW5ub3RhdGlvbiBqZHREb21Bbm5vdGF0aW9uID0gKEFubm90YXRpb24pIHBhcmVudE5vZGU7Ci0gICAgICAgICAgICByZXdyaXRlci5yZW1vdmUoamR0RG9tQW5ub3RhdGlvbiwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBwYXJlbnROb2RlOwotICAgICAgICAgICAgQW5ub3RhdGlvbiBqZHREb21Bbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIGFubm90YXRpb24pOwotICAgICAgICAgICAgaWYgKGpkdERvbUFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJld3JpdGVyLnJlbW92ZShqZHREb21Bbm5vdGF0aW9uLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHBhcmVudE5vZGUuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSBwYXJlbnROb2RlLmdldFBhcmVudCgpOwotICAgICAgICAgICAgQW5ub3RhdGlvbiBqZHREb21Bbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24odHlwZURlY2xhcmF0aW9uLCBhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGlmIChqZHREb21Bbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXdyaXRlci5yZW1vdmUoamR0RG9tQW5ub3RhdGlvbiwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRleHRDaGFuZ2UuYWRkRWRpdChyZXdyaXRlci5yZXdyaXRlQVNUKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL1JlbW92ZU1lbWJlclZhbHVlUGFpckNvcnJlY3Rpb25Qcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL1JlbW92ZU1lbWJlclZhbHVlUGFpckNvcnJlY3Rpb25Qcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmFlYzZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9SZW1vdmVNZW1iZXJWYWx1ZVBhaXJDb3JyZWN0aW9uUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuY29ycmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5BU1RSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIFJlbW92ZU1lbWJlclZhbHVlUGFpckNvcnJlY3Rpb25Qcm9wb3NhbCBleHRlbmRzIEFic3RyYWN0SmF2YUNvcnJlY3Rpb25Qcm9wc29hbCB7Ci0gICAgCi0gICAgcHJpdmF0ZSBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyOwotICAgIHByaXZhdGUgYm9vbGVhbiByZW1vdmVBbGxPdGhlck1WUHM7Ci0gICAgCi0gICAgcHVibGljIFJlbW92ZU1lbWJlclZhbHVlUGFpckNvcnJlY3Rpb25Qcm9wb3NhbChJSW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQsCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyLCBib29sZWFuIHJlbW92ZUFsbE90aGVyTVZQcywgU3RyaW5nIGRpc3BsYXlTdHJpbmcsIGludCByZWxldmFuY2UsIAotICAgICAgICAgICAgSW1hZ2UgaW1hZ2UpIHsKLSAgICAgICAgc3VwZXIoaW52b2NhdGlvbkNvbnRleHQsIGRpc3BsYXlTdHJpbmcsIHJlbGV2YW5jZSwgaW1hZ2UpOwotICAgICAgICB0aGlzLm1lbWJlclZhbHVlUGFpciA9IG1lbWJlclZhbHVlUGFpcjsKLSAgICAgICAgdGhpcy5yZW1vdmVBbGxPdGhlck1WUHMgPSByZW1vdmVBbGxPdGhlck1WUHM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHZvaWQgYWRkRWRpdHMoVGV4dEZpbGVDaGFuZ2UgdGV4dENoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyLmdldFBhcmVudCgpIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbikgewotICAgICAgICAgICAgTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIG1lbWJlclZhbHVlUGFpci5nZXRQYXJlbnQoKTsKLQotICAgICAgICAgICAgQVNUUmV3cml0ZSBhc3RSZXdyaXRlID0gQVNUUmV3cml0ZS5jcmVhdGUoYW5ub3RhdGlvbi5nZXRBU1QoKSk7Ci0gICAgICAgICAgICBpZiAocmVtb3ZlQWxsT3RoZXJNVlBzKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBhbm5vdGF0aW9uLnZhbHVlcygpOwotICAgICAgICAgICAgICAgIGZvciAoTWVtYmVyVmFsdWVQYWlyIG90aGVyTWVtYmVyVmFsdWVQYWlyIDogbWVtYmVyVmFsdWVQYWlycykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIW90aGVyTWVtYmVyVmFsdWVQYWlyLmVxdWFscyhtZW1iZXJWYWx1ZVBhaXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3RSZXdyaXRlLnJlbW92ZShvdGhlck1lbWJlclZhbHVlUGFpciwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFzdFJld3JpdGUucmVtb3ZlKG1lbWJlclZhbHVlUGFpciwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0ZXh0Q2hhbmdlLmFkZEVkaXQoYXN0UmV3cml0ZS5yZXdyaXRlQVNUKCkpOyAgIAotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vUmVtb3ZlTWV0aG9kQ29ycmVjdGlvblByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vUmVtb3ZlTWV0aG9kQ29ycmVjdGlvblByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZjgwNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL1JlbW92ZU1ldGhvZENvcnJlY3Rpb25Qcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb3JyZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSU1ldGhvZEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuQVNUUmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVNZXRob2RDb3JyZWN0aW9uUHJvcG9zYWwgZXh0ZW5kcyBBYnN0cmFjdEphdmFDb3JyZWN0aW9uUHJvcHNvYWwgewotCi0gICAgcHJpdmF0ZSBTaW1wbGVOYW1lIG1ldGhvZE5hbWU7Ci0gICAgCi0gICAgcHVibGljIFJlbW92ZU1ldGhvZENvcnJlY3Rpb25Qcm9wb3NhbChJSW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQsIFNpbXBsZU5hbWUgbWV0aG9kTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBkaXNwbGF5U3RyaW5nLCBpbnQgcmVsZXZhbmNlLCBJbWFnZSBpbWFnZSkgewotICAgICAgICBzdXBlcihpbnZvY2F0aW9uQ29udGV4dCwgZGlzcGxheVN0cmluZywgcmVsZXZhbmNlLCBpbWFnZSk7Ci0gICAgICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkRWRpdHMoVGV4dEZpbGVDaGFuZ2UgdGV4dENoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJQmluZGluZyBiaW5kaW5nID0gbWV0aG9kTmFtZS5yZXNvbHZlQmluZGluZygpOwotICAgICAgICBDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IGludm9jYXRpb25Db250ZXh0LmdldEFTVFJvb3QoKTsKLSAgICAgICAgSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9ICgoSU1ldGhvZEJpbmRpbmcpIGJpbmRpbmcpLmdldE1ldGhvZERlY2xhcmF0aW9uKCk7Ci0gICAgICAgIEFTVE5vZGUgZGVjbGFyYXRpb24gPSBhc3RSb290LmZpbmREZWNsYXJpbmdOb2RlKG1ldGhvZEJpbmRpbmcpOwotICAgICAgICBBU1QgYXN0ID0gYXN0Um9vdC5nZXRBU1QoKTsKLSAgICAgICAgQVNUUmV3cml0ZSByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKGFzdCk7Ci0gICAgICAgIHJld3JpdGVyLnJlbW92ZShkZWNsYXJhdGlvbiwgbnVsbCk7Ci0gICAgICAgIHRleHRDaGFuZ2UuYWRkRWRpdChyZXdyaXRlci5yZXdyaXRlQVNUKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9CaW5kaW5nVHlwZUF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL0JpbmRpbmdUeXBlQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdlYjI0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL0JpbmRpbmdUeXBlQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbjsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuVkFMVUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0eWxlZFN0cmluZzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQotDQotcHVibGljIGNsYXNzIEJpbmRpbmdUeXBlQXR0cmlidXRlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUEJpbmRpbmdfU09BUDExSFRUUF9CSU5ESU5HID0gIlNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORyI7IC8vJE5PTi1OTFMtMSQNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBCaW5kaW5nX1NPQVAxMkhUVFBfQklORElORyA9ICJTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkciOyAvLyROT04tTkxTLTEkDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQQmluZGluZ19TT0FQMTFIVFRQX01UT01fQklORElORyA9ICJTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORyI7IC8vJE5PTi1OTFMtMSQNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBCaW5kaW5nX1NPQVAxMkhUVFBfTVRPTV9CSU5ESU5HID0gIlNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HIjsgLy8kTk9OLU5MUy0xJA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUEJpbmRpbmdfSFRUUF9CSU5ESU5HID0gIkhUVFBCaW5kaW5nLkhUVFBfQklORElORyI7IC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfQklORElORyA9ICJqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZyI7IC8vJE5PTi1OTFMtMSQNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfQklORElORyA9ICJqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZyI7IC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgcHVibGljIEJpbmRpbmdUeXBlQXR0cmlidXRlSW5pdGlhbGl6ZXIoKSB7DQotICAgICAgICBKQVhXU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KFNPQVBfQklORElORywgDQotICAgICAgICAJCUpBWFdTVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9vYmoxNi9zb2FwYmluZGluZ19vYmouZ2lmIikuY3JlYXRlSW1hZ2UoKSk7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgIEpBWFdTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlUmVnaXN0cnkoKS5wdXQoSFRUUF9CSU5ESU5HLCANCi0gICAgICAgIAkJSkFYV1NVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL29iajE2L2h0dHBiaW5kaW5nX29iai5naWYiKS5jcmVhdGVJbWFnZSgpKTsgLy8kTk9OLU5MUy0xJA0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IGdldE1lbWJlclZhbHVlUGFpcnMoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBBU1QgYXN0LA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsNCi0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7DQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgew0KLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciB2YWx1ZSA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCBWQUxVRSwgZ2V0RGVmYXVsdCgpKTsgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHZhbHVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXJzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JNZW1iZXJWYWx1ZVBhaXIoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LA0KLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIpIHsNCi0gICAgICAgIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gY29tcGxldGlvblByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4oKTsNCi0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7DQotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSkgIGphdmFFbGVtZW50Ow0KLSAgICAgICAgICAgIFN0cmluZyBtZW1iZXJWYWx1ZVBhaXJOYW1lID0gbWVtYmVyVmFsdWVQYWlyLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCk7DQotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKFZBTFVFKSkgeyAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7DQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMoTUlTU0lOR19JREVOVElGRVIpIHx8IHZhbHVlLmNoYXJBdCgwKSAhPSAnXCInKSB7DQotICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGJpbmRpbmdzID0gZ2V0U2hvcnROYW1lQmluZGluZ3NNYXAoKTsNCi0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGJpbmRpbmdzSXRlciA9IGJpbmRpbmdzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChiaW5kaW5nc0l0ZXIuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBiaW5kaW5nRW50cnkgPSBiaW5kaW5nc0l0ZXIubmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wb3NhbCA9IGJpbmRpbmdFbnRyeS5nZXRLZXkoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSA9IGJpbmRpbmdFbnRyeS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXBsYWNlbWVudE9mZnNldCA9IG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpLmdldFN0YXJ0UG9zaXRpb24oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVwbGFjZW1lbnRMZW5ndGggPSBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKS5nZXRMZW5ndGgoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBJbWFnZSBpbWFnZSA9IEpBWFdTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvblByb3Bvc2Fscy5hZGQobmV3IEJpbmRpbmdUeXBlQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2FsLCB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50T2Zmc2V0LCByZXBsYWNlbWVudExlbmd0aCwgaW1hZ2UsIG5ldyBTdHlsZWRTdHJpbmcocHJvcG9zYWwpLCA1LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYmluZGluZ3MgPSBnZXRRdWFsaWZpZWROYW1lQmluZGluZ3NNYXAoKTsNCi0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGJpbmRpbmdzSXRlciA9IGJpbmRpbmdzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChiaW5kaW5nc0l0ZXIuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBiaW5kaW5nRW50cnkgPSBiaW5kaW5nc0l0ZXIubmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wb3NhbCA9IGJpbmRpbmdFbnRyeS5nZXRLZXkoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBJbWFnZSBpbWFnZSA9IEpBWFdTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoYmluZGluZ0VudHJ5LmdldFZhbHVlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25Qcm9wb3NhbHMuYWRkKGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NhbCwgbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSwgZ2V0RGlzcGxheVN0cmluZyhwcm9wb3NhbCkpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY29tcGxldGlvblByb3Bvc2FsczsNCi0gICAgfQ0KLQ0KLQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHQoKSB7DQotDQotICAgICAgICByZXR1cm4gU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoU3RyaW5nIGJpbmRpbmcpIHsNCi0gICAgICAgIGlmIChiaW5kaW5nLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpKSB7DQotICAgICAgICAgICAgcmV0dXJuIFNPQVBCaW5kaW5nX1NPQVAxMUhUVFBfQklORElORzsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChiaW5kaW5nLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpKSB7DQotICAgICAgICAgICAgcmV0dXJuIFNPQVBCaW5kaW5nX1NPQVAxMkhUVFBfQklORElORzsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChiaW5kaW5nLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORykpIHsNCi0gICAgICAgICAgICByZXR1cm4gU09BUEJpbmRpbmdfU09BUDExSFRUUF9NVE9NX0JJTkRJTkc7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYmluZGluZy5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkcpKSB7DQotICAgICAgICAgICAgcmV0dXJuIFNPQVBCaW5kaW5nX1NPQVAxMkhUVFBfTVRPTV9CSU5ESU5HOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJpbmRpbmcuZXF1YWxzKEhUVFBCaW5kaW5nLkhUVFBfQklORElORykpIHsNCi0gICAgICAgICAgICByZXR1cm4gSFRUUEJpbmRpbmdfSFRUUF9CSU5ESU5HOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGJpbmRpbmc7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFF1YWxpZmllZE5hbWVCaW5kaW5nc01hcCgpIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYmluZGluZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0gICAgICAgIGJpbmRpbmdzLnB1dChTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7DQotICAgICAgICBiaW5kaW5ncy5wdXQoU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOw0KLSAgICAgICAgYmluZGluZ3MucHV0KFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOw0KLSAgICAgICAgYmluZGluZ3MucHV0KFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOw0KLSAgICAgICAgYmluZGluZ3MucHV0KEhUVFBCaW5kaW5nLkhUVFBfQklORElORywgSFRUUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsNCi0gICAgICAgIHJldHVybiBiaW5kaW5nczsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0U2hvcnROYW1lQmluZGluZ3NNYXAoKSB7DQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGJpbmRpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotICAgICAgICBiaW5kaW5ncy5wdXQoIlNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORyIsIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7DQotICAgICAgICBiaW5kaW5ncy5wdXQoIlNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORyIsIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7DQotICAgICAgICBiaW5kaW5ncy5wdXQoIlNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HIiwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsNCi0gICAgICAgIGJpbmRpbmdzLnB1dCgiU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkciLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOw0KLSAgICAgICAgYmluZGluZ3MucHV0KCJIVFRQQmluZGluZy5IVFRQX0JJTkRJTkciLCBIVFRQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOw0KLSAgICAgICAgcmV0dXJuIGJpbmRpbmdzOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vQmluZGluZ1R5cGVDb21wbGV0aW9uUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vQmluZGluZ1R5cGVDb21wbGV0aW9uUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdmZjA4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL0JpbmRpbmdUeXBlQ29tcGxldGlvblByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5JbXBvcnRSZXdyaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5qYXZhLkphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHlsZWRTdHJpbmc7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCi0NCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQ0KLXB1YmxpYyBjbGFzcyBCaW5kaW5nVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCBleHRlbmRzIEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsIHsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmc7DQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWU7DQotICAgIA0KLSAgICBwdWJsaWMgQmluZGluZ1R5cGVDb21wbGV0aW9uUHJvcG9zYWwoU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nLCBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwNCi0gICAgICAgICAgICBpbnQgcmVwbGFjZW1lbnRPZmZzZXQsIGludCByZXBsYWNlbWVudExlbmd0aCwgSW1hZ2UgaW1hZ2UsIFN0eWxlZFN0cmluZyBkaXNwbGF5U3RyaW5nLA0KLSAgICAgICAgICAgIGludCByZWxldmFuY2UsIFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKSB7DQotICAgICAgICBzdXBlcihyZXBsYWNlbWVudFN0cmluZywgY29tcGlsYXRpb25Vbml0LCByZXBsYWNlbWVudE9mZnNldCwgcmVwbGFjZW1lbnRMZW5ndGgsIGltYWdlLCBkaXNwbGF5U3RyaW5nLCANCi0gICAgICAgIAkJcmVsZXZhbmNlLCBmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsNCi0gICAgICAgIHRoaXMuZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSA9IGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWU7DQotICAgICAgICB0aGlzLnJlcGxhY2VtZW50U3RyaW5nID0gcmVwbGFjZW1lbnRTdHJpbmc7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVJlcGxhY2VtZW50U3RyaW5nKElEb2N1bWVudCBkb2N1bWVudCwgY2hhciB0cmlnZ2VyLCBpbnQgb2Zmc2V0LCANCi0gICAgICAgICAgICBJbXBvcnRSZXdyaXRlIGltcG9ydFJld3JpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7DQotICAgIAkNCi0gICAgICAgIGlmIChpbXBvcnRSZXdyaXRlICE9IG51bGwgJiYgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSAhPSBudWxsICYmIHJlcGxhY2VtZW50U3RyaW5nICE9IG51bGwpIHsgICAgICAgIA0KLSAgICAgICAgCWlmIChmdWxseVF1YWxpZmllZFR5cGVOYW1lLmluZGV4T2YoJy4nKSAhPSAtMSkgew0KLSAgICAgICAgICAgICAgICBJVHlwZVtdIHR5cGVzPSBpbXBvcnRSZXdyaXRlLmdldENvbXBpbGF0aW9uVW5pdCgpLmdldFR5cGVzKCk7DQotICAgICAgICAgICAgICAgIGlmICh0eXBlcy5sZW5ndGggPiAwICYmIHR5cGVzWzBdLmdldFNvdXJjZVJhbmdlKCkuZ2V0T2Zmc2V0KCkgPD0gb2Zmc2V0KSB7DQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGltcG9ydEFkZGVkID0gIWltcG9ydFJld3JpdGUuYWRkSW1wb3J0KGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpLmVxdWFscyhmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghaW1wb3J0QWRkZWQpIHsNCi0gICAgICAgICAgICAgICAgICAgIAlzZXRSZXBsYWNlbWVudFN0cmluZyhmdWxseVF1YWxpZmllZFR5cGVOYW1lDQotCQkJCQkJCQkrIHJlcGxhY2VtZW50U3RyaW5nLnN1YnN0cmluZyhyZXBsYWNlbWVudFN0cmluZy5sYXN0SW5kZXhPZignLicpKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW1wb3J0QWRkZWQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9SZXF1ZXN0V3JhcHBlckF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1JlcXVlc3RXcmFwcGVyQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQxYjgwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1JlcXVlc3RXcmFwcGVyQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmluaXRpYWxpemF0aW9uOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuQ0xBU1NfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5ET1RfQ0hBUkFDVEVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkpBWFdTX1NVQlBBQ0tBR0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuTE9DQUxfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5PUEVSQVRJT05fTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5UQVJHRVRfTkFNRVNQQUNFOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBSZXF1ZXN0V3JhcHBlckF0dHJpYnV0ZUluaXRpYWxpemVyIGV4dGVuZHMgQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PE1lbWJlclZhbHVlUGFpcj4gZ2V0TWVtYmVyVmFsdWVQYWlycyhJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIEFTVCBhc3QsCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpIHsKLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGphdmFFbGVtZW50OwotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IG1ldGhvZC5nZXRDb21waWxhdGlvblVuaXQoKS5maW5kUHJpbWFyeVR5cGUoKTsKLQotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGNsYXNzTmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCBDTEFTU19OQU1FLAotICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc05hbWUodHlwZSwgbWV0aG9kKSk7Ci0KLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBsb2NhbE5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgTE9DQUxfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYWxOYW1lKHR5cGUsIG1ldGhvZCkpOwotCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgICAgIFRBUkdFVF9OQU1FU1BBQ0UsIGdldFRhcmdldE5hbWVzcGFjZSh0eXBlKSk7Ci0KLSAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKGNsYXNzTmFtZVZhbHVlUGFpcik7Ci0gICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChsb2NhbE5hbWVWYWx1ZVBhaXIpOwotICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVtYmVyVmFsdWVQYWlyczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKSB7Ci0gICAgICAgIAotICAgICAgICBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGNvbXBsZXRpb25Qcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+KDEpOwotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKSB7Ci0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBqYXZhRWxlbWVudDsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSBtZXRob2QuZ2V0Q29tcGlsYXRpb25Vbml0KCkuZmluZFByaW1hcnlUeXBlKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBtZW1iZXJWYWx1ZVBhaXJOYW1lID0gbWVtYmVyVmFsdWVQYWlyLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCk7Ci0KLSAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXJOYW1lLmVxdWFscyhDTEFTU19OQU1FKSkgewotICAgICAgICAgICAgICAgIGNvbXBsZXRpb25Qcm9wb3NhbHMuYWRkKGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChnZXRDbGFzc05hbWUodHlwZSwgbWV0aG9kKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyTmFtZS5lcXVhbHMoTE9DQUxfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoZ2V0TG9jYWxOYW1lKHR5cGUsIG1ldGhvZCksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKFRBUkdFVF9OQU1FU1BBQ0UpKSB7Ci0gICAgICAgICAgICAgICAgY29tcGxldGlvblByb3Bvc2Fscy5hZGQoY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKGdldFRhcmdldE5hbWVzcGFjZSh0eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbXBsZXRpb25Qcm9wb3NhbHM7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoSVR5cGUgdHlwZSkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHBhY2thZ2VOYW1lID0gbmV3IFN0cmluZ0J1aWxkZXIodHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcGFja2FnZU5hbWUuYXBwZW5kKERPVF9DSEFSQUNURVIpOyAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIHBhY2thZ2VOYW1lLmFwcGVuZChKQVhXU19TVUJQQUNLQUdFKTsKLSAgICAgICAgcGFja2FnZU5hbWUuYXBwZW5kKERPVF9DSEFSQUNURVIpOwotICAgICAgICByZXR1cm4gcGFja2FnZU5hbWUudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoSVR5cGUgdHlwZSwgSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gbWV0aG9kLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UGFja2FnZU5hbWUodHlwZSkgKyBtZXRob2ROYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpCi0gICAgICAgICAgICAgICAgKyBtZXRob2ROYW1lLnN1YnN0cmluZygxKSArIEFubm90YXRpb25VdGlscy5hY2NvdW50Rm9yT3ZlcmxvYWRlZE1ldGhvZHModHlwZSwgbWV0aG9kKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2NhbE5hbWUoSVR5cGUgdHlwZSwgSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2QsIFdlYk1ldGhvZC5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgT1BFUkFUSU9OX05BTUUpOwotICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb25OYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbk5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpICsgQW5ub3RhdGlvblV0aWxzLmFjY291bnRGb3JPdmVybG9hZGVkTWV0aG9kcyh0eXBlLCBtZXRob2QpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgIAlKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZShJVHlwZSB0eXBlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24odHlwZSwgV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uLCBUQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgJiYgdGFyZ2V0TmFtZXNwYWNlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBKRFRVdGlscy5nZXRUYXJnZXROYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUodHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAJSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vUmVzcG9uc2VXcmFwcGVyQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vUmVzcG9uc2VXcmFwcGVyQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY1MTUxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1Jlc3BvbnNlV3JhcHBlckF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmluaXRpYWxpemF0aW9uOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuT1BFUkFUSU9OX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUkVTUE9OU0VfU1VGRklYOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIFJlc3BvbnNlV3JhcHBlckF0dHJpYnV0ZUluaXRpYWxpemVyIGV4dGVuZHMgUmVxdWVzdFdyYXBwZXJBdHRyaWJ1dGVJbml0aWFsaXplciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShJVHlwZSB0eXBlLCBJTWV0aG9kIG1ldGhvZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2QuZ2V0RWxlbWVudE5hbWUoKSArIFJFU1BPTlNFX1NVRkZJWDsKLSAgICAgICAgICAgIHJldHVybiBnZXRQYWNrYWdlTmFtZSh0eXBlKSArIG1ldGhvZE5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkKLSAgICAgICAgICAgICAgICArIG1ldGhvZE5hbWUuc3Vic3RyaW5nKDEpICsgQW5ub3RhdGlvblV0aWxzLmFjY291bnRGb3JPdmVybG9hZGVkTWV0aG9kcyh0eXBlLCBtZXRob2QpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgIAlKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExvY2FsTmFtZShJVHlwZSB0eXBlLCBJTWV0aG9kIG1ldGhvZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZCwgV2ViTWV0aG9kLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uLCBPUEVSQVRJT05fTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbk5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uTmFtZSArIFJFU1BPTlNFX1NVRkZJWDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmdldEVsZW1lbnROYW1lKCkgKyBSRVNQT05TRV9TVUZGSVggCi0gICAgICAgICAgICAgICAgICAgICsgQW5ub3RhdGlvblV0aWxzLmFjY291bnRGb3JPdmVybG9hZGVkTWV0aG9kcyh0eXBlLCBtZXRob2QpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgIAlKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vU09BUEJpbmRpbmdBdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9TT0FQQmluZGluZ0F0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMTEyNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9TT0FQQmluZGluZ0F0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmluaXRpYWxpemF0aW9uOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUEFSQU1FVEVSX1NUWUxFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlNUWUxFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlVTRTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjsKLQotcHVibGljIGNsYXNzIFNPQVBCaW5kaW5nQXR0cmlidXRlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBnZXRNZW1iZXJWYWx1ZVBhaXJzKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgQVNUIGFzdCwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCBTVFlMRSwgU3R5bGUuRE9DVU1FTlQpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB1c2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCBVU0UsIFVzZS5MSVRFUkFMKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCBQQVJBTUVURVJfU1RZTEUsIFBhcmFtZXRlclN0eWxlLldSQVBQRUQpOwotICAgICAgICAKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoc3R5bGVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh1c2VWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChwYXJhbWV0ZXJTdHlsZVZhbHVlUGFpcik7Ci0gICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXJzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vV2ViTWV0aG9kQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vV2ViTWV0aG9kQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU0MWQ4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1dlYk1ldGhvZEF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkFDVElPTjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5PUEVSQVRJT05fTkFNRTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBXZWJNZXRob2RBdHRyaWJ1dGVJbml0aWFsaXplciBleHRlbmRzIEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciB7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBnZXRNZW1iZXJWYWx1ZVBhaXJzKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgQVNUIGFzdCwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKLQotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpIHsKLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGphdmFFbGVtZW50OwotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IG1ldGhvZC5nZXRDb21waWxhdGlvblVuaXQoKS5maW5kUHJpbWFyeVR5cGUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG9wZXJhdGlvblZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAKLSAgICAgICAgICAgICAgICAgICAgT1BFUkFUSU9OX05BTUUsIGdldE9wZXJhdGlvbk5hbWVWYWx1ZSh0eXBlLCBtZXRob2QpKTsKLQotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGFjdGlvblZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAKLSAgICAgICAgICAgICAgICAgICAgQUNUSU9OLCBnZXRBY3Rpb25WYWx1ZSh0eXBlLCBtZXRob2QpKTsKLQotICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQob3BlcmF0aW9uVmFsdWVQYWlyKTsKLSAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKGFjdGlvblZhbHVlUGFpcik7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVtYmVyVmFsdWVQYWlyczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKSB7Ci0gICAgICAgIAotICAgICAgICBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGNvbXBsZXRpb25Qcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKSB7Ci0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBqYXZhRWxlbWVudDsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSBtZXRob2QuZ2V0Q29tcGlsYXRpb25Vbml0KCkuZmluZFByaW1hcnlUeXBlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBtZW1iZXJWYWx1ZVBhaXJOYW1lID0gbWVtYmVyVmFsdWVQYWlyLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCk7Ci0KLSAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXJOYW1lLmVxdWFscyhPUEVSQVRJT05fTkFNRSkpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoZ2V0T3BlcmF0aW9uTmFtZVZhbHVlKHR5cGUsIG1ldGhvZCksIAotICAgICAgICAgICAgICAgIAkJbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKEFDVElPTikpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoZ2V0QWN0aW9uVmFsdWUodHlwZSwgbWV0aG9kKSwKLSAgICAgICAgICAgICAgICAJCW1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29tcGxldGlvblByb3Bvc2FsczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRPcGVyYXRpb25OYW1lVmFsdWUoSVR5cGUgdHlwZSwgSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtZXRob2QuZ2V0RWxlbWVudE5hbWUoKSArIEFubm90YXRpb25VdGlscy5hY2NvdW50Rm9yT3ZlcmxvYWRlZE1ldGhvZHModHlwZSwgbWV0aG9kKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAJSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QWN0aW9uVmFsdWUoSVR5cGUgdHlwZSwgSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gbWV0aG9kLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICByZXR1cm4gInVybjoiICsgbWV0aG9kTmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICsgbWV0aG9kTmFtZS5zdWJzdHJpbmcoMSkgKyBBbm5vdGF0aW9uVXRpbHMuYWNjb3VudEZvck92ZXJsb2FkZWRNZXRob2RzKHR5cGUsIG1ldGhvZCk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgCUpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1dlYlBhcmFtQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vV2ViUGFyYW1BdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2U3NjAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vV2ViUGFyYW1BdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuaW5pdGlhbGl6YXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5BUkc7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuSEVBREVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLk5BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuT1BFUkFUSU9OX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUEFSVF9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlRBUkdFVF9OQU1FU1BBQ0U7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvZHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotCi1wdWJsaWMgY2xhc3MgV2ViUGFyYW1BdHRyaWJ1dGVJbml0aWFsaXplciBleHRlbmRzIEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IGdldE1lbWJlclZhbHVlUGFpcnMoQVNUTm9kZSBhc3ROb2RlLCBBU1QgYXN0LAotICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKLSAgICAgICAgCi0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0gICAgICAgIGlmIChhc3ROb2RlIGluc3RhbmNlb2YgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgTkFNRSwKLSAgICAgICAgICAgIGdldE5hbWUoKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIGFzdE5vZGUpKTsKLSAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG5hbWVWYWx1ZVBhaXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXJzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JNZW1iZXJWYWx1ZVBhaXIoQVNUTm9kZSBhc3ROb2RlLAotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpcikgewotICAgICAgICAKLSAgICAgICAgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBjb21wbGV0aW9uUHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPigpOwotICAgICAgICBpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyID0gKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIGFzdE5vZGU7Ci0gICAgICAgICAgICBTdHJpbmcgbWVtYmVyVmFsdWVQYWlyTmFtZSA9IG1lbWJlclZhbHVlUGFpci5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyTmFtZS5lcXVhbHMoTkFNRSkpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoZ2V0TmFtZShwYXJhbWV0ZXIpLAotICAgICAgICAgICAgICAgIAkJbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKFBBUlRfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoZ2V0UGFydE5hbWUocGFyYW1ldGVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXJOYW1lLmVxdWFscyhUQVJHRVRfTkFNRVNQQUNFKSkgewotICAgICAgICAgICAgICAgIGNvbXBsZXRpb25Qcm9wb3NhbHMuYWRkKGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChnZXRUYXJnZXROYW1lc3BhY2UocGFyYW1ldGVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29tcGxldGlvblByb3Bvc2FsczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROYW1lKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyKSB7Ci0gICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBwYXJhbWV0ZXIuZ2V0UGFyZW50KCk7Ci0gICAgICAgIGlmIChoYXNEb2N1bWVudEJhcmVTT0FQQmluZGluZyhtZXRob2REZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRXZWJNZXRob2RPcGVyYXRpb25OYW1lKG1ldGhvZERlY2xhcmF0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8Pz4gc2libGluZ3MgPSAoTGlzdDw/PikgbWV0aG9kRGVjbGFyYXRpb24uZ2V0U3RydWN0dXJhbFByb3BlcnR5KHBhcmFtZXRlci5nZXRMb2NhdGlvbkluUGFyZW50KCkpOwotICAgICAgICByZXR1cm4gQVJHICsgc2libGluZ3MuaW5kZXhPZihwYXJhbWV0ZXIpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRQYXJ0TmFtZShTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlcikgewotICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyLAotICAgICAgICAgICAgICAgIFdlYlBhcmFtLmNsYXNzKTsKLSAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgTkFNRSk7Ci0gICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldE5hbWUocGFyYW1ldGVyKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyKSB7Ci0gICAgICAgIGlmIChoYXNEb2N1bWVudFdyYXBwZWRTT0FQQmluZGluZyhwYXJhbWV0ZXIpICYmICFpc0hlYWRlcihwYXJhbWV0ZXIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldERlZmF1bHRUYXJnZXROYW1lc3BhY2UocGFyYW1ldGVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0VGFyZ2V0TmFtZXNwYWNlKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyKSB7Ci0gICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBwYXJhbWV0ZXIuZ2V0UGFyZW50KCk7Ci0gICAgICAgIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJlbnQoKTsKLSAgICAgICAgCi0gICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlRGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBKRFRVdGlscy5nZXRUYXJnZXROYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUoZ2V0UGFja2FnZU5hbWUodHlwZURlY2xhcmF0aW9uKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uLmlzUGFja2FnZU1lbWJlclR5cGVEZWNsYXJhdGlvbigpKSB7Ci0gICAgICAgICAgICBQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2xhcmF0aW9uID0gKChDb21waWxhdGlvblVuaXQpIHR5cGVEZWNsYXJhdGlvbi5nZXRQYXJlbnQoKSkuZ2V0UGFja2FnZSgpOwotICAgICAgICAgICAgaWYgKHBhY2thZ2VEZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VEZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNIZWFkZXIoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIpIHsKLSAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHBhcmFtZXRlciwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBCb29sZWFuIGhlYWRlciA9IEFubm90YXRpb25VdGlscy5nZXRCb29sZWFuVmFsdWUoYW5ub3RhdGlvbiwgSEVBREVSKTsKLSAgICAgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBoZWFkZXIuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNEb2N1bWVudFdyYXBwZWRTT0FQQmluZGluZyhTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlcikgewotICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgcGFyYW1ldGVyLmdldFBhcmVudCgpOwotCi0gICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2REZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBKQVhXU1V0aWxzLmlzRG9jdW1lbnRXcmFwcGVkKGFubm90YXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgbWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyZW50KCk7Ci0gICAgICAgIAotICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiB0eXBlQW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGVEZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIGlmICh0eXBlQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gSkFYV1NVdGlscy5pc0RvY3VtZW50V3JhcHBlZCh0eXBlQW5ub3RhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0RvY3VtZW50QmFyZVNPQVBCaW5kaW5nKEJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24pIHsKLSAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGJvZHlEZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBKQVhXU1V0aWxzLmlzRG9jdW1lbnRCYXJlKGFubm90YXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChib2R5RGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIGJvZHlEZWNsYXJhdGlvbjsKLSAgICAgICAgICAgIHJldHVybiBoYXNEb2N1bWVudEJhcmVTT0FQQmluZGluZygoVHlwZURlY2xhcmF0aW9uKSBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJlbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0V2ViTWV0aG9kT3BlcmF0aW9uTmFtZShNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgV2ViTWV0aG9kLmNsYXNzKTsKLSAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgT1BFUkFUSU9OX05BTUUpOwotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbk5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb25OYW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXRob2REZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9XZWJSZXN1bHRBdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9XZWJSZXN1bHRBdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGRkN2ZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vV2ViUmVzdWx0QXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmluaXRpYWxpemF0aW9uOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuSEVBREVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLk5BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuT1BFUkFUSU9OX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUEFSVF9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlJFU1BPTlNFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlJFVFVSTjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5UQVJHRVRfTkFNRVNQQUNFOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotCi1wdWJsaWMgY2xhc3MgV2ViUmVzdWx0QXR0cmlidXRlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgewotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PE1lbWJlclZhbHVlUGFpcj4gZ2V0TWVtYmVyVmFsdWVQYWlycyhJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIEFTVCBhc3QsCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCkgewotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCkgamF2YUVsZW1lbnQ7Ci0KLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBuYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsIE5BTUUsIGdldE5hbWUobWV0aG9kKSk7Ci0gICAgICAgIAotICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobmFtZVZhbHVlUGFpcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1lbWJlclZhbHVlUGFpcnM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JNZW1iZXJWYWx1ZVBhaXIoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LAotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpcikgewotCi0gICAgICAgIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gY29tcGxldGlvblByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4oKTsKLQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKSB7Ci0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBqYXZhRWxlbWVudDsKLQotICAgICAgICAgICAgU3RyaW5nIG1lbWJlclZhbHVlUGFpck5hbWUgPSBtZW1iZXJWYWx1ZVBhaXIuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKTsKLQotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKE5BTUUpKSB7Ci0gICAgICAgICAgICAgICAgY29tcGxldGlvblByb3Bvc2Fscy5hZGQoY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKGdldE5hbWUobWV0aG9kKSwgbWVtYmVyVmFsdWVQYWlyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXJOYW1lLmVxdWFscyhQQVJUX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgY29tcGxldGlvblByb3Bvc2Fscy5hZGQoY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKGdldFBhcnROYW1lKG1ldGhvZCksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyTmFtZS5lcXVhbHMoVEFSR0VUX05BTUVTUEFDRSkpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoZ2V0VGFyZ2V0TmFtZXNwYWNlKG1ldGhvZCksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbXBsZXRpb25Qcm9wb3NhbHM7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldE5hbWUoSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgaWYgKGhhc0RvY3VtZW50QmFyZVNPQVBCaW5kaW5nKG1ldGhvZCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRPcGVyYXRpb25OYW1lKG1ldGhvZCkgKyBSRVNQT05TRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUkVUVVJOOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldE9wZXJhdGlvbk5hbWUoSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2QsIFdlYk1ldGhvZC5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgT1BFUkFUSU9OX05BTUUpOwotICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb25OYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbk5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgIAlKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXRob2QuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzRG9jdW1lbnRCYXJlU09BUEJpbmRpbmcoSUFubm90YXRhYmxlIGFubm90YXRhYmxlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oYW5ub3RhdGFibGUsIFNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSkFYV1NVdGlscy5pc0RvY3VtZW50QmFyZShhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhbm5vdGF0YWJsZSBpbnN0YW5jZW9mIElNZXRob2QpIHsKLSAgICAgICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBhbm5vdGF0YWJsZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFzRG9jdW1lbnRCYXJlU09BUEJpbmRpbmcoKElUeXBlKSBtZXRob2QuZ2V0UGFyZW50KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgIAlKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIAotICAgIHByaXZhdGUgU3RyaW5nIGdldFBhcnROYW1lKElNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kLCBXZWJSZXN1bHQuY2xhc3MpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKGFubm90YXRpb24sIE5BTUUpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgIAlKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXROYW1lKG1ldGhvZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKElNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIGlmIChoYXNEb2N1bWVudFdyYXBwZWRTT0FQQmluZGluZyhtZXRob2QpICYmICFpc0hlYWRlcihtZXRob2QpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldERlZmF1bHRUYXJnZXROYW1lc3BhY2UobWV0aG9kKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzRG9jdW1lbnRXcmFwcGVkU09BUEJpbmRpbmcoSUFubm90YXRhYmxlIGFubm90YXRhYmxlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oYW5ub3RhdGFibGUsIFNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSkFYV1NVdGlscy5pc0RvY3VtZW50V3JhcHBlZChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhbm5vdGF0YWJsZSBpbnN0YW5jZW9mIElNZXRob2QpIHsKLSAgICAgICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBhbm5vdGF0YWJsZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFzRG9jdW1lbnRXcmFwcGVkU09BUEJpbmRpbmcoKElUeXBlKSBtZXRob2QuZ2V0UGFyZW50KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgIAlKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNIZWFkZXIoSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2QsIFdlYlJlc3VsdC5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQm9vbGVhbiBoZWFkZXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0Qm9vbGVhblZhbHVlKGFubm90YXRpb24sIEhFQURFUik7Ci0gICAgICAgICAgICAgICAgaWYgKGhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBoZWFkZXIuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgIAlKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0VGFyZ2V0TmFtZXNwYWNlKElNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIElUeXBlIHR5cGUgPSBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGUsIFdlYlNlcnZpY2UuY2xhc3MpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgIAlKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEpEVFV0aWxzLmdldFRhcmdldE5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZShnZXRQYWNrYWdlTmFtZSh0eXBlKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoSVR5cGUgdHlwZSkgewotICAgICAgICBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCk7Ci0gICAgICAgIHJldHVybiBwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vV2ViU2VydmljZUF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1dlYlNlcnZpY2VBdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTYzNTg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vV2ViU2VydmljZUF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkVORFBPSU5UX0lOVEVSRkFDRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlBPUlRfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5QT1JUX1NVRkZJWDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5TRVJWSUNFX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuU0VSVklDRV9TVUZGSVg7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuVEFSR0VUX05BTUVTUEFDRTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQXR0cmlidXRlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBnZXRNZW1iZXJWYWx1ZVBhaXJzKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgQVNUIGFzdCwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKLSAgICAgICAgCi0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpamF2YUVsZW1lbnQ7Ci0gICAgCi0gICAgICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgTkFNRSwgZ2V0TmFtZSh0eXBlKSk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBwb3J0TmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCBQT1JUX05BTUUsIAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UG9ydE5hbWUodHlwZSkpOwotICAgICAgICAKLSAgICAgICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc2VydmljZU5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgU0VSVklDRV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmljZU5hbWUodHlwZSkpOwotICAgIAotICAgICAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciB0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBUQVJHRVRfTkFNRVNQQUNFLCBnZXRUYXJnZXROYW1lc3BhY2UodHlwZSkpOwotICAgIAotICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzSW50ZXJmYWNlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobmFtZVZhbHVlUGFpcik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0NsYXNzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocG9ydE5hbWVWYWx1ZVBhaXIpOwotICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzZXJ2aWNlTmFtZVZhbHVlUGFpcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgCUpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1lbWJlclZhbHVlUGFpcnM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JNZW1iZXJWYWx1ZVBhaXIoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LAotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpcikgewotCi0gICAgICAgIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gY29tcGxldGlvblByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4oKTsKLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUpIHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpIGphdmFFbGVtZW50OwotCi0gICAgICAgICAgICBTdHJpbmcgbWVtYmVyVmFsdWVQYWlyTmFtZSA9IG1lbWJlclZhbHVlUGFpci5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpOwotCi0gICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyTmFtZS5lcXVhbHMoRU5EUE9JTlRfSU5URVJGQUNFKSkgewotICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzID0gZ2V0SW50ZXJmYWNlcyh0eXBlKTsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBhbkludGVyZmFjZSA6IGludGVyZmFjZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvblByb3Bvc2Fscy5hZGQoY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKGFuSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpLCBKYXZhVUkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0lOVEVSRkFDRSksIGFuSW50ZXJmYWNlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKE5BTUUpKSB7Ci0gICAgICAgICAgICAgICAgY29tcGxldGlvblByb3Bvc2Fscy5hZGQoY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKGdldE5hbWUodHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKFBPUlRfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoZ2V0UG9ydE5hbWUodHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKFNFUlZJQ0VfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoZ2V0U2VydmljZU5hbWUodHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKFRBUkdFVF9OQU1FU1BBQ0UpKSB7Ci0gICAgICAgICAgICAgICAgY29tcGxldGlvblByb3Bvc2Fscy5hZGQoY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKGdldFRhcmdldE5hbWVzcGFjZSh0eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbXBsZXRpb25Qcm9wb3NhbHM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKElUeXBlIHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIHR5cGUuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRQb3J0TmFtZShJVHlwZSB0eXBlKSB7Ci0gICAgICAgIHJldHVybiB0eXBlLmdldEVsZW1lbnROYW1lKCkgKyBQT1JUX1NVRkZJWDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZShJVHlwZSB0eXBlKSB7Ci0gICAgICAgIHJldHVybiB0eXBlLmdldEVsZW1lbnROYW1lKCkgKyBTRVJWSUNFX1NVRkZJWDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoSVR5cGUgdHlwZSkgewotICAgICAgICByZXR1cm4gSkRUVXRpbHMuZ2V0VGFyZ2V0TmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGdldEludGVyZmFjZXMoSVR5cGUgdHlwZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGludGVyZmFjZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIElUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHkgPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkodHlwZS5nZXRKYXZhUHJvamVjdCgpLCBudWxsKTsKLSAgICAgICAgICAgIElUeXBlW10gYWxsSW50ZXJmYWNlcyA9IHR5cGVIaWVyYXJjaHkuZ2V0QWxsSW50ZXJmYWNlcygpOwotICAgICAgICAgICAgZm9yIChJVHlwZSBhSW50ZXJmYWNlIDogYWxsSW50ZXJmYWNlcykgewotICAgICAgICAgICAgICAgIGlmICghYUludGVyZmFjZS5pc0JpbmFyeSgpICYmIGFJbnRlcmZhY2UuZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gYUludGVyZmFjZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgKz0gIi4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHF1YWxpZmllZE5hbWUgPSBwYWNrYWdlTmFtZSArIGFJbnRlcmZhY2UuZ2V0UHJpbWFyeUVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VzLmFkZChxdWFsaWZpZWROYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaW50ZXJmYWNlczsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAJSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25BcnJheUNlbGxFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvdmlld3MvQW5ub3RhdGlvbkFycmF5Q2VsbEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWJkYWQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvdmlld3MvQW5ub3RhdGlvbkFycmF5Q2VsbEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EaWFsb2dDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvblN0YXR1c0RpYWxvZzsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25BcnJheUNlbGxFZGl0b3IgZXh0ZW5kcyBEaWFsb2dDZWxsRWRpdG9yIHsKLSAgICBwcml2YXRlIE1ldGhvZCBtZXRob2Q7Ci0gICAgcHJpdmF0ZSBPYmplY3RbXSB2YWx1ZXM7Ci0KLSAgICBwcml2YXRlIExpc3Q8T2JqZWN0PiBvcmlnaW5hbFZhbHVlczsKLSAgICBwcml2YXRlIExpc3Q8T2JqZWN0PiB1cGRhdGVkVmFsdWVzOwotCi0gICAgcHJpdmF0ZSAgQW5ub3RhdGlvbkFycmF5RGlhbG9nIGFubm90YXRpb25BcnJheURpYWxvZzsKLSAgICAKLSAgICBib29sZWFuIGNhbmNlbGxlZDsKLSAgICAKLSAgICBwdWJsaWMgQW5ub3RhdGlvbkFycmF5Q2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBPYmplY3RbXSB2YWx1ZXMpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzLmNsb25lKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE9iamVjdCBvcGVuRGlhbG9nQm94KENvbnRyb2wgY2VsbEVkaXRvcldpbmRvdykgewotICAgICAgICBhbm5vdGF0aW9uQXJyYXlEaWFsb2cgPSBuZXcgQW5ub3RhdGlvbkFycmF5RGlhbG9nKGNlbGxFZGl0b3JXaW5kb3cuZ2V0U2hlbGwoKSwgdmFsdWVzKTsKLSAgICAgICAgaW50IHJldHVyblZhbHVlID0gYW5ub3RhdGlvbkFycmF5RGlhbG9nLm9wZW4oKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChyZXR1cm5WYWx1ZSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgIGNhbmNlbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25BcnJheURpYWxvZy5nZXRSZXN1bHQoKTsKLSAgICAgICAgfSBpZiAocmV0dXJuVmFsdWUgPT0gV2luZG93LkNBTkNFTCkgewotICAgICAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWVzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRob2QoTWV0aG9kIG1ldGhvZCkgewotICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udGVudHMoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdFtdKSB7Ci0gICAgICAgICAgICBPYmplY3RbXSB2YWx1ZXMgPSAoT2JqZWN0W10pdmFsdWU7Ci0gICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBnZXREZWZhdWx0TGFiZWwoKS5zZXRUZXh0KCJbXXsuLi59Iik7ICAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGdldERlZmF1bHRMYWJlbCgpLnNldFRleHQoIltde30iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE9iamVjdCBkb0dldFZhbHVlKCkgewotICAgICAgICBpZiAoY2FuY2VsbGVkIHx8IHVwZGF0ZWRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsVmFsdWVzICE9IG51bGwgPyBvcmlnaW5hbFZhbHVlcy50b0FycmF5KCkgOiBuZXcgT2JqZWN0WzBdOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1cGRhdGVkVmFsdWVzLnRvQXJyYXkoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBzdXBlci5kb1NldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgdGhpcy52YWx1ZXMgPSAoT2JqZWN0W10pdmFsdWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBBbm5vdGF0aW9uQXJyYXlEaWFsb2cgZXh0ZW5kcyBTZWxlY3Rpb25TdGF0dXNEaWFsb2cgewotICAgICAgICBwcml2YXRlIEJ1dHRvbiBhZGRCdXR0b247Ci0gICAgICAgIHByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLSAgICAgICAgcHJpdmF0ZSBCdXR0b24gdXBCdXR0b247Ci0gICAgICAgIHByaXZhdGUgQnV0dG9uIGRvd25CdXR0b247Ci0gICAgICAgIHByaXZhdGUgVGFibGUgYXJyYXlWYWx1ZXNUYWJsZTsKLSAgICAgICAgcHJpdmF0ZSBUYWJsZVZpZXdlciBhcnJheVZhbHVlc1RhYmxlVmlld2VyOwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBDb250cm9sPiBjb250cm9scyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ29udHJvbD4oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgcHVibGljIEFubm90YXRpb25BcnJheURpYWxvZyhTaGVsbCBwYXJlbnQsIE9iamVjdFtdIHZhbHVlcykgewotICAgICAgICAgICAgc3VwZXIocGFyZW50KTsKLSAgICAgICAgICAgIHNldFZhbHVlcyh2YWx1ZXMpOwotICAgICAgICAgICAgc2V0VGl0bGUoSkFYV1NVSU1lc3NhZ2VzLkFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfRURJVF9BUlJBWV9WQUxVRVNfVElUTEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFZhbHVlcyhPYmplY3RbXSB2YWx1ZXMpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3JpZ2luYWxWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVkVmFsdWVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSUFubm90YXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoSUFubm90YXRpb24pdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJTWVtYmVyVmFsdWVQYWlyW10gbWVtYmVyVmFsdWVQYWlycyA9IGFubm90YXRpb24uZ2V0TWVtYmVyVmFsdWVQYWlycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpcnMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gYUxpc3QgPSBuZXcgQXJyYXlMaXN0PE1hcDxTdHJpbmcsT2JqZWN0Pj4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyIDogbWVtYmVyVmFsdWVQYWlycykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVtYmVyTmFtZSA9IG1lbWJlclZhbHVlUGFpci5nZXRNZW1iZXJOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBtZW1iZXJWYWx1ZSA9IG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG12cHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZUtpbmQoKSA9PSBJTWVtYmVyVmFsdWVQYWlyLktfU1RSSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdnBzLnB1dChtZW1iZXJOYW1lLCBtZW1iZXJWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlS2luZCgpID09IElNZW1iZXJWYWx1ZVBhaXIuS19DTEFTUykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZwcy5wdXQobWVtYmVyTmFtZSwgbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkgKyAiLmNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhTGlzdC5hZGQobXZwcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVmFsdWVzLmFkZChhTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFZhbHVlcy5hZGQoYUxpc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMoQ2xhc3MuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFZhbHVlcy5hZGQodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFZhbHVlcy5hZGQodmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFZhbHVlcy5hZGQoc3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRWYWx1ZXMuYWRkKHN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAgICAgQ29tcG9zaXRlIG1haW5Db21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgICAgICAgIG1haW5Db21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgICAgIGdyaWREYXRhLndpZHRoSGludCA9IDgwMDsKLSAgICAgICAgICAgIG1haW5Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIENvbXBvc2l0ZSB0eXBlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotICAgICAgICAgICAgdHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICB0eXBlQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBjb21wb25lbnRUeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoY29tcG9uZW50VHlwZS5pc0Fubm90YXRpb24oKSkgewotICAgICAgICAgICAgICAgIExhYmVsIGNvbXBvbnRUeXBlTGFiZWwgPSBuZXcgTGFiZWwodHlwZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICAgICAgICAgIGNvbXBvbnRUeXBlTGFiZWwuc2V0VGV4dCgiQCIgKyBjb21wb25lbnRUeXBlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICAgICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgICAgICAgICBjb21wb250VHlwZUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgICAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IGNvbXBvbmVudFR5cGUuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgewotICAgICAgICAgICAgICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0eXBlQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICAgICAgICAgIGxhYmVsLnNldFRleHQobWV0aG9kLmdldE5hbWUoKSArICI6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlRW50cnlGaWVsZHMobWV0aG9kLCB0eXBlQ29tcG9zaXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHR5cGVDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgICAgICAgICBsYWJlbC5zZXRUZXh0KGNvbXBvbmVudFR5cGUuZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBjcmVhdGVFbnRyeUZpZWxkcyhtZXRob2QsIHR5cGVDb21wb3NpdGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotICAgICAgICAgICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICAgICAgICAgIGFkZEJ1dHRvbi5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5BTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX0FERF9MQUJFTCk7Ci0gICAgICAgICAgICBhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgU2V0PEVudHJ5PFN0cmluZywgQ29udHJvbD4+IGVudHJ5U2V0ID0gY29udHJvbHMuZW50cnlTZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgQ29udHJvbD4+IGl0ZXJhdG9yID0gZW50cnlTZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBhTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWFwPFN0cmluZyxPYmplY3Q+PigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnk8U3RyaW5nLCBDb250cm9sPiBlbnRyeSA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgVGV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgdGV4dEZpZWxkID0gKFRleHQpIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpIHRleHRGaWVsZC5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRGaWVsZC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VHlwZS5pc0Fubm90YXRpb24oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLnB1dChtZXRob2QuZ2V0TmFtZSgpLCB0ZXh0RmllbGQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFMaXN0LmFkZChtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRWYWx1ZXMuYWRkKHRleHRGaWVsZC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBCdXR0b24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbillbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgaWYgKGJ1dHRvbi4uZ2V0U3R5bGUoKSA9PSBTV1QuQ0hFQ0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpIGJ1dHRvbi5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUeXBlLmlzQW5ub3RhdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMucHV0KG1ldGhvZC5nZXROYW1lKCksIGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhTGlzdC5hZGQobWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkVmFsdWVzLmFkZChidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoYUxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFZhbHVlcy5hZGQoYUxpc3QpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFycmF5VmFsdWVzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICBhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgICAgICAgICByZW1vdmVCdXR0b24uc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9SRU1PVkVfTEFCRUwpOwotICAgICAgICAgICAgcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gYXJyYXlWYWx1ZXNUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBhcnJheVZhbHVlc1RhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkVmFsdWVzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcnJheVZhbHVlc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICByZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHVwQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICAgICAgICAgIHVwQnV0dG9uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfVVBfTEFCRUwpOwotICAgICAgICAgICAgdXBCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBtb3ZlU2VsZWN0ZWRFbGVtZW10VXAoZ2V0U2VsZWN0ZWRFbGVtZW50KCksIGdldFRhYmxlVmlld2VyKCkpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICB1cEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZG93bkJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgICAgICAgICBkb3duQnV0dG9uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfRE9XTl9MQUJFTCk7Ci0gICAgICAgICAgICBkb3duQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbW92ZVNlbGVjdGVkRWxlbWVtdERvd24oZ2V0U2VsZWN0ZWRFbGVtZW50KCksIGdldFRhYmxlVmlld2VyKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICBkb3duQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBDb21wb3NpdGUgdmFsdWVzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotICAgICAgICAgICAgdmFsdWVzQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAgICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICBncmlkRGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0gICAgICAgICAgICB2YWx1ZXNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIExhYmVsIHZhbHVlc0xhYmVsID0gbmV3IExhYmVsKHZhbHVlc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICAgICAgdmFsdWVzTGFiZWwuc2V0VGV4dChtZXRob2QuZ2V0TmFtZSgpICsgIjoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgCi0gICAgICAgICAgICBhcnJheVZhbHVlc1RhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHZhbHVlc0NvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgfCBTV1QuVl9TQ1JPTEwgCi0gICAgICAgICAgICAgICAgICAgIHwgU1dULkhfU0NST0xMKTsKLSAgICAgICAgICAgIGFycmF5VmFsdWVzVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBMaXN0PD8+KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldENvbXBvbmVudFR5cGUoKS5nZXRTaW1wbGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uTmFtZSArPSAiKCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzTGlzdCA9IChMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+KWVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxNYXA8U3RyaW5nLCBPYmplY3Q+PiB2YWx1ZXNJdGVyYXRvciA9IHZhbHVlc0xpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh2YWx1ZXNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHZhbHVlc01hcCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KXZhbHVlc0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8RW50cnk8U3RyaW5nLCBPYmplY3Q+PiBlbnRyeVNldCA9IHZhbHVlc01hcC5lbnRyeVNldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IGl0ZXJhdG9yID0gZW50cnlTZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTdHJpbmcgPSAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgJiYgIXZhbHVlLnRvU3RyaW5nKCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kc1dpdGgoIi5jbGFzcyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25OYW1lICs9IGVudHJ5LmdldEtleSgpICsgIj1cIiIgKyB2YWx1ZSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbk5hbWUgKz0gZW50cnkuZ2V0S2V5KCkgKyAiPSIgKyB2YWx1ZTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbk5hbWUgKz0gIiwgIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uTmFtZSArPSAiKSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpLmlzQW5ub3RhdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSmF2YVVJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfQU5OT1RBVElPTik7Ci0gICAgICAgICAgICAgICAgICAgIH0gaWYgKHJldHVyblR5cGUuZXF1YWxzKENsYXNzLmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEphdmFVSS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0NMQVNTKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzLklNR19PQkpfRklMRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXJyYXlWYWx1ZXNUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gYXJyYXlWYWx1ZXNUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgaXRlbUNvdW50ID0gYXJyYXlWYWx1ZXNUYWJsZS5nZXRJdGVtQ291bnQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwICYmIGl0ZW1Db3VudCA8PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvd25CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwICYmIGl0ZW1Db3VudCA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgZG93bkJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAwICYmIGluZGV4IDwgaXRlbUNvdW50IC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvd25CdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gMCAmJiBpbmRleCA9PSBpdGVtQ291bnQgLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZG93bkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXJyYXlWYWx1ZXNUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5VmFsdWVzQ29udGVudFByb3ZpZGVyKCkpOwotCi0gICAgICAgICAgICBhcnJheVZhbHVlc1RhYmxlID0gYXJyYXlWYWx1ZXNUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgICAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgICAgIGFycmF5VmFsdWVzVGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgICAgIGFycmF5VmFsdWVzVGFibGVWaWV3ZXIuc2V0SW5wdXQodmFsdWVzKTsKLQotICAgICAgICAgICAgdXBCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBkb3duQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgICAgICByZXR1cm4gbWFpbkNvbXBvc2l0ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgY3JlYXRlRW50cnlGaWVsZHMoTWV0aG9kIG1ldGhvZCwgQ29tcG9zaXRlIHR5cGVDb21wb3NpdGUpIHsKLSAgICAgICAgICAgLy9UT0RPIEhhbmRsZSBFTlVNUyAKLSAgICAgICAgICAgIENsYXNzPD8+IHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICAgICAgT2JqZWN0IGRlZmF1bHRWYWx1ZSA9IG1ldGhvZC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoU3RyaW5nLmNsYXNzKSkgewotICAgICAgICAgICAgICAgIFRleHQgdGV4dCA9IG5ldyBUZXh0KHR5cGVDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotICAgICAgICAgICAgICAgIHRleHQuc2V0RGF0YShtZXRob2QpOwotICAgICAgICAgICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgICAgICAgICB0ZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0ZXh0LnNldFRleHQoZGVmYXVsdFZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb250cm9scy5wdXQobWV0aG9kLmdldE5hbWUoKSwgdGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQ2xhc3MuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQodHlwZUNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0gICAgICAgICAgICAgICAgdGV4dC5zZXREYXRhKG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICB0ZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiBjbGFzc1ZhbHVlID0gKENsYXNzPD8+KWRlZmF1bHRWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRUZXh0KGNsYXNzVmFsdWUuZ2V0Q2Fub25pY2FsTmFtZSgpICsgIi5jbGFzcyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEJ1dHRvbiBicm93c2VDbGFzc0J1dHRvbiA9IG5ldyBCdXR0b24odHlwZUNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgICAgICAgICAgICAgIGJyb3dzZUNsYXNzQnV0dG9uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfQlJPV1NFX0xBQkVMKTsKLSAgICAgICAgICAgICAgICBicm93c2VDbGFzc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBnZXRDbGFzc1NlbGVjdGlvbkRpYWxvZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nLnNldFRpdGxlKEpBWFdTVUlNZXNzYWdlcy5BTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX1NFTEVDVF9DTEFTU19USVRMRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gdHlwZXMgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVzICE9IG51bGwgJiYgdHlwZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKXR5cGVzWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0JpbmFyeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LnNldFRleHQodHlwZS5nZXRDbGFzc0ZpbGUoKS5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIGNvbnRyb2xzLnB1dChtZXRob2QuZ2V0TmFtZSgpLCB0ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgIExhYmVsIG5vdFN1cHBvcnRMYWJlbCA9IG5ldyBMYWJlbCh0eXBlQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICAgICAgbm90U3VwcG9ydExhYmVsLnNldFRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9ORVNURURfQVJSQVlTX05PVF9TVVBQT1JURUQpOwotICAgICAgICAgICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICAgICAgICAgIG5vdFN1cHBvcnRMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhCb29sZWFuLlRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgQnV0dG9uIGNoZWNrYm94ID0gbmV3IEJ1dHRvbih0eXBlQ29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotICAgICAgICAgICAgICAgIGNoZWNrYm94LnNldERhdGEobWV0aG9kKTsKLSAgICAgICAgICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgICAgICAgICAgY2hlY2tib3guc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrYm94LnNldFNlbGVjdGlvbigoQm9vbGVhbilkZWZhdWx0VmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb250cm9scy5wdXQobWV0aG9kLmdldE5hbWUoKSwgY2hlY2tib3gpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkRWxlbWVudCgpIHsKLSAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbj0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBhcnJheVZhbHVlc1RhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBUYWJsZVZpZXdlciBnZXRUYWJsZVZpZXdlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBhcnJheVZhbHVlc1RhYmxlVmlld2VyOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBtb3ZlU2VsZWN0ZWRFbGVtZW10VXAoT2JqZWN0IHNlbGVjdGVkLCBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcikgewotICAgICAgICAgICAgaW50IHNlbGVjdGlvbkluZGV4ID0gdGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZWRWYWx1ZXMucmVtb3ZlKHNlbGVjdGVkKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVkVmFsdWVzLmFkZChzZWxlY3Rpb25JbmRleCAtIDEsIHNlbGVjdGVkKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgdGFibGVWaWV3ZXIucmV2ZWFsKHNlbGVjdGVkKTsKLSAgICAgICAgICAgICAgICB0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgbW92ZVNlbGVjdGVkRWxlbWVtdERvd24oT2JqZWN0IHNlbGVjdGVkLCBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcikgewotICAgICAgICAgICAgaW50IHNlbGVjdGlvbkluZGV4ID0gdGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICAgICAgaW50IGl0ZW1Db3VudCA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCk7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0aW9uSW5kZXggPCBpdGVtQ291bnQgLSAxKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlZFZhbHVlcy5yZW1vdmUoc2VsZWN0ZWQpOwotICAgICAgICAgICAgICAgIHVwZGF0ZWRWYWx1ZXMuYWRkKHNlbGVjdGlvbkluZGV4ICsgMSwgc2VsZWN0ZWQpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRhYmxlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICB0YWJsZVZpZXdlci5yZXZlYWwoc2VsZWN0ZWQpOwotICAgICAgICAgICAgICAgIHRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBjbGFzcyBBcnJheVZhbHVlc0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHVibGljIEFycmF5VmFsdWVzQ29udGVudFByb3ZpZGVyKCkgewotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVkVmFsdWVzLnRvQXJyYXkoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTZWxlY3Rpb25EaWFsb2cgZ2V0Q2xhc3NTZWxlY3Rpb25EaWFsb2coKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZyhnZXRTaGVsbCgpLCBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaEVuZ2luZS5jcmVhdGVXb3Jrc3BhY2VTY29wZSgpLCBJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFUywgCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgIiogIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9iamVjdFtdIGdldFJlc3VsdCgpIHsKLSAgICAgICAgICAgIHJldHVybiB1cGRhdGVkVmFsdWVzLnRvQXJyYXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlUmVzdWx0KCkgewotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS92aWV3cy9Bbm5vdGF0aW9uc0NvbHVtbkxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzc1NzI2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkudmlld3M7DQotDQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklTaGFyZWRJbWFnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc0NvbHVtbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBDb2x1bW5MYWJlbFByb3ZpZGVyIHsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgew0KLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDbGFzcykgew0KLSAgICAgICAgICAgIHJldHVybiAoKENsYXNzPD8+KWVsZW1lbnQpLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2QpIHsNCi0gICAgICAgICAgICByZXR1cm4gKChNZXRob2QpZWxlbWVudCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgew0KLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDbGFzcykgew0KLSAgICAgICAgICAgIHJldHVybiBKYXZhVUkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19BTk5PVEFUSU9OKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kKSB7DQotICAgICAgICAgICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoDQotICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzLklNR19PQkpfRklMRSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zVmFsdWVzQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS92aWV3cy9Bbm5vdGF0aW9uc1ZhbHVlc0NvbHVtbkxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY3NWY2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zVmFsdWVzQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb29sZWFuTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUV4dGVuZGVkTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc1ZhbHVlc0NvbHVtbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBDb2x1bW5MYWJlbFByb3ZpZGVyIHsKLSAgICBwcml2YXRlIFRyZWVWaWV3ZXIgYW5ub3RhdGlvblRyZWVWaWV3ZXI7Ci0gICAgcHJpdmF0ZSBJbWFnZSB0cnVlX2ltYWdlOwotICAgIHByaXZhdGUgSW1hZ2UgZmFsc2VfaW1hZ2U7Ci0gICAgCi0gICAgcHVibGljIEFubm90YXRpb25zVmFsdWVzQ29sdW1uTGFiZWxQcm92aWRlcihUcmVlVmlld2VyIGFubm90YXRpb25UcmVlVmlld2VyKSB7Ci0gICAgICAgIHRoaXMuYW5ub3RhdGlvblRyZWVWaWV3ZXIgPSBhbm5vdGF0aW9uVHJlZVZpZXdlcjsKLSAgICAgICAgdHJ1ZV9pbWFnZSA9IEpBWFdTVUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwgImljb25zL29iajE2L3RydWUuZ2lmIikgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIC5jcmVhdGVJbWFnZSgpOwotICAgICAgICBmYWxzZV9pbWFnZSA9IEpBWFdTVUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwgImljb25zL29iajE2L2ZhbHNlLmdpZiIpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAuY3JlYXRlSW1hZ2UoKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2QpIHsKLSAgICAgICAgICAgIHRleHQgPSAgZ2V0VGV4dEZvck1ldGhvZCgoTWV0aG9kKWVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ZXh0OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRUZXh0Rm9yTWV0aG9kKE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgU3RyaW5nIHRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoYW5ub3RhdGlvblRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElBbm5vdGF0YWJsZSkgewotICAgICAgICAgICAgdGV4dCA9IGdldFRleHRGb3JNZXRob2QobWV0aG9kLCAoSUFubm90YXRhYmxlKSBhbm5vdGF0aW9uVHJlZVZpZXdlci5nZXRJbnB1dCgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChhbm5vdGF0aW9uVHJlZVZpZXdlci5nZXRJbnB1dCgpIGluc3RhbmNlb2YgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgdGV4dCA9IGdldFRleHRGb3JNZXRob2QobWV0aG9kLCAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbilhbm5vdGF0aW9uVHJlZVZpZXdlci5nZXRJbnB1dCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRUZXh0Rm9yTWV0aG9kKE1ldGhvZCBtZXRob2QsIElBbm5vdGF0YWJsZSBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0gICAgICAgIENsYXNzPD8+IHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IGFubm90YXRlZEVsZW1lbnQuZ2V0QW5ub3RhdGlvbnMoKTsKLSAgICAgICAgICAgIGZvciAoSUFubm90YXRpb24gYW5ub3RhdGlvbiA6IGFubm90YXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MgPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLSAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbi5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhkZWNsYXJpbmdDbGFzcy5nZXRTaW1wbGVOYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBhbm5vdGF0aW9uLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKGRlY2xhcmluZ0NsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgSU1lbWJlclZhbHVlUGFpcltdIG1lbWJlclZhbHVlUGFpcnMgPSBhbm5vdGF0aW9uLmdldE1lbWJlclZhbHVlUGFpcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA6IG1lbWJlclZhbHVlUGFpcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyLmdldE1lbWJlck5hbWUoKS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoU3RyaW5nLmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKENsYXNzLmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkudG9TdHJpbmcoKSArICIuY2xhc3MiOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5pc1ByaW1pdGl2ZSgpICYmIChyZXR1cm5UeXBlLmVxdWFscyhCeXRlLlRZUEUpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcmV0dXJuVHlwZS5lcXVhbHMoU2hvcnQuVFlQRSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCByZXR1cm5UeXBlLmVxdWFscyhJbnRlZ2VyLlRZUEUpIHx8IHJldHVyblR5cGUuZXF1YWxzKExvbmcuVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJldHVyblR5cGUuZXF1YWxzKEZsb2F0LlRZUEUpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcmV0dXJuVHlwZS5lcXVhbHMoRG91YmxlLlRZUEUpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IChPYmplY3RbXSltZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIltdey4uLn0iOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIltde30iOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuaXNFbnVtKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVudW1WYWx1ZSA9IG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnVtVmFsdWUuc3Vic3RyaW5nKGVudW1WYWx1ZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dEZvck1ldGhvZChNZXRob2QgbWV0aG9kLCBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQ2xhc3M8Pz4gcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgIExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IG1vZGlmaWVycyA9IHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24ubW9kaWZpZXJzKCk7Ci0gICAgICAgIGZvciAoSUV4dGVuZGVkTW9kaWZpZXIgZXh0ZW5kZWRNb2RpZmllciA6IG1vZGlmaWVycykgewotICAgICAgICAgICAgaWYgKGV4dGVuZGVkTW9kaWZpZXIgaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgTm9ybWFsQW5ub3RhdGlvbiBub3JtYWxBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGV4dGVuZGVkTW9kaWZpZXI7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFubm90YXRpb25OYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKG5vcm1hbEFubm90YXRpb24pOwotICAgICAgICAgICAgICAgIENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzID0gbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb25OYW1lLmVxdWFscyhkZWNsYXJpbmdDbGFzcy5nZXRTaW1wbGVOYW1lKCkpIHx8IAotICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbk5hbWUuZXF1YWxzKGRlY2xhcmluZ0NsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBub3JtYWxBbm5vdGF0aW9uLnZhbHVlcygpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgOiBtZW1iZXJWYWx1ZVBhaXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyLmdldE5hbWUoKS50b1N0cmluZygpLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IChTdHJpbmdMaXRlcmFsKW1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nTGl0ZXJhbC5nZXRMaXRlcmFsVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5pc1ByaW1pdGl2ZSgpICYmIChyZXR1cm5UeXBlLmVxdWFscyhCeXRlLlRZUEUpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcmV0dXJuVHlwZS5lcXVhbHMoU2hvcnQuVFlQRSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCByZXR1cm5UeXBlLmVxdWFscyhJbnRlZ2VyLlRZUEUpIHx8IHJldHVyblR5cGUuZXF1YWxzKExvbmcuVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJldHVyblR5cGUuZXF1YWxzKEZsb2F0LlRZUEUpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcmV0dXJuVHlwZS5lcXVhbHMoRG91YmxlLlRZUEUpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5pc0VudW0oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW51bVZhbHVlID0gbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudW1WYWx1ZS5zdWJzdHJpbmcoZW51bVZhbHVlLmxhc3RJbmRleE9mKCIuIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENsYXNzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEltYWdlRm9yQ2xhc3MoKENsYXNzPD8+KSBlbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEltYWdlRm9yTWV0aG9kKChNZXRob2QpIGVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAgICAgCi0gICAgcHJpdmF0ZSBJbWFnZSBnZXRJbWFnZUZvckNsYXNzKENsYXNzPD8+IGFDbGFzcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uVHJlZVZpZXdlci5nZXRJbnB1dCgpIGluc3RhbmNlb2YgSUFubm90YXRhYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0SW1hZ2VGb3JDbGFzcyhhQ2xhc3MsIChJQW5ub3RhdGFibGUpIGFubm90YXRpb25UcmVlVmlld2VyLmdldElucHV0KCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoYW5ub3RhdGlvblRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRJbWFnZUZvckNsYXNzKGFDbGFzcywgKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pYW5ub3RhdGlvblRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlX2ltYWdlOyAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgSW1hZ2UgZ2V0SW1hZ2VGb3JDbGFzcyhDbGFzczw/PiBhQ2xhc3MsIElBbm5vdGF0YWJsZSBhbm5vdGF0ZWRFbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgSUFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IGFubm90YXRlZEVsZW1lbnQuZ2V0QW5ub3RhdGlvbnMoKTsKLSAgICAgICAgZm9yIChJQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgICAgIFN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IGFubm90YXRpb24uZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudCgoSUphdmFFbGVtZW50KWFubm90YXRlZEVsZW1lbnQsIGFubm90YXRpb25OYW1lKSAmJiAKLSAgICAgICAgICAgICAgICAgICAgKGFubm90YXRpb25OYW1lLmVxdWFscyhhQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSB8fCAKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbk5hbWUuZXF1YWxzKGFDbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlX2ltYWdlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZV9pbWFnZTsKLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBJbWFnZSBnZXRJbWFnZUZvckNsYXNzKENsYXNzPD8+IGFDbGFzcywgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIpIHsKLSAgICAgICAgTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gbW9kaWZpZXJzID0gcGFyYW1ldGVyLm1vZGlmaWVycygpOwotICAgICAgICBmb3IgKElFeHRlbmRlZE1vZGlmaWVyIGV4dGVuZGVkTW9kaWZpZXIgOiBtb2RpZmllcnMpIHsKLSAgICAgICAgICAgIGlmIChleHRlbmRlZE1vZGlmaWVyIGluc3RhbmNlb2YgQW5ub3RhdGlvbikgewotICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uKSBleHRlbmRlZE1vZGlmaWVyOwotICAgICAgICAgICAgICAgIFN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQocGFyYW1ldGVyLCBhbm5vdGF0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGFubm90YXRpb25OYW1lLmVxdWFscyhhQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgYW5ub3RhdGlvbk5hbWUuZXF1YWxzKGFDbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZV9pbWFnZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlX2ltYWdlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEltYWdlIGdldEltYWdlRm9yTWV0aG9kKE1ldGhvZCBtZXRob2QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBDbGFzczw/PiByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKEJvb2xlYW4uVFlQRSkpIHsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uVHJlZVZpZXdlci5nZXRJbnB1dCgpIGluc3RhbmNlb2YgSUFubm90YXRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEltYWdlRm9yTWV0aG9kKG1ldGhvZCwgKElBbm5vdGF0YWJsZSkgYW5ub3RhdGlvblRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvblRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW1hZ2VGb3JNZXRob2QobWV0aG9kLCAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbilhbm5vdGF0aW9uVHJlZVZpZXdlci5nZXRJbnB1dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEltYWdlIGdldEltYWdlRm9yTWV0aG9kKE1ldGhvZCBtZXRob2QsIElBbm5vdGF0YWJsZSBhbm5vdGF0ZWRFbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgSUFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IGFubm90YXRlZEVsZW1lbnQuZ2V0QW5ub3RhdGlvbnMoKTsKLSAgICAgICAgZm9yIChJQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgICAgIFN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IGFubm90YXRpb24uZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgIENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzID0gbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbk5hbWUuZXF1YWxzKGRlY2xhcmluZ0NsYXNzLmdldFNpbXBsZU5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgYW5ub3RhdGlvbk5hbWUuZXF1YWxzKGRlY2xhcmluZ0NsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBJTWVtYmVyVmFsdWVQYWlyW10gbWVtYmVyVmFsdWVQYWlycyA9IGFubm90YXRpb24uZ2V0TWVtYmVyVmFsdWVQYWlycygpOwotICAgICAgICAgICAgICAgIGZvciAoSU1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgOiBtZW1iZXJWYWx1ZVBhaXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXIuZ2V0TWVtYmVyTmFtZSgpLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4ucGFyc2VCb29sZWFuKG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVfaW1hZ2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlX2ltYWdlOwotICAgIH0KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIEltYWdlIGdldEltYWdlRm9yTWV0aG9kKE1ldGhvZCBtZXRob2QsIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgCi0gICAgICAgICAgICB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gbW9kaWZpZXJzID0gc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5tb2RpZmllcnMoKTsKLSAgICAgICAgZm9yIChJRXh0ZW5kZWRNb2RpZmllciBleHRlbmRlZE1vZGlmaWVyIDogbW9kaWZpZXJzKSB7Ci0gICAgICAgICAgICBpZiAoZXh0ZW5kZWRNb2RpZmllciBpbnN0YW5jZW9mIE5vcm1hbEFubm90YXRpb24pIHsKLSAgICAgICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZXh0ZW5kZWRNb2RpZmllcjsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICAgICAgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MgPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLSAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbk5hbWUuZXF1YWxzKGRlY2xhcmluZ0NsYXNzLmdldFNpbXBsZU5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGFubm90YXRpb25OYW1lLmVxdWFscyhkZWNsYXJpbmdDbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gYW5ub3RhdGlvbi52YWx1ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyIDogbWVtYmVyVmFsdWVQYWlycykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXROYW1lKCkudG9TdHJpbmcoKS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuTGl0ZXJhbCBib29sZWFuTGl0ZXJhbCA9IChCb29sZWFuTGl0ZXJhbCltZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm9vbGVhbkxpdGVyYWwuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVfaW1hZ2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZV9pbWFnZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgICAgIHRydWVfaW1hZ2UuZGlzcG9zZSgpOwotICAgICAgICBmYWxzZV9pbWFnZS5kaXNwb3NlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS92aWV3cy9Bbm5vdGF0aW9uc1ZhbHVlc0VkaXRpbmdTdXBwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zVmFsdWVzRWRpdGluZ1N1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk1Mjk3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zVmFsdWVzRWRpdGluZ1N1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9vbGVhbkxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUV4dGVuZGVkTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUGFja2FnZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkFTVFJld3JpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9Cb3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRWRpdGluZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLklVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc1ZhbHVlc0VkaXRpbmdTdXBwb3J0IGV4dGVuZHMgRWRpdGluZ1N1cHBvcnQgewotICAgIHByaXZhdGUgQW5ub3RhdGlvbnNWaWV3IGFubm90YXRpb25zVmlldzsKLSAgICBwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLSAgICAKLSAgICBwcml2YXRlIFRleHRDZWxsRWRpdG9yIHRleHRDZWxsRWRpdG9yOwotICAgIHByaXZhdGUgQ2hlY2tib3hDZWxsRWRpdG9yIGNoZWNrYm94Q2VsbEVkaXRvcjsKLSAgICBwcml2YXRlIENvbWJvQm94Q2VsbEVkaXRvciBjb21ib0JveENlbGxFZGl0b3I7Ci0gICAgcHJpdmF0ZSBDbGFzc0RpYWxvZ0NlbGxFZGl0b3IgY2xhc3NEaWFsb2dDZWxsRWRpdG9yOwotICAgIHByaXZhdGUgQW5ub3RhdGlvbkFycmF5Q2VsbEVkaXRvciBhbm5vdGF0aW9uQXJyYXlDZWxsRWRpdG9yOwotCi0gICAgcHVibGljIEFubm90YXRpb25zVmFsdWVzRWRpdGluZ1N1cHBvcnQoQW5ub3RhdGlvbnNWaWV3IGFubm90YXRpb25zVmlldywgVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0gICAgICAgIHN1cGVyKHRyZWVWaWV3ZXIpOwotICAgICAgICB0aGlzLnRyZWVWaWV3ZXIgPSB0cmVlVmlld2VyOwotICAgICAgICB0aGlzLmFubm90YXRpb25zVmlldyA9IGFubm90YXRpb25zVmlldzsKLSAgICAgICAgdGV4dENlbGxFZGl0b3IgPSBuZXcgVGV4dENlbGxFZGl0b3IodHJlZVZpZXdlci5nZXRUcmVlKCkpOwotICAgICAgICBjaGVja2JveENlbGxFZGl0b3IgPSBuZXcgQ2hlY2tib3hDZWxsRWRpdG9yKHRyZWVWaWV3ZXIuZ2V0VHJlZSgpKTsKLSAgICAgICAgY29tYm9Cb3hDZWxsRWRpdG9yID0gbmV3IENvbWJvQm94Q2VsbEVkaXRvcih0cmVlVmlld2VyLmdldFRyZWUoKSwgbmV3IFN0cmluZ1tdIHt9KTsKLSAgICAgICAgY2xhc3NEaWFsb2dDZWxsRWRpdG9yID0gbmV3IENsYXNzRGlhbG9nQ2VsbEVkaXRvcih0cmVlVmlld2VyLmdldFRyZWUoKSk7Ci0gICAgICAgIGFubm90YXRpb25BcnJheUNlbGxFZGl0b3IgPSBuZXcgQW5ub3RhdGlvbkFycmF5Q2VsbEVkaXRvcih0cmVlVmlld2VyLmdldFRyZWUoKSwgbmV3IE9iamVjdFtdIHt9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FZGl0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kKSB7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZCllbGVtZW50OwotICAgICAgICAgICAgcmV0dXJuIChCb29sZWFuKSBnZXRWYWx1ZShtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENlbGxFZGl0b3IgZ2V0Q2VsbEVkaXRvcihPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hlY2tib3hDZWxsRWRpdG9yOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kKSB7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkgZWxlbWVudDsKLSAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuaXNFbnVtKCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3RbXSBlbnVtQ29uc3RhbnRzID0gcmV0dXJuVHlwZS5nZXRFbnVtQ29uc3RhbnRzKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tlbnVtQ29uc3RhbnRzLmxlbmd0aF07Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtQ29uc3RhbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IGVudW1Db25zdGFudHNbaV0udG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29tYm9Cb3hDZWxsRWRpdG9yLnNldEl0ZW1zKHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbWJvQm94Q2VsbEVkaXRvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhCb29sZWFuLlRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrYm94Q2VsbEVkaXRvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKENsYXNzLmNsYXNzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc0RpYWxvZ0NlbGxFZGl0b3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25BcnJheUNlbGxFZGl0b3Iuc2V0TWV0aG9kKG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25BcnJheUNlbGxFZGl0b3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgdGV4dENlbGxFZGl0b3Iuc2V0VmFsaWRhdG9yKG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBpc1ZhbGlkKE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQnl0ZS5UWVBFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlLnBhcnNlQnl0ZSgoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhTaG9ydC5UWVBFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG9ydC5wYXJzZVNob3J0KChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKEludGVnZXIuVFlQRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhMb25nLlRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmcucGFyc2VMb25nKChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKEZsb2F0LlRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0LnBhcnNlRmxvYXQoKFN0cmluZykgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoRG91YmxlLlRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvdWJsZS5wYXJzZURvdWJsZSgoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKQVhXU1VJTWVzc2FnZXMuQU5OT1RBVElPTl9FRElUSU5HX1NVUFBPUlRfTk9UX1ZBTElEX01FU1NBR0VfUFJFRklYIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJldHVyblR5cGUuZ2V0U2ltcGxlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGV4dENlbGxFZGl0b3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGV4dENlbGxFZGl0b3I7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoZWNrYm94Q2VsbEVkaXRvcjsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWVGb3JDbGFzcygoQ2xhc3M8Pz4pIGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWVGb3JNZXRob2QoKE1ldGhvZCkgZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgT2JqZWN0IGdldFZhbHVlRm9yQ2xhc3MoQ2xhc3M8Pz4gYUNsYXNzKSB7Ci0gICAgICAgIGlmICh0cmVlVmlld2VyLmdldElucHV0KCkgaW5zdGFuY2VvZiBJQW5ub3RhdGFibGUpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZUZvckNsYXNzKGFDbGFzcywgKElBbm5vdGF0YWJsZSkgdHJlZVZpZXdlci5nZXRJbnB1dCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodHJlZVZpZXdlci5nZXRJbnB1dCgpIGluc3RhbmNlb2YgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlRm9yQ2xhc3MoYUNsYXNzLCAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgdHJlZVZpZXdlci5nZXRJbnB1dCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0VmFsdWVGb3JDbGFzcyhDbGFzczw/PiBhQ2xhc3MsIElBbm5vdGF0YWJsZSBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gYW5ub3RhdGVkRWxlbWVudC5nZXRBbm5vdGF0aW9ucygpOwotICAgICAgICAgICAgZm9yIChJQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBhbm5vdGF0aW9uLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KChJSmF2YUVsZW1lbnQpYW5ub3RhdGVkRWxlbWVudCwgYW5ub3RhdGlvbk5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoYW5ub3RhdGlvbk5hbWUuZXF1YWxzKGFDbGFzcy5nZXRTaW1wbGVOYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBhbm5vdGF0aW9uTmFtZS5lcXVhbHMoYUNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9IAotICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRTsKLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0VmFsdWVGb3JDbGFzcyhDbGFzczw/PiBhQ2xhc3MsIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyKSB7Ci0gICAgICAgIExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IG1vZGlmaWVycyA9IHBhcmFtZXRlci5tb2RpZmllcnMoKTsKLSAgICAgICAgZm9yIChJRXh0ZW5kZWRNb2RpZmllciBleHRlbmRlZE1vZGlmaWVyIDogbW9kaWZpZXJzKSB7Ci0gICAgICAgICAgICBpZiAoZXh0ZW5kZWRNb2RpZmllciBpbnN0YW5jZW9mIEFubm90YXRpb24pIHsKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQW5ub3RhdGlvbikgZXh0ZW5kZWRNb2RpZmllcjsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHBhcmFtZXRlciwgYW5ub3RhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChhbm5vdGF0aW9uTmFtZS5lcXVhbHMoYUNsYXNzLmdldFNpbXBsZU5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGFubm90YXRpb25OYW1lLmVxdWFscyhhQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0VmFsdWVGb3JNZXRob2QoTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElBbm5vdGF0YWJsZSkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0VmFsdWVGb3JNZXRob2QobWV0aG9kLCAoSUFubm90YXRhYmxlKSB0cmVlVmlld2VyLmdldElucHV0KCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0cmVlVmlld2VyLmdldElucHV0KCkgaW5zdGFuY2VvZiBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRWYWx1ZUZvck1ldGhvZChtZXRob2QsIChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSB0cmVlVmlld2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW5wdXQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIE9iamVjdCBnZXRWYWx1ZUZvck1ldGhvZChNZXRob2QgbWV0aG9kLCBJQW5ub3RhdGFibGUgYW5ub3RhdGVkRWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzPD8+IHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICBJQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gYW5ub3RhdGVkRWxlbWVudC5nZXRBbm5vdGF0aW9ucygpOwotICAgICAgICBmb3IgKElBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgewotICAgICAgICAgICAgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MgPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLSAgICAgICAgICAgIFN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IGFubm90YXRpb24uZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uTmFtZS5lcXVhbHMoZGVjbGFyaW5nQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKQotICAgICAgICAgICAgICAgICAgICB8fCBhbm5vdGF0aW9uTmFtZS5lcXVhbHMoZGVjbGFyaW5nQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIElNZW1iZXJWYWx1ZVBhaXJbXSBtZW1iZXJWYWx1ZVBhaXJzID0gYW5ub3RhdGlvbi5nZXRNZW1iZXJWYWx1ZVBhaXJzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA6IG1lbWJlclZhbHVlUGFpcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXRNZW1iZXJOYW1lKCkuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoU3RyaW5nLmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuaXNFbnVtKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW51bVZhbHVlID0gbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGl0ZXJhbCA9IGVudW1WYWx1ZS5zdWJzdHJpbmcoZW51bVZhbHVlLmxhc3RJbmRleE9mKCIuIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGVudW1Db25zdGFudHMgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldEVudW1Db25zdGFudHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1Db25zdGFudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1Db25zdGFudHNbaV0udG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQ2xhc3MuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQm9vbGVhbi5UWVBFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuaXNQcmltaXRpdmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZUtpbmQoKSA9PSBJTWVtYmVyVmFsdWVQYWlyLktfQ0xBU1MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYXJyYXlWYWx1ZXMgPSAoT2JqZWN0W10pbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGFycmF5VmFsdWVzW2ldLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVZhbHVlc1tpXSA9IHZhbHVlICsgIi5jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlWYWx1ZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdFZhbHVlRm9yTWV0aG9kKHJldHVyblR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIE9iamVjdCBnZXRWYWx1ZUZvck1ldGhvZChNZXRob2QgbWV0aG9kLCBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlcikgewotICAgICAgICBDbGFzczw/PiByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gbW9kaWZpZXJzID0gcGFyYW1ldGVyLm1vZGlmaWVycygpOwotICAgICAgICBmb3IgKElFeHRlbmRlZE1vZGlmaWVyIGV4dGVuZGVkTW9kaWZpZXIgOiBtb2RpZmllcnMpIHsKLSAgICAgICAgICAgIGlmIChleHRlbmRlZE1vZGlmaWVyIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbikgewotICAgICAgICAgICAgICAgIE5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBleHRlbmRlZE1vZGlmaWVyOwotICAgICAgICAgICAgICAgIENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzID0gbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFubm90YXRpb25OYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKG5vcm1hbEFubm90YXRpb24pOwotICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uTmFtZS5lcXVhbHMoZGVjbGFyaW5nQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgYW5ub3RhdGlvbk5hbWUuZXF1YWxzKGRlY2xhcmluZ0NsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBub3JtYWxBbm5vdGF0aW9uLnZhbHVlcygpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgOiBtZW1iZXJWYWx1ZVBhaXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyLmdldE5hbWUoKS50b1N0cmluZygpLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IChTdHJpbmdMaXRlcmFsKSBtZW1iZXJWYWx1ZVBhaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZ0xpdGVyYWwuZ2V0TGl0ZXJhbFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuaXNFbnVtKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbGlmaWVkTmFtZSBlbnVtVmFsdWUgPSAoUXVhbGlmaWVkTmFtZSkgbWVtYmVyVmFsdWVQYWlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZU5hbWUgbGl0ZXJhbCA9IGVudW1WYWx1ZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBlbnVtQ29uc3RhbnRzID0gbWV0aG9kLmdldFJldHVyblR5cGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbnVtQ29uc3RhbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bUNvbnN0YW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1Db25zdGFudHNbaV0udG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbC5nZXRJZGVudGlmaWVyKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQ2xhc3MuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQm9vbGVhbi5UWVBFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuTGl0ZXJhbCBib29sZWFuTGl0ZXJhbCA9IChCb29sZWFuTGl0ZXJhbCkgbWVtYmVyVmFsdWVQYWlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBib29sZWFuTGl0ZXJhbC5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRWYWx1ZUZvck1ldGhvZChyZXR1cm5UeXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgT2JqZWN0IGdldERlZmF1bHRWYWx1ZUZvck1ldGhvZChDbGFzczw/PiByZXR1cm5UeXBlKSB7Ci0gICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQm9vbGVhbi5UWVBFKSkgewotICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldHVyblR5cGUuaXNFbnVtKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0dXJuVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0dXJuVHlwZS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10ge307Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgICAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDbGFzcykgewotICAgICAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MgPSAKLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNNYW5hZ2VyLmdldEFubm90YXRpb25EZWZpbml0aW9uRm9yQ2xhc3MoZWxlbWVudCkuZ2V0QW5ub3RhdGlvbkNsYXNzKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb25DbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFZhbHVlRm9yQ2xhc3MoYW5ub3RhdGlvbkNsYXNzLCAoQm9vbGVhbikgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kKSB7Ci0gICAgICAgICAgICAgICAgc2V0VmFsdWVGb3JNZXRob2QoKE1ldGhvZCkgZWxlbWVudCwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0gCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBzZXRWYWx1ZUZvckNsYXNzKENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MsIAotICAgICAgICAgICAgQm9vbGVhbiBhbm5vdGF0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBPYmplY3Qgdmlld2VySW5wdXQgPSB0cmVlVmlld2VyLmdldElucHV0KCk7Ci0KLSAgICAgICAgSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciBhbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgPSAKLSAgICAgICAgICAgIEFubm90YXRpb25zTWFuYWdlci5nZXRBbm5vdGF0aW9uRGVmaW5pdGlvbkZvckNsYXNzKGFubm90YXRpb25DbGFzcykuZ2V0QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAodmlld2VySW5wdXQgaW5zdGFuY2VvZiBJUGFja2FnZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICBzZXRWYWx1ZUZvckNsYXNzKGFubm90YXRpb25DbGFzcywgYW5ub3RhdGUsIChJUGFja2FnZURlY2xhcmF0aW9uKSB2aWV3ZXJJbnB1dCwgCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcik7Ci0gICAgICAgIH0gZWxzZSBpZiAodmlld2VySW5wdXQgaW5zdGFuY2VvZiBJTWVtYmVyKSB7Ci0gICAgICAgICAgICBzZXRWYWx1ZUZvckNsYXNzKGFubm90YXRpb25DbGFzcywgYW5ub3RhdGUsIChJTWVtYmVyKSB2aWV3ZXJJbnB1dCwgYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2aWV3ZXJJbnB1dCBpbnN0YW5jZW9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgIHNldFZhbHVlRm9yQ2xhc3MoYW5ub3RhdGlvbkNsYXNzLCBhbm5vdGF0ZSwgKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIHZpZXdlcklucHV0LAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBzZXRWYWx1ZUZvckNsYXNzKENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MsCi0gICAgICAgICAgICBCb29sZWFuIGFubm90YXRlLCBJUGFja2FnZURlY2xhcmF0aW9uIHBhY2thZ2VEZWNsYXJhdGlvbiwKLSAgICAgICAgICAgIElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSA9IEpEVFV0aWxzLmdldENvbXBpbGF0aW9uVW5pdEZyb21GaWxlKChJRmlsZSlwYWNrYWdlRGVjbGFyYXRpb24uZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBKRFRVdGlscy5nZXRDb21waWxhdGlvblVuaXQoc291cmNlKTsKLSAgICAgICAgCi0gICAgICAgIFBhY2thZ2VEZWNsYXJhdGlvbiBwa2dEZWNsYXJhdGlvbiA9IGNvbXBpbGF0aW9uVW5pdC5nZXRQYWNrYWdlKCk7Ci0KLSAgICAgICAgQVNUIGFzdCA9IHBrZ0RlY2xhcmF0aW9uLmdldEFTVCgpOwotICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUoYXN0KTsKLQotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYXJpcyA9IGdldE1lbWJlclZhbHVlUGFpcnMoYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLCAKLSAgICAgICAgICAgICAgICBwa2dEZWNsYXJhdGlvbiwgYXN0LCBhbm5vdGF0aW9uQ2xhc3MpOwotCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVBbm5vdGF0aW9uKGFzdCwgYW5ub3RhdGlvbkNsYXNzLCAKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhcmlzKTsKLQotICAgICAgICBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSA9IEFubm90YXRpb25VdGlscy5jcmVhdGVUZXh0RmlsZUNoYW5nZSgiQUMiLCAoSUZpbGUpIHNvdXJjZS5nZXRSZXNvdXJjZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGlmIChhbm5vdGF0ZSkgewotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb25Ub1BhY2thZ2VEZWNsYXJhdGlvbihzb3VyY2UsIHBrZ0RlY2xhcmF0aW9uLCByZXdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiwgdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLnJlbW92ZUFubm90YXRpb25Gcm9tUGFja2FnZURlY2xhcmF0aW9uKHNvdXJjZSwgcGtnRGVjbGFyYXRpb24sIHJld3JpdGVyLCAKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiwgdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEltcG9ydEVkaXQoY29tcGlsYXRpb25Vbml0LCBhbm5vdGF0aW9uQ2xhc3MsIHRleHRGaWxlQ2hhbmdlLCBhbm5vdGF0ZSk7Ci0KLSAgICAgICAgZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFZhbHVlRm9yQ2xhc3MoQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb25DbGFzcywKLSAgICAgICAgICAgIEJvb2xlYW4gYW5ub3RhdGUsIElNZW1iZXIgbWVtYmVyLCBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcikgCi0gICAgICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSA9IG1lbWJlci5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IEpEVFV0aWxzLmdldENvbXBpbGF0aW9uVW5pdChzb3VyY2UpOwotICAgICAgICBBU1QgYXN0ID0gY29tcGlsYXRpb25Vbml0LmdldEFTVCgpOwotICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUoYXN0KTsKLQotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYXJpcyA9IGdldE1lbWJlclZhbHVlUGFpcnMoYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLCBtZW1iZXIsCi0gICAgICAgICAgICAgICAgYXN0LCBhbm5vdGF0aW9uQ2xhc3MpOwotCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVBbm5vdGF0aW9uKGFzdCwgYW5ub3RhdGlvbkNsYXNzLAotICAgICAgICAgICAgICAgIGFubm90YXRpb25DbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFyaXMpOwotCi0gICAgICAgIAotICAgICAgICBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSA9IEFubm90YXRpb25VdGlscy5jcmVhdGVUZXh0RmlsZUNoYW5nZSgiQUMiLCAoSUZpbGUpIHNvdXJjZS5nZXRSZXNvdXJjZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGlmIChhbm5vdGF0ZSkgewotICAgICAgICAgICAgaWYgKG1lbWJlci5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb25Ub1R5cGUoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbiwgdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtZW1iZXIuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb25Ub01ldGhvZChzb3VyY2UsIGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoSU1ldGhvZCkgbWVtYmVyLCBhbm5vdGF0aW9uLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1lbWJlci5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5GSUVMRCkgewotICAgICAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRBbm5vdGF0aW9uVG9GaWVsZChzb3VyY2UsIGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoSUZpZWxkKSBtZW1iZXIsIGFubm90YXRpb24sIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtZW1iZXIuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTikgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1lbWJlci5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLnJlbW92ZUFubm90YXRpb25Gcm9tVHlwZShzb3VyY2UsIGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb24sIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWVtYmVyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCkgewotICAgICAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5yZW1vdmVBbm5vdGF0aW9uRnJvbU1ldGhvZChzb3VyY2UsIGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoSU1ldGhvZCkgbWVtYmVyLCBhbm5vdGF0aW9uLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1lbWJlci5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5GSUVMRCkgewotICAgICAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5yZW1vdmVBbm5vdGF0aW9uRnJvbUZpZWxkKHNvdXJjZSwgY29tcGlsYXRpb25Vbml0LCByZXdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIChJRmllbGQpIG1lbWJlciwgYW5ub3RhdGlvbiwgdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkSW1wb3J0RWRpdChjb21waWxhdGlvblVuaXQsIGFubm90YXRpb25DbGFzcywgdGV4dEZpbGVDaGFuZ2UsIGFubm90YXRlKTsKLQotICAgICAgICBleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKTsKLSAgICB9Ci0gIAotICAgIHByaXZhdGUgdm9pZCBzZXRWYWx1ZUZvckNsYXNzKENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MsCi0gICAgICAgICAgICBCb29sZWFuIGFubm90YXRlLCBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciwgCi0gICAgICAgICAgICBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJVGV4dEVkaXRvciB0eHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLSAgICAgICAgICAgICAgICAuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICBJRmlsZSBmaWxlID0gKChJRmlsZUVkaXRvcklucHV0KSB0eHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpOwotICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSA9IEpEVFV0aWxzLmdldENvbXBpbGF0aW9uVW5pdEZyb21GaWxlKGZpbGUpOwotCi0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBKRFRVdGlscy5nZXRDb21waWxhdGlvblVuaXQoc291cmNlKTsKLSAgICAgICAgQVNUIGFzdCA9IHBhcmFtZXRlci5nZXRBU1QoKTsKLSAgICAgICAgQVNUUmV3cml0ZSByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKGFzdCk7Ci0KLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFyaXMgPSBnZXRNZW1iZXJWYWx1ZVBhaXJzKGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciwgCi0gICAgICAgICAgICAgICAgcGFyYW1ldGVyLCBhc3QsIGFubm90YXRpb25DbGFzcyk7Ci0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUFubm90YXRpb24oYXN0LCBhbm5vdGF0aW9uQ2xhc3MsCi0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYXJpcyk7Ci0KLSAgICAgICAgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UgPSBBbm5vdGF0aW9uVXRpbHMuY3JlYXRlVGV4dEZpbGVDaGFuZ2UoIkFDIiwgKElGaWxlKSBzb3VyY2UuZ2V0UmVzb3VyY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBpZiAoYW5ub3RhdGUpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRBbm5vdGF0aW9uVG9NZXRob2RQYXJhbWV0ZXIoc291cmNlLCByZXdyaXRlciwgcGFyYW1ldGVyLCBhbm5vdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMucmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2RQYXJhbWV0ZXIoc291cmNlLCByZXdyaXRlciwgcGFyYW1ldGVyLCBhbm5vdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgIH0KLSAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEltcG9ydEVkaXQoY29tcGlsYXRpb25Vbml0LCBhbm5vdGF0aW9uQ2xhc3MsIHRleHRGaWxlQ2hhbmdlLCBhbm5vdGF0ZSk7Ci0KLSAgICAgICAgZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IGdldE1lbWJlclZhbHVlUGFpcnMoCi0gICAgICAgICAgICBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciwgQVNUTm9kZSBhc3ROb2RlLCBBU1QgYXN0LCAKLSAgICAgICAgICAgIENsYXNzPD9leHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgewotICAgICAgICBpZiAoYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuZ2V0TWVtYmVyVmFsdWVQYWlycyhhc3ROb2RlLCBhc3QsIGFubm90YXRpb25DbGFzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBnZXRNZW1iZXJWYWx1ZVBhaXJzKAotICAgICAgICAgICAgSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciBhbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIsIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgQVNUIGFzdCwgCi0gICAgICAgICAgICBDbGFzczw/ZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmdldE1lbWJlclZhbHVlUGFpcnMoamF2YUVsZW1lbnQsIGFzdCwgYW5ub3RhdGlvbkNsYXNzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgc2V0VmFsdWVGb3JNZXRob2QoTWV0aG9kIG1ldGhvZCwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICgoKEJvb2xlYW4pIGdldFZhbHVlKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpKSkuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgIE9iamVjdCB2aWV3ZXJJbnB1dCA9IHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKTsKLSAgICAgICAgICAgIGlmICh2aWV3ZXJJbnB1dCBpbnN0YW5jZW9mIElBbm5vdGF0YWJsZSkgewotICAgICAgICAgICAgICAgIHNldFZhbHVlRm9yTWV0aG9kKG1ldGhvZCwgdmFsdWUsIChJSmF2YUVsZW1lbnQpIHZpZXdlcklucHV0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHJlZVZpZXdlci5nZXRJbnB1dCgpIGluc3RhbmNlb2YgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIHNldFZhbHVlRm9yTWV0aG9kKG1ldGhvZCwgdmFsdWUsIChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSB0cmVlVmlld2VyLmdldElucHV0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXRGb3JUeXBlKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBlbGVtZW50VHlwZSA9IGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCk7Ci0gICAgICAgIGlmIChlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgewotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSlqYXZhRWxlbWVudC5nZXRQcmltYXJ5RWxlbWVudCgpOwotICAgICAgICAgICAgcmV0dXJuIHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVsZW1lbnRUeXBlID09IElKYXZhRWxlbWVudC5NRVRIT0QpIHsKLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpamF2YUVsZW1lbnQuZ2V0UHJpbWFyeUVsZW1lbnQoKTsKLSAgICAgICAgICAgIHJldHVybiBtZXRob2QuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVsZW1lbnRUeXBlID09IElKYXZhRWxlbWVudC5GSUVMRCkgewotICAgICAgICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZClqYXZhRWxlbWVudC5nZXRQcmltYXJ5RWxlbWVudCgpOwotICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmdldENvbXBpbGF0aW9uVW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTikgeyAKLSAgICAgICAgCUlQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2wgPSAoSVBhY2thZ2VEZWNsYXJhdGlvbilqYXZhRWxlbWVudDsKLSAgICAgICAgCXJldHVybiAoSUNvbXBpbGF0aW9uVW5pdClwYWNrYWdlRGVjbC5nZXRQYXJlbnQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSkRUVXRpbHMuZ2V0Q29tcGlsYXRpb25Vbml0RnJvbUZpbGUoKElGaWxlKWphdmFFbGVtZW50LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0VmFsdWVGb3JNZXRob2QoTWV0aG9kIG1ldGhvZCwgT2JqZWN0IHZhbHVlLCBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXRGb3JUeXBlKGphdmFFbGVtZW50KTsgICAgICAgIAotICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gSkRUVXRpbHMuZ2V0Q29tcGlsYXRpb25Vbml0KHNvdXJjZSk7Ci0gICAgICAgIEFTVCBhc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0QVNUKCk7Ci0gICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShhc3QpOwotCi0gICAgICAgIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlID0gQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVRleHRGaWxlQ2hhbmdlKCJBQyIsIChJRmlsZSkgc291cmNlLmdldFJlc291cmNlKCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgSUFubm90YXRhYmxlIGFubm90YXRlZEVsZW1lbnQgPSAoSUFubm90YXRhYmxlKSBqYXZhRWxlbWVudDsKLSAgICAgICAgSUFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IGFubm90YXRlZEVsZW1lbnQuZ2V0QW5ub3RhdGlvbnMoKTsKLSAgICAgICAgZm9yIChJQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgICAgIENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzID0gbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBhbm5vdGF0aW9uLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbk5hbWUuZXF1YWxzKGRlY2xhcmluZ0NsYXNzLmdldFNpbXBsZU5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgYW5ub3RhdGlvbk5hbWUuZXF1YWxzKGRlY2xhcmluZ0NsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBJTWVtYmVyVmFsdWVQYWlyW10gbWVtYmVyVmFsdWVQYWlycyA9IGFubm90YXRpb24uZ2V0TWVtYmVyVmFsdWVQYWlycygpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzTWVtYmVyVmFsdWVQYWlyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChJTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA6IG1lbWJlclZhbHVlUGFpcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXRNZW1iZXJOYW1lKCkuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBU1ROb2RlIG1lbWJlclZhbHVlID0gZ2V0TWVtYmVyVmFsdWVQYWlyVmFsdWUoYXN0LCBtZXRob2QsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLnVwZGF0ZU1lbWJlclZhbHVlUGFpclZhbHVlKHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsIGphdmFFbGVtZW50LCBhbm5vdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlyLCBtZW1iZXJWYWx1ZSwgdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc01lbWJlclZhbHVlUGFpciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFoYXNNZW1iZXJWYWx1ZVBhaXIpIHsKLSAgICAgICAgICAgICAgICAgICAgQVNUTm9kZSBtZW1iZXJWYWx1ZVBhaXIgPSBnZXRNZW1iZXJWYWx1ZVBhaXIoYXN0LCBtZXRob2QsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkTWVtYmVyVmFsdWVQYWlyVG9Bbm5vdGF0aW9uKHNvdXJjZSwgY29tcGlsYXRpb25Vbml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJld3JpdGVyLCBqYXZhRWxlbWVudCwgYW5ub3RhdGlvbiwgbWVtYmVyVmFsdWVQYWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpOwotICAgIH0KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIHZvaWQgc2V0VmFsdWVGb3JNZXRob2QoTWV0aG9kIG1ldGhvZCwgT2JqZWN0IHZhbHVlLCBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlcikgCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElUZXh0RWRpdG9yIHR4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotICAgICAgICAgICAgICAgIC5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgIElGaWxlIGZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpIHR4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0gICAgICAgIElDb21waWxhdGlvblVuaXQgc291cmNlID0gSkRUVXRpbHMuZ2V0Q29tcGlsYXRpb25Vbml0RnJvbUZpbGUoZmlsZSk7Ci0KLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IEpEVFV0aWxzLmdldENvbXBpbGF0aW9uVW5pdChzb3VyY2UpOwotICAgICAgICBBU1QgYXN0ID0gcGFyYW1ldGVyLmdldEFTVCgpOwotICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUoYXN0KTsKLQotICAgICAgICBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSA9IEFubm90YXRpb25VdGlscy5jcmVhdGVUZXh0RmlsZUNoYW5nZSgiQUMiLCAoSUZpbGUpIHNvdXJjZS5nZXRSZXNvdXJjZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IG1vZGlmaWVycyA9IHBhcmFtZXRlci5tb2RpZmllcnMoKTsKLSAgICAgICAgZm9yIChJRXh0ZW5kZWRNb2RpZmllciBleHRlbmRlZE1vZGlmaWVyIDogbW9kaWZpZXJzKSB7Ci0gICAgICAgICAgICBpZiAoZXh0ZW5kZWRNb2RpZmllciBpbnN0YW5jZW9mIE5vcm1hbEFubm90YXRpb24pIHsKLSAgICAgICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZXh0ZW5kZWRNb2RpZmllcjsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUobm9ybWFsQW5ub3RhdGlvbik7Ci0gICAgICAgICAgICAgICAgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MgPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLSAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbk5hbWUuZXF1YWxzKGRlY2xhcmluZ0NsYXNzLmdldFNpbXBsZU5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGFubm90YXRpb25OYW1lLmVxdWFscyhkZWNsYXJpbmdDbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbm9ybWFsQW5ub3RhdGlvbi52YWx1ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNNZW1iZXJWYWx1ZVBhaXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyIDogbWVtYmVyVmFsdWVQYWlycykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXROYW1lKCkudG9TdHJpbmcoKS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1ROb2RlIG1lbWJlclZhbHVlID0gZ2V0TWVtYmVyVmFsdWVQYWlyVmFsdWUoYXN0LCBtZXRob2QsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMudXBkYXRlTWVtYmVyVmFsdWVQYWlyVmFsdWUoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbEFubm90YXRpb24sIG1lbWJlclZhbHVlUGFpciwgbWVtYmVyVmFsdWUsIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzTWVtYmVyVmFsdWVQYWlyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaGFzTWVtYmVyVmFsdWVQYWlyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBU1ROb2RlIG1lbWJlclZhbHVlUGFpciA9IGdldE1lbWJlclZhbHVlUGFpcihhc3QsIG1ldGhvZCwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZE1lbWJlclZhbHVlUGFpclRvQW5ub3RhdGlvbihzb3VyY2UsIGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxBbm5vdGF0aW9uLCBtZW1iZXJWYWx1ZVBhaXIsIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFTVE5vZGUgZ2V0TWVtYmVyVmFsdWVQYWlyVmFsdWUoQVNUIGFzdCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIENsYXNzPD8+IHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoU3RyaW5nLmNsYXNzKSkgewotICAgICAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdMaXRlcmFsKGFzdCwgdmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKEJvb2xlYW4uVFlQRSkpIHsKLSAgICAgICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlQm9vbGVhbkxpdGVyYWwoYXN0LCAoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldHVyblR5cGUuaXNQcmltaXRpdmUoKQotICAgICAgICAgICAgICAgICYmIChyZXR1cm5UeXBlLmVxdWFscyhCeXRlLlRZUEUpIHx8IHJldHVyblR5cGUuZXF1YWxzKFNob3J0LlRZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCByZXR1cm5UeXBlLmVxdWFscyhJbnRlZ2VyLlRZUEUpIHx8IHJldHVyblR5cGUuZXF1YWxzKExvbmcuVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJldHVyblR5cGUuZXF1YWxzKEZsb2F0LlRZUEUpIHx8IHJldHVyblR5cGUuZXF1YWxzKERvdWJsZS5UWVBFKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTnVtYmVyTGl0ZXJhbChhc3QsIHZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXR1cm5UeXBlLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVBcnJheVZhbHVlTGl0ZXJhbChhc3QsIG1ldGhvZCwgKE9iamVjdFtdKSB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhDbGFzcy5jbGFzcykpIHsKLSAgICAgICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlVHlwZUxpdGVyYWwoYXN0LCB2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHJldHVyblR5cGUuaXNFbnVtKCkpIHsKLSAgICAgICAgICAgIGludCBzZWxlY3RlZCA9ICgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1MaXRlcmFsKGFzdCwgbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRFbnVtQ29uc3RhbnRzKClbc2VsZWN0ZWRdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFTVE5vZGUgZ2V0TWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIE1ldGhvZCBtZXRob2QsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBDbGFzczw/PiByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKFN0cmluZy5jbGFzcykpIHsKLSAgICAgICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgbWV0aG9kLmdldE5hbWUoKSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhCb29sZWFuLlRZUEUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUJvb2xlYW5NZW1iZXJWYWx1ZVBhaXIoYXN0LCBtZXRob2QuZ2V0TmFtZSgpLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldHVyblR5cGUuaXNQcmltaXRpdmUoKQotICAgICAgICAgICAgICAgICYmIChyZXR1cm5UeXBlLmVxdWFscyhCeXRlLlRZUEUpIHx8IHJldHVyblR5cGUuZXF1YWxzKFNob3J0LlRZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCByZXR1cm5UeXBlLmVxdWFscyhJbnRlZ2VyLlRZUEUpIHx8IHJldHVyblR5cGUuZXF1YWxzKExvbmcuVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJldHVyblR5cGUuZXF1YWxzKEZsb2F0LlRZUEUpIHx8IHJldHVyblR5cGUuZXF1YWxzKERvdWJsZS5UWVBFKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTnVtYmVyTWVtYmVyVmFsdWVQYWlyKGFzdCwgbWV0aG9kLmdldE5hbWUoKSwgdmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldHVyblR5cGUuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUFycmF5TWVtYmVyVmFsdWVQYWlyKGFzdCwgbWV0aG9kLCAoT2JqZWN0W10pIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKENsYXNzLmNsYXNzKSkgewotICAgICAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVUeXBlTWVtYmVyVmFsdWVQYWlyKGFzdCwgbWV0aG9kLmdldE5hbWUoKSwgdmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmV0dXJuVHlwZS5pc0VudW0oKSkgewotICAgICAgICAgICAgaW50IHNlbGVjdGVkID0gKChJbnRlZ2VyKSB2YWx1ZSkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPSAtMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsIAotICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCksIG1ldGhvZC5nZXROYW1lKCksIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbnVtQ29uc3RhbnRzKClbc2VsZWN0ZWRdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIENoYW5nZSBjaGFuZ2UpIHsKLSAgICAgICAgaWYgKGNoYW5nZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJVW5kb01hbmFnZXIgbWFuYWdlcj0gUmVmYWN0b3JpbmdDb3JlLmdldFVuZG9NYW5hZ2VyKCk7Ci0gICAgICAgIGJvb2xlYW4gc3VjY2Vzc2Z1bCA9IGZhbHNlOwotICAgICAgICBDaGFuZ2UgdW5kb0NoYW5nZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjaGFuZ2UuaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKG1vbml0b3IpOwotICAgICAgICAgICAgUmVmYWN0b3JpbmdTdGF0dXMgdmFsaWQgPSBjaGFuZ2UuaXNWYWxpZChtb25pdG9yKTsKLSAgICAgICAgICAgIGlmICh2YWxpZC5pc09LKCkpIHsKLSAgICAgICAgICAgICAgICBtYW5hZ2VyLmFib3V0VG9QZXJmb3JtQ2hhbmdlKGNoYW5nZSk7Ci0gICAgICAgICAgICAgICAgdW5kb0NoYW5nZSA9IGNoYW5nZS5wZXJmb3JtKG1vbml0b3IpOwotICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWwgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtYW5hZ2VyLmNoYW5nZVBlcmZvcm1lZChjaGFuZ2UsIHN1Y2Nlc3NmdWwpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1bmRvQ2hhbmdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHVuZG9DaGFuZ2UuaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKG1vbml0b3IpOwotICAgICAgICAgICAgbWFuYWdlci5hZGRVbmRvKHVuZG9DaGFuZ2UuZ2V0TmFtZSgpLCB1bmRvQ2hhbmdlKTsKLSAgICAgICAgfQotICAgICAgICBhbm5vdGF0aW9uc1ZpZXcucmVmcmVzaCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvdmlld3MvQW5ub3RhdGlvbnNWaWV3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYmM3M2ViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvdmlld3MvQW5ub3RhdGlvbnNWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS52aWV3czsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFjdGlvbnMuQW5ub3RhdGlvbnNWaWV3RmlsdGVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS53aWRnZXRzLkNsYXNzcGF0aENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTnVsbFNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXIyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25zVmlldyBleHRlbmRzIFZpZXdQYXJ0IGltcGxlbWVudHMgSU51bGxTZWxlY3Rpb25MaXN0ZW5lciwgSVBhcnRMaXN0ZW5lcjIgewotICAgIHByaXZhdGUgUGFnZUJvb2sgcGFnZUJvb2s7Ci0gICAgcHJpdmF0ZSBUcmVlIGFubm90YXRpb25UcmVlOwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbm90QXZhaWFibGVDb21wb3NpdGU7Ci0gICAgcHJpdmF0ZSBDbGFzc3BhdGhDb21wb3NpdGUgc2V0dXBDbGFzc3BhdGhDb21wb3NpdGU7Ci0gICAgCi0JcHJpdmF0ZSBUcmVlVmlld2VyIGFubm90YXRpb25UcmVlVmlld2VyOwotCQotCXByaXZhdGUgSU1lbWVudG8gbWVtZW50bzsKLQkKLQlwcml2YXRlIEFubm90YXRpb25zVmlld0ZpbHRlckFjdGlvbiBhbm5vdGF0aW9uc1ZpZXdGaWx0ZXJBY3Rpb247Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbnNWaWV3KCkgewotCX0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2socGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIAotICAgICAgICBhbm5vdGF0aW9uVHJlZSA9IG5ldyBUcmVlKHBhZ2VCb29rLCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTAotICAgICAgICAgICAgICAgIHwgU1dULkhfU0NST0xMKTsKLSAgICAgICAgYW5ub3RhdGlvblRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihhbm5vdGF0aW9uVHJlZSk7Ci0JCQotCQlhbm5vdGF0aW9uVHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFubm90YXRpb25zVmlld0NvbnRlbnRQcm92aWRlcigpKTsKLQkJYW5ub3RhdGlvblRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCWFubm90YXRpb25UcmVlVmlld2VyLmdldFRyZWUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCQotCQlUcmVlVmlld2VyQ29sdW1uIGFubm90YXRpb25zVmlld2VyQ29sdW1uID0gbmV3IFRyZWVWaWV3ZXJDb2x1bW4oYW5ub3RhdGlvblRyZWVWaWV3ZXIsIFNXVC5OT05FKTsKLQkJYW5ub3RhdGlvbnNWaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQW5ub3RhdGlvbnNDb2x1bW5MYWJlbFByb3ZpZGVyKCkpOwotCQlUcmVlQ29sdW1uIGFubm90YXRpb25zQ29sdW1uID0gYW5ub3RhdGlvbnNWaWV3ZXJDb2x1bW4uZ2V0Q29sdW1uKCk7Ci0JCWFubm90YXRpb25zQ29sdW1uLnNldFdpZHRoKDQwMCk7Ci0gICAgICAgIGFubm90YXRpb25zQ29sdW1uLnNldE1vdmVhYmxlKGZhbHNlKTsKLSAgICAgICAgYW5ub3RhdGlvbnNDb2x1bW4uc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuQU5OT1RBVElPTlNfVklFV19BTk5PVEFUSU9OU19DT0xVTU5fTkFNRSk7Ci0gICAgICAgIAotICAgICAgICBUcmVlVmlld2VyQ29sdW1uIHZhbHVlc1ZpZXdlckNvbHVtbiA9IG5ldyBUcmVlVmlld2VyQ29sdW1uKGFubm90YXRpb25UcmVlVmlld2VyLCBTV1QuTk9ORSk7Ci0gICAgICAgIHZhbHVlc1ZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBbm5vdGF0aW9uc1ZhbHVlc0NvbHVtbkxhYmVsUHJvdmlkZXIoYW5ub3RhdGlvblRyZWVWaWV3ZXIpKTsKLSAgICAgICAgdmFsdWVzVmlld2VyQ29sdW1uLnNldEVkaXRpbmdTdXBwb3J0KG5ldyBBbm5vdGF0aW9uc1ZhbHVlc0VkaXRpbmdTdXBwb3J0KHRoaXMsIGFubm90YXRpb25UcmVlVmlld2VyKSk7Ci0gICAgICAgIFRyZWVDb2x1bW4gdmFsdWVzQ29sdW1uID0gdmFsdWVzVmlld2VyQ29sdW1uLmdldENvbHVtbigpOyAKLQkJdmFsdWVzQ29sdW1uLnNldFdpZHRoKDQwMCk7Ci0JCXZhbHVlc0NvbHVtbi5zZXRNb3ZlYWJsZShmYWxzZSk7Ci0JCXZhbHVlc0NvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCQl2YWx1ZXNDb2x1bW4uc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuQU5OT1RBVElPTlNfVklFV19BTk5PVEFUSU9OU19WQUxVRVNfQ09MVU1OX05BTUUpOwotCQkKLQkJLy9TZWxlY3Rpb24gU2VydmljZQotCQlzdGFydExpc3RlbmluZ0ZvclNlbGVjdGlvbkNoYW5nZXMoKTsKLQkJLy9QYXJ0IFNlcnZpY2UKLQkJZ2V0Vmlld1NpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLmFkZFBhcnRMaXN0ZW5lcih0aGlzKTsKLQkJCi0JCWNvbnRyaWJ1dGVUb0FjdGlvbkJhcnMoKTsKLQkJCi0JCW5vdEF2YWlhYmxlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYWdlQm9vaywgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlub3RBdmFpYWJsZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCW5vdEF2YWlhYmxlQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlub3RBdmFpYWJsZUNvbXBvc2l0ZS5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKG5vdEF2YWlhYmxlQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldEJhY2tncm91bmQocGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLQkJbGFiZWwuc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuQU5OT1RBVElPTlNfVklFV19BTk5PVEFUSU9OU19OT1RfQVZBSUxBQkxFX09OX1NFTEVDVElPTik7Ci0JCQotCQlhbm5vdGF0aW9uVHJlZVZpZXdlci5zZXRDb21wYXJhdG9yKG5ldyBWaWV3ZXJDb21wYXJhdG9yKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9iajEsIE9iamVjdCBvYmoyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9iajEgaW5zdGFuY2VvZiBDbGFzczw/PikgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIEFubm90YXRpb25zTWFuYWdlci5nZXRBbm5vdGF0aW9uRGVmaW5pdGlvbkZvckNsYXNzKG9iajEpLmdldEFubm90YXRpb25DbGFzc05hbWUoKS4KLSAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlVG8oQW5ub3RhdGlvbnNNYW5hZ2VyLmdldEFubm90YXRpb25EZWZpbml0aW9uRm9yQ2xhc3Mob2JqMikuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uQ2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob2JqMSBpbnN0YW5jZW9mIE1ldGhvZCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChNZXRob2Qpb2JqMSkuZ2V0TmFtZSgpLmNvbXBhcmVUbygoKE1ldGhvZClvYmoyKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIG9iajEsIG9iajIpOwotICAgICAgICAgICAgfQotCQl9KTsKLQkJCi0JCS8vVE9ETyBBZGQgYSBGYWNldGVkIFByb2plY3QgY29tcG9zaXRlCi0JCXNldHVwQ2xhc3NwYXRoQ29tcG9zaXRlID0gbmV3IENsYXNzcGF0aENvbXBvc2l0ZShwYWdlQm9vaywgU1dULk5PTkUpOwotCi0JCXBhZ2VCb29rLnNob3dQYWdlKG5vdEF2YWlhYmxlQ29tcG9zaXRlKTsKLQl9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0TGlzdGVuaW5nRm9yU2VsZWN0aW9uQ2hhbmdlcygpIHsKLSAgICAgICAgZ2V0Vmlld1NpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuYWRkUG9zdFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgc3RvcExpc3RlbmluZ0ZvclNlbGVjdGlvbkNoYW5nZXMoKSB7Ci0gICAgICAgIGdldFZpZXdTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2VsZWN0aW9uU2VydmljZSgpLnJlbW92ZVBvc3RTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gZ2V0Vmlld1NpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgPSB3b3JrYmVuY2hQYWdlLmdldEFjdGl2ZVBhcnRSZWZlcmVuY2UoKTsKLSAgICAgICAKLSAgICAgICAgaWYgKHdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgPT0gbnVsbCB8fCB3b3JrYmVuY2hQYXJ0UmVmZXJlbmNlLmdldElkKCkuZXF1YWxzKGdldFZpZXdTaXRlKCkuZ2V0SWQoKSkgCi0gICAgICAgICAgICAgICAgfHwgIXdvcmtiZW5jaFBhcnRSZWZlcmVuY2UuZ2V0SWQoKS5lcXVhbHMoSmF2YVVJLklEX0NVX0VESVRPUikpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hQYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCi0gICAgICAgIElGaWxlRWRpdG9ySW5wdXQgZmlsZUVkaXRvcklucHV0ID0gKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKTsKLQotICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikgewotICAgICAgICAgICAgSVRleHRTZWxlY3Rpb24gdHh0U2VsZWN0aW9uID0gKFRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLSAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gSkRUVXRpbHMuZ2V0Q29tcGlsYXRpb25Vbml0RnJvbUZpbGUoZmlsZUVkaXRvcklucHV0LmdldEZpbGUoKSk7Ci0gICAgICAgICAgICBpZiAoY29tcGlsYXRpb25Vbml0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVWaWV3KGNvbXBpbGF0aW9uVW5pdCwgdHh0U2VsZWN0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZVZpZXcoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0gICAgICAgIFRyZWVQYXRoW10gZXhwYW5kZWRUcmVlUGF0aHMgPSBhbm5vdGF0aW9uVHJlZVZpZXdlci5nZXRFeHBhbmRlZFRyZWVQYXRocygpOwotCi0gICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGphdmFFbGVtZW50LmdldEphdmFQcm9qZWN0KCk7Ci0KLSAgICAgICAgaWYgKCFjaGVja0NsYXNzcGF0aChqYXZhUHJvamVjdCkpIHsKLSAgICAgICAgICAgIGFubm90YXRpb25UcmVlVmlld2VyLnNldElucHV0KG51bGwpOwotICAgICAgICAgICAgcGFnZUJvb2suc2hvd1BhZ2Uoc2V0dXBDbGFzc3BhdGhDb21wb3NpdGUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcGFnZUJvb2suc2hvd1BhZ2UoYW5ub3RhdGlvblRyZWUpOwotCi0JICAgIGludCBvZmZzZXQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBudWxsOwotICAgICAgICAgICAgaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KWphdmFFbGVtZW50OwotICAgICAgICAgICAgICAgIGphdmFFbGVtZW50ID0gY29tcGlsYXRpb25Vbml0LmdldEVsZW1lbnRBdChvZmZzZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgICAgIGlmIChqYXZhRWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTikgewotICAgICAgICAgICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKS5lcXVhbHMoInBhY2thZ2UtaW5mby5qYXZhIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVHJlZVZpZXdlci5zZXRJbnB1dCgoSVBhY2thZ2VEZWNsYXJhdGlvbikgamF2YUVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25UcmVlVmlld2VyLnNldElucHV0KG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LklNUE9SVF9ERUNMQVJBVElPTikgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25UcmVlVmlld2VyLnNldElucHV0KG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgewotICAgICAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKCF0eXBlLmlzTWVtYmVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblRyZWVWaWV3ZXIuc2V0SW5wdXQodHlwZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblRyZWVWaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkZJRUxEKSB7Ci0gICAgICAgICAgICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZClqYXZhRWxlbWVudDsKLSAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmdldERlY2xhcmluZ1R5cGUoKS5pc01lbWJlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25UcmVlVmlld2VyLnNldElucHV0KGZpZWxkKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVHJlZVZpZXdlci5zZXRJbnB1dChudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpIHsKLSAgICAgICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBqYXZhRWxlbWVudDsKLSAgICAgICAgICAgICAgICBpZiAoIW1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCkuaXNNZW1iZXIoKSkgewotICAgICAgICAgICAgICAgICAgICBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA9IEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXRob2RQYXJhbWV0ZXIobnVsbCwgbWV0aG9kLCBvZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25UcmVlVmlld2VyLnNldElucHV0KHBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVHJlZVZpZXdlci5zZXRJbnB1dChtZXRob2QpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblRyZWVWaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYW5ub3RhdGlvblRyZWVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBhbm5vdGF0aW9uVHJlZVZpZXdlci5zZXRFeHBhbmRlZFRyZWVQYXRocyhleHBhbmRlZFRyZWVQYXRocyk7Ci0JfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0NsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgY2F0ZWdvcmllcy5hZGRBbGwoQW5ub3RhdGlvbnNNYW5hZ2VyLmdldEFubm90YXRpb25DYXRlZ29yaWVzKCkpOwotICAgICAgICBWaWV3ZXJGaWx0ZXJbXSB2aWV3ZXJGaWx0ZXJzID0gYW5ub3RhdGlvblRyZWVWaWV3ZXIuZ2V0RmlsdGVycygpOwotICAgICAgICBmb3IgKFZpZXdlckZpbHRlciB2aWV3ZXJGaWx0ZXIgOiB2aWV3ZXJGaWx0ZXJzKSB7Ci0gICAgICAgICAgIGlmICh2aWV3ZXJGaWx0ZXIgaW5zdGFuY2VvZiBBbm5vdGF0aW9uc1ZpZXdDYXRlZ29yeUZpbHRlcikgewotICAgICAgICAgICAgICAgY2F0ZWdvcmllcy5yZW1vdmVBbGwoKChBbm5vdGF0aW9uc1ZpZXdDYXRlZ29yeUZpbHRlcil2aWV3ZXJGaWx0ZXIpLmdldENhdGVnb3JpZXMoKSk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gandzUmVhZHkgPSB0cnVlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgY2F0ZWdvcnkgOiBjYXRlZ29yaWVzKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvbkRlZmluaXRpb25zID0gQW5ub3RhdGlvbnNNYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbnNCeUNhdGVnb3J5KGNhdGVnb3J5KTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gYW5ub3RhdGlvbkRlZmluaXRpb25zLmdldCgwKS5nZXRBbm5vdGF0aW9uQ2xhc3NOYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGphdmFQcm9qZWN0LmZpbmRUeXBlKGNsYXNzTmFtZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBqd3NSZWFkeSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBzZXR1cENsYXNzcGF0aENvbXBvc2l0ZS51cGRhdGVMaWJyYXJ5TGFiZWwoY2F0ZWdvcnkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGp3c1JlYWR5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotICAgICAgICBJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hQYXJ0ID0gcGFydFJlZi5nZXRQYXJ0KGZhbHNlKTsKLSAgICAgICAgaWYgKHBhcnRSZWYuZ2V0SWQoKS5lcXVhbHMoSmF2YVVJLklEX0NVX0VESVRPUikpIHsKLSAgICAgICAgICAgIGphdmFFZGl0b3JBY3RpdmF0ZWQoKElFZGl0b3JQYXJ0KSB3b3JrYmVuY2hQYXJ0KTsKLSAgICAgICAgfSBlbHNlIGlmIChwYXJ0UmVmLmdldElkKCkuZXF1YWxzKGdldFZpZXdTaXRlKCkuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgIGFubm90YXRpb25zVmlld0FjdGl2YXRlZCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2xlYXJBbm5vdGF0aW9uc1ZpZXcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFydFZpc2libGUoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotICAgICAgICBpZiAocGFydFJlZi5nZXRJZCgpLmVxdWFscyhnZXRWaWV3U2l0ZSgpLmdldElkKCkpKSB7Ci0gICAgICAgICAgICBzdGFydExpc3RlbmluZ0ZvclNlbGVjdGlvbkNoYW5nZXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnRIaWRkZW4oSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotICAgICAgICBpZiAocGFydFJlZi5nZXRJZCgpLmVxdWFscyhnZXRWaWV3U2l0ZSgpLmdldElkKCkpKSB7Ci0gICAgICAgICAgICBzdG9wTGlzdGVuaW5nRm9yU2VsZWN0aW9uQ2hhbmdlcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0gICAgICAgIGlmIChwYXJ0UmVmLmdldElkKCkuZXF1YWxzKEphdmFVSS5JRF9DVV9FRElUT1IpKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0Vmlld1NpdGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBnZXRWaWV3U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICAgICAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtiZW5jaFBhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlZGl0b3JQYXJ0ID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEoZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFJREUuZ2V0RWRpdG9yRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JQYXJ0LmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKSkuZ2V0SWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKEphdmFVSS5JRF9DVV9FRElUT1IpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyQW5ub3RhdGlvbnNWaWV3KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2cocGllLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFydElucHV0Q2hhbmdlZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0gICAgfQotCQotCXByaXZhdGUgdm9pZCBjbGVhckFubm90YXRpb25zVmlldygpIHsKLSAgICAgICAgYW5ub3RhdGlvblRyZWVWaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0gICAgICAgIGFubm90YXRpb25UcmVlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgcGFnZUJvb2suc2hvd1BhZ2Uobm90QXZhaWFibGVDb21wb3NpdGUpOyAgICAgICAgICAgICAgICAKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGphdmFFZGl0b3JBY3RpdmF0ZWQoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkgewotICAgICAgICBJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3JQYXJ0OwotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gKElKYXZhRWxlbWVudCkgZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpLmdldEFkYXB0ZXIoSUphdmFFbGVtZW50LmNsYXNzKTsKLSAgICAgICAgaWYgKGphdmFFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhZ2VCb29rLnNob3dQYWdlKGFubm90YXRpb25UcmVlKTsKLSAgICAgICAgICAgIHVwZGF0ZVZpZXcoamF2YUVsZW1lbnQsIChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKTsKLSAgICAgICAgICAgIHNlbGVjdGlvbkNoYW5nZWQoZWRpdG9yUGFydCwgc2VsZWN0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhbm5vdGF0aW9uc1ZpZXdBY3RpdmF0ZWQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gZ2V0Vmlld1NpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgICAgICBpZiAoZWRpdG9yUGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgICAgIGlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgSUZpbGUgZmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpLmdldEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yRGVzY3JpcHRvciA9IElERS5nZXRFZGl0b3JEZXNjcmlwdG9yKGZpbGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdG9yRGVzY3JpcHRvci5nZXRJZCgpLmVxdWFscyhKYXZhVUkuSURfQ1VfRURJVE9SKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YUVkaXRvckFjdGl2YXRlZChlZGl0b3JQYXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhwaWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotCQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgc3RvcExpc3RlbmluZ0ZvclNlbGVjdGlvbkNoYW5nZXMoKTsKLSAgICAgICAgZ2V0Vmlld1NpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdChJVmlld1NpdGUgc2l0ZSwgSU1lbWVudG8gbWVtZW50bykgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuaW5pdChzaXRlLCBtZW1lbnRvKTsKLSAgICAgICAgdGhpcy5tZW1lbnRvID0gbWVtZW50bzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotICAgICAgICBzdXBlci5zYXZlU3RhdGUobWVtZW50byk7Ci0gICAgICAgIGFubm90YXRpb25zVmlld0ZpbHRlckFjdGlvbi5zYXZlU3RhdGUobWVtZW50byk7Ci0gICAgfQotCi0JcHJpdmF0ZSB2b2lkIGNvbnRyaWJ1dGVUb0FjdGlvbkJhcnMoKSB7Ci0JCUlBY3Rpb25CYXJzIGJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJZmlsbExvY2FsUHVsbERvd24oYmFycy5nZXRNZW51TWFuYWdlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlsbExvY2FsUHVsbERvd24oSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkgICAgYW5ub3RhdGlvbnNWaWV3RmlsdGVyQWN0aW9uID0gbmV3IEFubm90YXRpb25zVmlld0ZpbHRlckFjdGlvbih0aGlzLCBhbm5vdGF0aW9uVHJlZVZpZXdlciwKLQkgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuQU5OT1RBVElPTlNfVklFV19GSUxURVJfQUNUSU9OX05BTUUpOwotCSAgICBpZiAobWVtZW50byAhPSBudWxsKSB7Ci0JICAgICAgICBhbm5vdGF0aW9uc1ZpZXdGaWx0ZXJBY3Rpb24uaW5pdChtZW1lbnRvKTsKLQkgICAgfQotCSAgICBtYW5hZ2VyLmFkZChhbm5vdGF0aW9uc1ZpZXdGaWx0ZXJBY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFBhc3NpbmcgdGhlIGZvY3VzIHJlcXVlc3QgdG8gdGhlIHZpZXdlcidzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWFubm90YXRpb25UcmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRGb2N1cygpOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBhbm5vdGF0aW9uVHJlZVZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpOwotICAgICAgICBpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICBkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICAgICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoUGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlZGl0b3JQYXJ0ICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBJREUuZ2V0RWRpdG9yRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpKS5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhKYXZhVUkuSURfQ1VfRURJVE9SKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUZXh0RWRpdG9yIHR4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgd29ya2JlbmNoUGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRmlsZUVkaXRvcklucHV0IGZpbGVFZGl0b3JJbnB1dCA9IChJRmlsZUVkaXRvcklucHV0KSB0eHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gSkRUVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb21waWxhdGlvblVuaXRGcm9tRmlsZShmaWxlRWRpdG9ySW5wdXQuZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGlsYXRpb25Vbml0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21waWxhdGlvblVuaXQuaXNDb25zaXN0ZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdC5tYWtlQ29uc2lzdGVudChuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVWaWV3KGNvbXBpbGF0aW9uVW5pdCwgKElUZXh0U2VsZWN0aW9uKSB0eHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKHBpZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zVmlld0NhdGVnb3J5RmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zVmlld0NhdGVnb3J5RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMWI4OTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS92aWV3cy9Bbm5vdGF0aW9uc1ZpZXdDYXRlZ29yeUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS52aWV3czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNWaWV3Q2F0ZWdvcnlGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0FURUdPUlkgPSAiQW5ub3RhdGlvbkNhdGVnb3J5RmlsdGVySW5mbyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NBVEVHT1JZX05BTUUgPSAiY2F0ZWdvcnlOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBBbm5vdGF0aW9uc1ZpZXcgYW5ub3RhdGlvbnNWaWV3OwotICAgIHByaXZhdGUgZmluYWwgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXI7Ci0KLSAgICBwcml2YXRlIExpc3Q8T2JqZWN0PiBjYXRlZ29yaWVzOwotICAgIAotICAgIHB1YmxpYyBBbm5vdGF0aW9uc1ZpZXdDYXRlZ29yeUZpbHRlcihBbm5vdGF0aW9uc1ZpZXcgYW5ub3RhdGlvbnNWaWV3LCBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgewotICAgICAgICB0aGlzLmFubm90YXRpb25zVmlldyA9IGFubm90YXRpb25zVmlldzsKLSAgICAgICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0gICAgICAgIGNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENsYXNzKSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA9IEFubm90YXRpb25zTWFuYWdlci4KLSAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uRGVmaW5pdGlvbkZvckNsYXNzKGVsZW1lbnQpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb25EZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIWNhdGVnb3JpZXMuY29udGFpbnMoYW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0Q2F0ZWdvcnkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmlsdGVyQW5ub3RhdGlvbnMoTGlzdDxPYmplY3Q+IGNhdGVnb3JpZXMpIHsKLSAgICAgICAgdGhpcy5jYXRlZ29yaWVzID0gY2F0ZWdvcmllczsKLSAgICAgICAgaWYgKGNhdGVnb3JpZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgdmlld2VyLmFkZEZpbHRlcih0aGlzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZpZXdlci5yZW1vdmVGaWx0ZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgYW5ub3RhdGlvbnNWaWV3LnJlZnJlc2goKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3Q8T2JqZWN0PiBnZXRDYXRlZ29yaWVzKCkgewotICAgICAgICByZXR1cm4gY2F0ZWdvcmllczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgaW5pdChJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIElNZW1lbnRvIGNhdE1lbWVudG8gPSBtZW1lbnRvLmdldENoaWxkKFRBR19DQVRFR09SWSk7Ci0gICAgICAgIGlmIChjYXRNZW1lbnRvID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFubm90YXRpb25zTWFuYWdlci5nZXRBbm5vdGF0aW9uQ2F0ZWdvcmllcygpLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2F0ZWdvcnkgPSBjYXRNZW1lbnRvLmdldFN0cmluZyhUQUdfQ0FURUdPUllfTkFNRSArIGkpOwotICAgICAgICAgICAgaWYgKGNhdGVnb3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYXRlZ29yaWVzLmFkZChjYXRlZ29yeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmlsdGVyQW5ub3RhdGlvbnMoY2F0ZWdvcmllcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIGlmIChjYXRlZ29yaWVzID09IG51bGwgfHwgY2F0ZWdvcmllcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIElNZW1lbnRvIGNhdE1lbWVudG8gPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKFRBR19DQVRFR09SWSk7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgZm9yIChPYmplY3QgY2F0ZWdvcnkgOiBjYXRlZ29yaWVzKSB7Ci0gICAgICAgICAgICBjYXRNZW1lbnRvLnB1dFN0cmluZyhUQUdfQ0FURUdPUllfTkFNRSArIGksIGNhdGVnb3J5LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvdmlld3MvQW5ub3RhdGlvbnNWaWV3Q29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zVmlld0NvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OWUyZjFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvdmlld3MvQW5ub3RhdGlvbnNWaWV3Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS52aWV3czsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zTWFuYWdlcjsNCi0NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNWaWV3Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgew0KLQ0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsNCi0JICAgIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ2xhc3MpIHsNCi0JICAgICAgICByZXR1cm4gKChDbGFzczw/PilwYXJlbnRFbGVtZW50KS5nZXREZWNsYXJlZE1ldGhvZHMoKTsNCi0JICAgIH0NCi0JCXJldHVybiBuZXcgT2JqZWN0W10ge307DQotCX0NCi0NCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7DQotCSAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENsYXNzKSB7DQotCSAgICAgICAgcmV0dXJuICgoQ2xhc3M8Pz4pZWxlbWVudCkuZ2V0RGVjbGFyZWRNZXRob2RzKCkubGVuZ3RoID4gMDsNCi0JICAgIH0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgew0KLQkgICAgaWYgKGlucHV0RWxlbWVudCAhPSBudWxsKSB7DQotCSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zTWFuYWdlci5nZXRBbm5vdGF0aW9ucyhpbnB1dEVsZW1lbnQpOw0KLQkgICAgfQ0KLQkgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7fTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCi0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0NsYXNzRGlhbG9nQ2VsbEVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS92aWV3cy9DbGFzc0RpYWxvZ0NlbGxFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJlNzg2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0NsYXNzRGlhbG9nQ2VsbEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EaWFsb2dDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLQotcHVibGljIGNsYXNzIENsYXNzRGlhbG9nQ2VsbEVkaXRvciBleHRlbmRzIERpYWxvZ0NlbGxFZGl0b3IgewotCi0gICAgcHVibGljIENsYXNzRGlhbG9nQ2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IG9wZW5EaWFsb2dCb3goQ29udHJvbCBjZWxsRWRpdG9yV2luZG93KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gSmF2YVVJLmNyZWF0ZVR5cGVEaWFsb2coY2VsbEVkaXRvcldpbmRvdy5nZXRTaGVsbCgpLCAKLSAgICAgICAgICAgICAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKSwgCi0gICAgICAgICAgICAgICAgICAgIFNlYXJjaEVuZ2luZS5jcmVhdGVXb3Jrc3BhY2VTY29wZSgpLCBJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFUywgCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlLCAiKiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0W10gdHlwZXMgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHR5cGVzICE9IG51bGwgJiYgdHlwZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKXR5cGVzWzBdOwotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0JpbmFyeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udGVudHMoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnZXREZWZhdWx0TGFiZWwoKS5zZXRUZXh0KHZhbHVlLnRvU3RyaW5nKCkgKyAiLmNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdldERlZmF1bHRMYWJlbCgpLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3dpZGdldHMvQ2xhc3NwYXRoQ29tcG9zaXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3dpZGdldHMvQ2xhc3NwYXRoQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZGViYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS93aWRnZXRzL0NsYXNzcGF0aENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBKUkVfUFJFRl9QQUdFX0lEID0gIm9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5wcmVmZXJlbmNlcy5WTVByZWZlcmVuY2VQYWdlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgU3RyaW5nIFBST1BfSUQgPSAib3JnLmVjbGlwc2UuamR0LnVpLnByb3BlcnR5UGFnZXMuQnVpbGRQYXRoc1Byb3BlcnR5UGFnZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIE9iamVjdCBEQVRBX1JFVkVBTF9FTlRSWSA9ICJzZWxlY3RfY2xhc3NwYXRoX2VudHJ5IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBMYWJlbCBpbmZvcm1hdGlvbkxhYmVsOwotICAgIAotICAgIHB1YmxpYyBDbGFzc3BhdGhDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgc3R5bGUpOwotICAgICAgICBhZGRDb250cm9scygpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRDb250cm9scygpIHsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIHRoaXMuc2V0QmFja2dyb3VuZChnZXRQYXJlbnQoKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0gICAgICAgIGluZm9ybWF0aW9uTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotICAgICAgICBpbmZvcm1hdGlvbkxhYmVsLnNldEJhY2tncm91bmQoZ2V0UGFyZW50KCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotICAgICAgICBpbmZvcm1hdGlvbkxhYmVsLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkFOTk9UQVRJT05TX1ZJRVdfTk9fU1VJVEFCTEVfTElCUkFSWV9GT1VORCwgIkpBWC1XUyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBMaW5rIGxpbmsgPSBuZXcgTGluayh0aGlzLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxpbmsuc2V0QmFja2dyb3VuZChnZXRQYXJlbnQoKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0gICAgICAgIGxpbmsuc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuQ09ORklHVVJFX0pBVkFfMV82X0xJQlJBUlkpOwotICAgICAgICBsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2VsZWN0aW9uRXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uRXZlbnQudGV4dC5lcXVhbHMoIjEiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwgSlJFX1BSRUZfUEFHRV9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBKUkVfUFJFRl9QQUdFX0lEIH0sIG51bGwpLm9wZW4oKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBNYXA8T2JqZWN0LCBJQ2xhc3NwYXRoRW50cnk+IGRhdGEgPSBuZXcgSGFzaE1hcDxPYmplY3QsIElDbGFzc3BhdGhFbnRyeT4oKTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YS5wdXQoREFUQV9SRVZFQUxfRU5UUlksIEphdmFSdW50aW1lLmdldERlZmF1bHRKUkVDb250YWluZXJFbnRyeSgpKTsKLSAgICAgICAgICAgICAgICAgICAgUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByb3BlcnR5RGlhbG9nT24oZ2V0U2hlbGwoKSwgZ2V0UHJvamVjdCgpLCBQUk9QX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IFBST1BfSUQgfSwgZGF0YSkub3BlbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIC8vVE9ETyB1cGRhdGUgdGhlIGxhYmVscyB0byBwcm92aWRlIGluZm9ybWF0aW9uIGZvciBzdXBwb3J0ZWQgYW5ub3RhdGlvbiBsaWJyYXJpZXMgdGhhdCBhcmUgbWlzc2luZwotICAgICAgICAvL29uIHRoZSBzZWxlY3RlZCBwcm9qZWN0cyBjbGFzc3BhdGguCi0gICAgICAgIC8vTGFiZWwgb3RoZXJMaWJyYXJpZXNMYWJlbCAgPSBuZXcgTGFiZWwodGhpcywgU1dULlNIQURPV19JTik7Ci0gICAgICAgIC8vb3RoZXJMaWJyYXJpZXNMYWJlbC5zZXRCYWNrZ3JvdW5kKGdldFBhcmVudCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLSAgICAgICAgLy9vdGhlckxpYnJhcmllc0xhYmVsLnNldFRleHQoIkFubm90YXRpb24gTGlicmFyaWVzIGN1cnJlbnRseSBzdXBwb3J0ZWQ6ICIgKyBBbm5vdGF0aW9uc01hbmFnZXIuZ2V0QW5ub3RhdGlvbkNhdGVnb3JpZXMoKSk7Ci0gICAgICAgIC8vb3RoZXJMaWJyYXJpZXNMYWJlbC5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5BTk5PVEFUSU9OU19WSUVXX09USEVSX0FOTk9UQVRJT05fTElCUkFSSUVTX1VTRSk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiAoKEZpbGVFZGl0b3JJbnB1dCkgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkKLSAgICAgICAgICAgICAgICAuZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpLmdldFByb2plY3QoKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgdXBkYXRlTGlicmFyeUxhYmVsKFN0cmluZyBsaWJyYXJ5TmFtZSkgewotICAgICAgICBpbmZvcm1hdGlvbkxhYmVsLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkFOTk9UQVRJT05TX1ZJRVdfTk9fU1VJVEFCTEVfTElCUkFSWV9GT1VORCwgbGlicmFyeU5hbWUpKTsKLSAgICB9Ci0gICAgCi0gfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMWE0MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2E5OTA5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlsczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlMDQ4NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jTW9uIEp1bCAyMCAxNToyNTozMSBFRVNUIDIwMDkNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1MTI1M2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wDQotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMA0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscztzaW5nbGV0b246PXRydWUNCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyDQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41DQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsDQotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLA0KLSBvcmcuZWNsaXBzZS50ZXh0LA0KLSBvcmcuZWNsaXBzZS51aSwNCi0gb3JnLmVjbGlwc2UudWkuaWRlLA0KLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSwNCi0gb3JnLmFwYWNoZS5heGlzDQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuY2xhenosDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5kb20udmFsaWRhdGlvbiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmV4Y2VwdGlvbiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmZhY2V0cywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC50ZXh0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMiLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcw0KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5wbHVnaW4uSmF4d3NVdGlsc1BsdWdpbg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDEwYWZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXVndXN0IDE1LCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhYWUyNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXA0KLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTRiNDBkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1CdW5kbGUtTmFtZS4wPVV0aWxzUGx1Z2luIChJbmN1YmF0aW9uKQ0KLUJ1bmRsZS1WZW5kb3IuMD1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDI5MzA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjQiPz4NCi08IS0tDQotICAgIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gICANCi0gICAgQ29udHJpYnV0b3JzOg0KLSAgICAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIC0tPg0KLQ0KLTxwbHVnaW4+DQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5zdGFydHVwIj4NCi0gICAgICA8c3RhcnR1cD48L3N0YXJ0dXA+DQotICAgPC9leHRlbnNpb24+DQotDQotPC9wbHVnaW4+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9Db250cmFjdENoZWNrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvQ29udHJhY3RDaGVja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmMTNiOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9Db250cmFjdENoZWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlsczsNCi0NCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7DQotDQotLyoqDQotICogQ29udGFpbnMgY2hlY2tzIGZyZXF1ZW50bHkgYXBwbGllZCBvbiBwYXJhbWV0ZXJzLg0KLSAqIA0KLSAqIEBhdXRob3IgSm9lcmcgRGVobWVsDQotICovDQotcHVibGljIGZpbmFsIGNsYXNzIENvbnRyYWN0Q2hlY2tlcg0KLXsNCi0JcHJpdmF0ZSBDb250cmFjdENoZWNrZXIoKQ0KLQl7DQotCQkvLyBwcmV2ZW50IGluc3RhbnRpYXRpb24gZnJvbSBvdXRzaWRlDQotCX0NCi0JDQotCS8qKiBDaGVja3MgaWYgdGhlIGdpdmVuIHBhcmFtZXRlciB2YWx1ZSBpcyBudWxsIGFuZCByZXBvcnRzIGFuIDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPg0KLQkgKiBpbiB0aGlzIGNhc2UuDQotCSAqIEBwYXJhbSBwYXJhbVZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjaGVja2VkDQotCSAqIEBwYXJhbSBwYXJhbU5hbWUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLCB1c2VkIHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB0aGUgdXNlcg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHRocm93biBlaXRoZXIgdGhlIHBhcmFtVmFsdWUgb3IgcGFyYW1OYW1lIGlzIG51bGwgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIG51bGxDaGVja1BhcmFtKGZpbmFsIE9iamVjdCBwYXJhbVZhbHVlLCBmaW5hbCBTdHJpbmcgcGFyYW1OYW1lKQ0KLQl7DQotCQlpZiAocGFyYW1OYW1lID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwYXJhbU5hbWUgbXVzdCBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkIA0KLQkJfQ0KLQkJaWYgKHBhcmFtVmFsdWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24ocGFyYW1OYW1lICsgIiBtdXN0IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQgDQotCQl9DQotCX0NCi0JDQotCS8qKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gcGFyYW1ldGVyIHZhbHVlIGlzIG51bGwgYW5kIHJlcG9ydHMgYW4gPGNvZGU+TnVsbFBvaW50ZXJFeGNlcHRpb248L2NvZGU+DQotCSAqIGluIHRoaXMgY2FzZS4NCi0JICogQHBhcmFtIHBhcmFtVmFsdWUgdGhlIHZhbHVlIHRvIGJlIGNoZWNrZWQNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIHBhcmFtVmFsdWUgaXMgbnVsbCAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbnVsbENoZWNrUGFyYW0oZmluYWwgT2JqZWN0IHBhcmFtVmFsdWUpDQotCXsNCi0JCWlmIChwYXJhbVZhbHVlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwYXJhbVZhbHVlIG11c3Qgbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQl9DQotCQ0KLQkvKiogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmaWVsZCB2YWx1ZSBpcyBudWxsIGFuZCByZXBvcnRzIGFuIDxjb2RlPklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjwvY29kZT4NCi0JICogaW4gdGhpcyBjYXNlLg0KLQkgKiBAcGFyYW0gZmllbGRWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgY2hlY2tlZA0KLQkgKiBAcGFyYW0gZmllbGROYW1lIG5hbWUgb2YgdGhlIGZpZWxkLCB1c2VkIHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB0aGUgdXNlcg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHRocm93biBpZiB0aGUgZmllbGROYW1lIGlzIG51bGwNCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBmaWVsZFZhbHVlIGlzIG51bGwgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIG51bGxDaGVja0ZpZWxkKGZpbmFsIE9iamVjdCBmaWVsZFZhbHVlLCBmaW5hbCBTdHJpbmcgZmllbGROYW1lKQ0KLQl7DQotCQlpZiAoZmllbGROYW1lID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJmaWVsZE5hbWUgbXVzdCBub3QgYmUgbnVsbCIpOyAgLy8kTk9OLU5MUy0xJCAgDQotCQl9DQotCQlpZiAoZmllbGRWYWx1ZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZmllbGROYW1lICsgIiBtdXN0IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQgDQotCQl9DQotCX0NCi0JDQotCS8qKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gZmllbGQgdmFsdWUgaXMgbnVsbCBhbmQgcmVwb3J0cyBhbiA8Y29kZT5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L2NvZGU+DQotCSAqIGluIHRoaXMgY2FzZS4NCi0JICogQHBhcmFtIGZpZWxkVmFsdWUgdGhlIHZhbHVlIHRvIGJlIGNoZWNrZWQNCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBmaWVsZFZhbHVlIGlzIG51bGwgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIG51bGxDaGVja0ZpZWxkKGZpbmFsIE9iamVjdCBmaWVsZFZhbHVlKQ0KLQl7DQotCQlpZiAoZmllbGRWYWx1ZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImZpZWxkVmFsdWUgbXVzdCBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0JDQotCS8qKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgb2YgYSBsb2NhbCB2YXJpYWJsZSBpcyBudWxsIGFuZCByZXBvcnRzIGFuIDxjb2RlPklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjwvY29kZT4NCi0JICogaW4gdGhpcyBjYXNlLg0KLQkgKiBAcGFyYW0gdmFyVmFsdWUgdGhlIHZhbHVlIHRvIGJlIGNoZWNrZWQNCi0JICogQHBhcmFtIHZhck5hbWUgbmFtZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUsIHVzZWQgdG8gcmVwb3J0IHRoZSBwcm9ibGVtIHRvIHRoZSB1c2VyDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gdGhyb3duIGlmIHRoZSB2YXJOYW1lIGlzIG51bGwNCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gdGhyb3duIGlmIHRoZSB2YXJWYWx1ZSBpcyBudWxsICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBudWxsQ2hlY2tWYXJpYWJsZShmaW5hbCBPYmplY3QgdmFyVmFsdWUsIGZpbmFsIFN0cmluZyB2YXJOYW1lKQ0KLQl7DQotCQlpZiAodmFyTmFtZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidmFyTmFtZSBtdXN0IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQgDQotCQl9DQotCQlpZiAodmFyVmFsdWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHZhck5hbWUgKyAiIG11c3Qgbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQl9DQotCQ0KLQkvKiogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIG9mIGEgbG9jYWwgdmFyaWFibGUgaXMgbnVsbCBhbmQgcmVwb3J0cyBhbiA8Y29kZT5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L2NvZGU+DQotCSAqIGluIHRoaXMgY2FzZS4NCi0JICogQHBhcmFtIHZhclZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjaGVja2VkDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHRocm93biBpZiB0aGUgdmFyVmFsdWUgaXMgbnVsbCAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbnVsbENoZWNrVmFyaWFibGUoZmluYWwgT2JqZWN0IHZhclZhbHVlKQ0KLQl7DQotCQlpZiAodmFyVmFsdWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ2YXJWYWx1ZSBtdXN0IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiA8Y29kZT5wYXJhbTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgZW1wdHkgc3RyaW5nLg0KLQkgKiBAcGFyYW0gcGFyYW0NCi0JICogQHBhcmFtIHZhck5hbWUNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPnBhcmFtPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPnBhcmFtPC9jb2RlPiBpcyBlbXB0eSBzdHJpbmcgb3IgY29udGFpbnMgb25seQ0KLQkgKiB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZW1wdHlTdHJpbmdDaGVja1BhcmFtKGZpbmFsIFN0cmluZyBwYXJhbSwgZmluYWwgU3RyaW5nIHZhck5hbWUpIA0KLQl7DQotCQludWxsQ2hlY2tQYXJhbShwYXJhbSwgdmFyTmFtZSk7DQotCQkNCi0JCWlmIChwYXJhbS50cmltKCkubGVuZ3RoKCkgPT0gMCkgew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoIlBhcmFtZXRlciB7MH0gaXMgZW1wdHkgc3RyaW5nIG9yIGNvbnRhaW5zIG9ubHkgd2hpdGUgc3BhY2VzIiwgdmFyTmFtZSkpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9KYXhXc1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL0pheFdzVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWVkZGU3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL0pheFdzVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlsczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotDQotLyoqDQotICogVXRpbGl0eSB0aGF0IGNvbnRhaW5zIEpBWC1XUyByZWxlYXRlZCBmdW5jdGlvbmFsaXR5DQotICogDQotICogQGF1dGhvciBEYW5haWwgQnJhbmVrb3YNCi0gKiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgSmF4V3NVdGlscw0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFQU5fU1VGRklYID0gIkJlYW4iOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX1NVRkZJWCA9ICJQb3J0IjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9TVUZGSVggPSAiU2VydmljZSI7IC8vJE5PTi1OTFMtMSQNCi0JDQotCXByaXZhdGUgSmF4V3NVdGlscygpDQotCXsNCi0JCS8vIGhpZGUgZGVmYXVsdCBjb25zdHJ1Y3Rvcg0KLQl9DQotDQotCS8qKg0KLQkgKiBBbiB1dGlsaXR5IG1ldGhvZCBmb3IgY29tcG9zaW5nIGEgZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlIGZvciBKYXhXcyBjdXN0b21pemF0aW9uDQotCSAqIG91dCBvZiBhIHBhY2thZ2UgbmFtZS4NCi0JICogQWxnb3JpdGhtOg0KLQkgKiA8bGk+SW4gY2FzZSB0aGUgcGFja2FnZSBoYXMgMCBmcmFnbWVudCAoZGVmYXVsdCBwYWNrYWdlKSB0aGUgcmVzdWx0IHdvdWxkIGJlIGh0dHA6Ly8vPC9saT4NCi0JICogPGxpPkluIGNhc2UgdGhlIHBhY2thZ2UgaGFzIDEgZnJhZ21lbnQgdGhlIHJlc3VsdCB3b3VsZCBiZSBodHRwOi8vZnJhZ21lbnQxLzwvbGk+DQotCSAqIDxsaT5JbiBjYXNlIHRoZSBwYWNrYWdlIGhhcyAyIGZyYWdtZW50cyB0aGUgcmVzdWx0IHdvdWxkIGJlIGh0dHA6Ly9mcmFnbWVudDIuZnJhZ21lbnQxLzwvbGk+DQotCSAqIDxsaT5JbiBjYXNlIHRoZSBwYWNrYWdlIGhhcyBtb3JlIHRoYW4gMiBmcmFnbWVudHMgdGhlIHJlc3VsdCB3b3VsZCBiZSBodHRwOi8vZnJhZ21lbnQyLmZyYWdtZW50MS9mcmFnbWVudDMvZnJhZ21lbnQ0Ly4uLi9mcmFnbWVudG4vPC9saT4NCi0JICogQHBhcmFtIHBhY2thZ2VOYW1lIE5hbWUgb2YgdGhlIHBhY2thZ2UNCi0JICogQHJldHVybiB0aGUgY29tcG9zZWQgbmFtZXNwYWNlDQotCSAqIEB0aG9yd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBwYWNrYWdlIG5hbWUgc3BlY2lmaWVkIGlzIG51bGwNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpDQotCXsNCi0JCWlmKHBhY2thZ2VOYW1lID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJQYWNrYWdlIG5hbWUgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlTdHJpbmdbXSBwa2dGcmFnbWVudHMgPSBwYWNrYWdlTmFtZS5zcGxpdCgiXFwuIik7IC8vJE5PTi1OTFMtMSQNCi0JCQ0KLQkJaWYocGtnRnJhZ21lbnRzLmxlbmd0aCA+IDEpDQotCQl7DQotCQkJLy8gcmV2ZXJzZSB0aGUgZmlyc3QgdHdvIGZyYWdtZW50cyBpbiBjYXNlIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gZnJhZ21lbnRzIGF2YWlsYWJsZQ0KLQkJCVN0cmluZyBmcmFnMCA9IHBrZ0ZyYWdtZW50c1swXTsNCi0JCQlwa2dGcmFnbWVudHNbMF0gPSBwa2dGcmFnbWVudHNbMV07DQotCQkJcGtnRnJhZ21lbnRzWzFdID0gZnJhZzA7DQotCQl9DQotCQkNCi0JCVN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoImh0dHA6Ly8iKTsgLy8kTk9OLU5MUy0xJA0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwa2dGcmFnbWVudHMubGVuZ3RoOyBpKyspDQotCQl7DQotCQkJcmVzdWx0LmFwcGVuZChwa2dGcmFnbWVudHNbaV0pOw0KLQkJCXJlc3VsdC5hcHBlbmQoaT09MCAmJiBwa2dGcmFnbWVudHMubGVuZ3RoPjEgPyAiLiIgOiAiLyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogU2FtZSBhcyBjb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2UoKSBidXQgZmlyc3QgZXh0cmFjdHMgdGhlIHBhY2thZ2Ugb3V0IG9mIGNsYXNzDQotCSAqIGZ1bGx5IHF1YWxpZmllZCBuYW1lDQotCSAqIEBwYXJhbSBmcU5hbWUgdGhlIGNsYXNzIGZ1bGx5IHF1YWxpZmllZCBuYW1lDQotCSAqIEByZXR1cm4gY2FsY3VsYXRlZCB0YXJnZXQgbmFtZXNwYWNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeUZRTmFtZShTdHJpbmcgZnFOYW1lKQ0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZnFOYW1lLCAiZnFOYW1lIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJldHVybiBjb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2UoZXh0cmFjdFBhY2thZ2UoZnFOYW1lKSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBQb3J0VHlwZSBuYW1lIGZyb20gdGhlIDxjb2RlPmVuZHBvaW50VHlwZTwvY29kZT4gYW5kIDxjb2RlPnNlaU5hbWU8L2NvZGU+Lg0KLQkgKiBAcGFyYW0gZW5kcG9pbnQgY2xhc3MuDQotCSAqIEBwYXJhbSBzZWlOYW1lDQotCSAqIEByZXR1cm4gUG9ydFR5cGUgbmFtZSBmb3IgdGhlIEBXZWJTZXJ2aWNlIGFubm90YXRpb24sIHRoZSBuYW1lIG9mIHRoZSA8Y29kZT5lbmRwb2ludFR5cGU8L2NvZGU+IHdpdGggdGhlICJQb3J0IiBzdWZmaXguDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiA8Y29kZT5lbmRwb2ludFR5cGU8L2NvZGU+IHNwZWNpZmllZCBpcyBudWxsLg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UG9ydHR5cGVOYW1lKElUeXBlIGVuZHBvaW50VHlwZSwgU3RyaW5nIHNlaU5hbWUpDQotCXsNCi0JCWlmKGVuZHBvaW50VHlwZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZW5kcG9pbnRUeXBlIGNvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlpZihzZWlOYW1lICE9IG51bGwgJiYgc2VpTmFtZS5sZW5ndGgoKSA+IDApDQotCQl7DQotCQkJcmV0dXJuIHNlaU5hbWU7DQotCQl9DQotCQkNCi0JCXJldHVybiByZW1vdmVCZWFuU3VmZml4SWZSZXF1aXJlZChlbmRwb2ludFR5cGUuZ2V0RWxlbWVudE5hbWUoKSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZW1vdmVzIHRoZSAiQmVhbiIgc3VmZml4IGZyb20gdGhlIDxjb2RlPmVuZHBvaW50VHlwZTwvY29kZT4gaW4gY2FzZSBpdCBpcyBwcmVzZW50IGFuZCBnZW5lcmF0ZXMgU2VydmljZSBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIElUeXBlLg0KLQkgKiBAcGFyYW0gZW5kcG9pbnQgY2xhc3MuDQotCSAqIEByZXR1cm4gU2VydmljZSBuYW1lIGZvciB0aGUgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbiwgdGhlIG5hbWUgb2YgdGhlIDxjb2RlPmVuZHBvaW50VHlwZTwvY29kZT4gd2l0aG91dCB0aGUgIkJlYW4iIHN1ZmZpeCBhbmQgPGNvZGU+IlNlcnZpY2UiPC9jb2RlPiBhdCB0aGUgZW5kLg0KLQkgKiBJbiBjYXNlIHRoZSBuYW1lIG9mIHRoZSA8Y29kZT5lbmRwb2ludFR5cGU8L2NvZGU+IGVxdWFscyAiQmVhbiIgdGhlbiB0aGUgb3JpZ2luYWwgbmFtZSBpcyByZXR1cm5lZCB3aXRoIDxjb2RlPiJTZXJ2aWNlIjwvY29kZT4gYXRlIHRoZSBlbmQuDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiA8Y29kZT5lbmRwb2ludFR5cGU8L2NvZGU+IHNwZWNpZmllZCBpcyBudWxsDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZShmaW5hbCBJVHlwZSBlbmRwb2ludFR5cGUpDQotCXsNCi0JCWlmKGVuZHBvaW50VHlwZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZW5kcG9pbnRUeXBlIGNvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkNCi0JCXJldHVybiByZW1vdmVCZWFuU3VmZml4SWZSZXF1aXJlZChlbmRwb2ludFR5cGUuZ2V0RWxlbWVudE5hbWUoKSkgKyBTRVJWSUNFX1NVRkZJWDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmVtb3ZlcyB0aGUgIkJlYW4iIHN1ZmZpeCBmcm9tIHRoZSBlbmRwb2ludCBuYW1lIGluIGNhc2UgaXQgaXMgcHJlc2VudC4gIA0KLQkgKiBAcGFyYW0gZW5kcG9pbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBlbmRwb2ludA0KLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBlbmRwb2ludCB3aXRob3V0IHRoZSAiQmVhbiIgc3VmZml4LiBJbiBjYXNlIHRoZSBuYW1lIG9mIHRoZSBlbmRwb2ludCBlcXVhbHMgIkJlYW4iIHRoZW4gdGhlIG9yaWdpbmFsIG5hbWUgaXMgcmV0dXJuZWQNCi0JICovDQotCXByaXZhdGUgc3RhdGljIFN0cmluZyByZW1vdmVCZWFuU3VmZml4SWZSZXF1aXJlZChmaW5hbCBTdHJpbmcgZW5kcG9pbnROYW1lKQ0KLQl7DQotCQlhc3NlcnQgZW5kcG9pbnROYW1lICE9IG51bGwgJiYgZW5kcG9pbnROYW1lLmxlbmd0aCgpID4gMDsNCi0JCQ0KLQkJaWYoZW5kcG9pbnROYW1lLmVxdWFscyhCRUFOX1NVRkZJWCkpDQotCQl7DQotCQkJcmV0dXJuIGVuZHBvaW50TmFtZTsNCi0JCX0NCi0JCQ0KLQkJaWYoZW5kcG9pbnROYW1lLmVuZHNXaXRoKEJFQU5fU1VGRklYKSkNCi0JCXsNCi0JCQlyZXR1cm4gZW5kcG9pbnROYW1lLnN1YnN0cmluZygwLCBlbmRwb2ludE5hbWUubGFzdEluZGV4T2YoQkVBTl9TVUZGSVgpKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGVuZHBvaW50TmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgUG9ydCBuYW1lIGZyb20gdGhlIDxjb2RlPmVuZHBvaW50VHlwZTwvY29kZT4uDQotCSAqIEBwYXJhbSBlbmRwb2ludCBjbGFzcy4NCi0JICogQHJldHVybiBQb3J0IG5hbWUgZm9yIHRoZSBAV2ViU2VydmljZSBhbm5vdGF0aW9uLCB0aGUgbmFtZSBvZiB0aGUgPGNvZGU+ZW5kcG9pbnRUeXBlPC9jb2RlPiB3aXRoIHRoZSAiUG9ydCIgc3VmZml4Lg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gPGNvZGU+ZW5kcG9pbnRUeXBlPC9jb2RlPiBzcGVjaWZpZWQgaXMgbnVsbC4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBvcnROYW1lKGZpbmFsIElUeXBlIGVuZHBvaW50VHlwZSkNCi0Jew0KLQkJcmV0dXJuIGdldERlZmF1bHRQb3J0TmFtZShlbmRwb2ludFR5cGUuZ2V0RWxlbWVudE5hbWUoKSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHNlcnZpY2UgbmFtZSBjYWxjdWxhdGVkIGFzIHRoZSBzcGVjaWZpY2F0aW9uIHN0YXRlcy4NCi0JICogQHBhcmFtIGZxTmFtZQ0KLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHNlcnZpY2UgbmFtZQ0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+ZW5kcG9pbnRUeXBlPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFNlcnZpY2VOYW1lKGZpbmFsIFN0cmluZyBmcU5hbWUpDQotCXsNCi0JCWlmKGZxTmFtZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZW5kcG9pbnRUeXBlIGNvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkNCi0JCXJldHVybiBleHRyYWN0U2hvcnROYW1lKGZxTmFtZSkgKyBTRVJWSUNFX1NVRkZJWDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgd3NkbDpwb3J0VHlwZSBuYW1lIGRlZmluZWQgYXMgSkFYLVdTIHNwZWNpZmljYXRpb24gc3RhdGVzLiANCi0JICogQHBhcmFtIGZxTmFtZQ0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0UG9ydHR5cGVOYW1lKGZpbmFsIFN0cmluZyBmcU5hbWUpDQotCXsNCi0JCWlmKGZxTmFtZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZnFOYW1lIGNvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkNCi0JCXJldHVybiBleHRyYWN0U2hvcnROYW1lKGZxTmFtZSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgbmFtZSBmb3IgYSB3c2RsOnBvcnQgZGVmaW5lZCBhcyBKQVgtV1Mgc3BlY2lmaWNhdGlvbiBzdGF0ZXMgDQotCSAqIEBwYXJhbSBmcU5hbWUNCi0JICogQHJldHVybiB0aGUgY2FsY3VsYXRlZCBuYW1lDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0UG9ydE5hbWUoZmluYWwgU3RyaW5nIGZxTmFtZSkNCi0Jew0KLQkJaWYoZnFOYW1lID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJmcU5hbWUgY291bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBleHRyYWN0U2hvcnROYW1lKGZxTmFtZSkgKyBQT1JUX1NVRkZJWDsNCi0JfQkNCi0JDQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBleHRyYWN0U2hvcnROYW1lKFN0cmluZyBmcU5hbWUpIA0KLQl7DQotCQlpbnQgcG9zID0gZnFOYW1lLmxhc3RJbmRleE9mKCcuJyk7DQotCQlpZiAocG9zID09LTEgKSB7DQotCQkJcmV0dXJuIGZxTmFtZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZxTmFtZS5zdWJzdHJpbmcocG9zKzEpOw0KLQl9DQotCQ0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXh0cmFjdFBhY2thZ2UoZmluYWwgU3RyaW5nIGZxTmFtZSkgDQotCXsNCi0JCWludCBwb3MgPSBmcU5hbWUubGFzdEluZGV4T2YoJy4nKTsNCi0JCWlmIChwb3MgPT0tMSApIHsNCi0JCQlyZXR1cm4gZnFOYW1lOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZnFOYW1lLnN1YnN0cmluZygwLCBwb3MpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvU3RhdHVzVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvU3RhdHVzVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTM3NzlhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL1N0YXR1c1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotDQotDQotLyoqDQotICogQ29udmVuaWVuY2UgbWV0aG9kcyB0byBtYW5hZ2Ugc3RhdHVzIG9iamVjdHMuDQotICogDQotICogQGF1dGhvciBKb2VyZyBEZWhtZWwNCi0gKi8NCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RhdHVzVXRpbHMNCi17DQotCXByaXZhdGUgU3RhdHVzVXRpbHMoKQ0KLQl7DQotCQkvLyBubyBpbnN0YW50aWF0aW9uDQotCX0NCi0JDQotCS8qKg0KLQkgKiBGaW5kcyB0aGUgbW9zdCBzZXZlcmUgc3RhdHVzIGZyb20gYSBhcnJheSBvZiBzdGF0aS4NCi0JICogQW4gZXJyb3IgaXMgbW9yZSBzZXZlcmUgdGhhbiBhIHdhcm5pbmcsIGFuZCBhIHdhcm5pbmcgaXMgbW9yZSBzZXZlcmUNCi0JICogdGhhbiBvay4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBnZXRNb3N0U2V2ZXJlKElTdGF0dXNbXSBzdGF0dXMpIHsNCi0JCUlTdGF0dXMgbWF4PSBudWxsOw0KLQkJZm9yIChpbnQgaT0gMDsgaSA8IHN0YXR1cy5sZW5ndGg7IGkrKykgew0KLQkJCUlTdGF0dXMgY3Vycj0gc3RhdHVzW2ldOw0KLQkJCWlmIChjdXJyLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpIHsNCi0JCQkJcmV0dXJuIGN1cnI7DQotCQkJfQ0KLQkJCWlmIChtYXggPT0gbnVsbCB8fCBjdXJyLmdldFNldmVyaXR5KCkgPiBtYXguZ2V0U2V2ZXJpdHkoKSkgew0KLQkJCQltYXg9IGN1cnI7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG1heDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFByb3ZpZGVzIGEgbmV3IHN0YXR1cyBvYmplY3Qgd2l0aCBzZXZlcml0eSBJU3RhdHVzLkNBTkNFTC4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgc3RhdHVzIG1lc3NhZ2UNCi0JICogQHJldHVybiB0aGUgY2FuY2VsIHN0YXR1cw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHN0YXR1c0NhbmNlbChmaW5hbCBTdHJpbmcgbWVzc2FnZSkNCi0Jew0KLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkNBTkNFTCwgbWVzc2FnZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFByb3ZpZGVzIGEgbmV3IHN0YXR1cyBvYmplY3Qgd2l0aCBzZXZlcml0eSBJU3RhdHVzLkVSUk9SLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBzdGF0dXMgbWVzc2FnZQ0KLQkgKiBAcmV0dXJuIHRoZSBlcnJvciBzdGF0dXMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBzdGF0dXNFcnJvcihmaW5hbCBTdHJpbmcgbWVzc2FnZSkNCi0Jew0KLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBtZXNzYWdlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUHJvdmlkZXMgYSBuZXcgc3RhdHVzIG9iamVjdCB3aXRoIHNldmVyaXR5IElTdGF0dXMuRVJST1IuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIHN0YXR1cyBtZXNzYWdlDQotCSAqIEBwYXJhbSBleA0KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBzdGF0dXMNCi0JICogQHJldHVybiB0aGUgZXJyb3Igc3RhdHVzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgc3RhdHVzRXJyb3IoZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSBleCkNCi0Jew0KLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBleCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFByb3ZpZGVzIGEgbmV3IHN0YXR1cyBvYmplY3Qgd2l0aCBzZXZlcml0eSBJU3RhdHVzLldBUk5JTkcuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIHN0YXR1cyBtZXNzYWdlDQotCSAqIEByZXR1cm4gdGhlIHdhcm5pbmcgc3RhdHVzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgc3RhdHVzV2FybmluZyhmaW5hbCBTdHJpbmcgbWVzc2FnZSkNCi0Jew0KLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIG1lc3NhZ2UpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBQcm92aWRlcyBhIG5ldyBzdGF0dXMgb2JqZWN0IHdpdGggc2V2ZXJpdHkgSVN0YXR1cy5XQVJOSU5HLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBzdGF0dXMgbWVzc2FnZQ0KLQkgKiBAcGFyYW0gZXgNCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgc3RhdHVzDQotCSAqIEByZXR1cm4gdGhlIHdhcm5pbmcgc3RhdHVzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgc3RhdHVzV2FybmluZyhmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgVGhyb3dhYmxlIGV4KQ0KLQl7DQotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuV0FSTklORywgbWVzc2FnZSwgZXgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBQcm92aWRlcyBhIG5ldyBzdGF0dXMgb2JqZWN0IHdpdGggc2V2ZXJpdHkgSVN0YXR1cy5JTkZPLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBzdGF0dXMgbWVzc2FnZQ0KLQkgKiBAcmV0dXJuIHRoZSBpbmZvIHN0YXR1cw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHN0YXR1c0luZm8oZmluYWwgU3RyaW5nIG1lc3NhZ2UpDQotCXsNCi0JCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5JTkZPLCBtZXNzYWdlKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFByb3ZpZGVzIGEgbmV3IHN0YXR1cyBvYmplY3Qgd2l0aCBzZXZlcml0eSBJU3RhdHVzLklORk8uDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIHN0YXR1cyBtZXNzYWdlDQotCSAqIEByZXR1cm4gdGhlIGluZm8gc3RhdHVzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgc3RhdHVzSW5mbyhmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgVGhyb3dhYmxlIGNhdXNlKQ0KLQl7DQotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuSU5GTywgbWVzc2FnZSwgY2F1c2UpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUHJvdmlkZXMgYSBuZXcgc3RhdHVzIG9iamVjdCB3aXRoIHNldmVyaXR5IElTdGF0dXMuT0suDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIHN0YXR1cyBtZXNzYWdlDQotCSAqIEByZXR1cm4gdGhlIG9rIHN0YXR1cw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHN0YXR1c09rKGZpbmFsIFN0cmluZyBtZXNzYWdlKQ0KLQl7DQotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuT0ssIG1lc3NhZ2UpOw0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGZpbmFsIGludCBzZXZlcml0eSwgZmluYWwgU3RyaW5nIG1lc3NhZ2UpDQotCXsNCi0JCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCAiaWQiLCAwLCBtZXNzYWdlLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGZpbmFsIGludCBzZXZlcml0eSwgZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSBleCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksICJpZCIsIDAsIG1lc3NhZ2UsIGV4KTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotCQ0KLQkvKioNCi0JICogUHJvdmlkZXMgYSBuZXcgbXVsdGlzdGF0dXMgb2JqZWN0DQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIHN0YXR1cyBtZXNzYWdlDQotCSAqIEByZXR1cm4gbXVsdGlzdGF0dXMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgTXVsdGlTdGF0dXMgY3JlYXRlTXVsdGlTdGF0dXMoU3RyaW5nIG1lc3NhZ2UpDQotCXsNCi0JCXJldHVybiBuZXcgTXVsdGlTdGF0dXMoImlkIiwgMCwgbWVzc2FnZSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL1dzZGxOYW1lc1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9Xc2RsTmFtZXNWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTdkZDNmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL1dzZGxOYW1lc1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHM7DQotDQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMudHlwZXMuTkNOYW1lOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLnRleHQuSmF4V3NVdGlsTWVzc2FnZXM7DQotDQotDQotLyoqDQotICogQ2xhc3MgdGhhdCBjb250YWlucyB1dGlsaXR5IG1ldGhvZHMgdG8gdmFsaWRhdGUgbmFtZXMgdXNlZCBpbiBXU0RMLiAgDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXc2RsTmFtZXNWYWxpZGF0b3IgDQotew0KLQkvKioNCi0JICogUHJvdmlkZXMgdmFsaWRhdGlvbiBvZiBOQ05hbWUgDQotCSAqIEBwYXJhbSB0aXRsZSB0aGUgdGl0bGUgZm9yIHRoZSBlcnJvciBtZXNzYWdlDQotCSAqIEBwYXJhbSBuYW1lIHRoZSBjaGVja2VkIG5hbWUNCi0JICogQHJldHVybiBlcnJvciBzdGF0dXMgaW4gY2FzZSB0aGUgbmFtZSBpcyBpbnZhbGlkIG90aGVyd2lzZSB7QGxpbmsgU3RhdHVzI09LX1NUQVRVU30uDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVOQ05hbWUoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbmFtZSkNCi0Jew0KLQkJaWYgKG5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsNCi0JCQlyZXR1cm4gU3RhdHVzVXRpbHMuc3RhdHVzRXJyb3IoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NVdGlsTWVzc2FnZXMuV3NkbE5hbWVzVmFsaWRhdG9yX0VtcHR5WG1sTmFtZSwgdGl0bGUpKTsNCi0JCX0NCi0JCQ0KLQkJaW50IGVyclBvcyA9IGNoZWNrTkNOYW1lKG5hbWUpOw0KLQkJaWYgKGVyclBvcyA+IC0xKSB7DQotCQkJcmV0dXJuIFN0YXR1c1V0aWxzLnN0YXR1c0Vycm9yKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzVXRpbE1lc3NhZ2VzLldzZGxOYW1lc1ZhbGlkYXRvcl9JbnZhbGlkTkNOYW1lLCBuYW1lLmNoYXJBdChlcnJQb3MpLCB0aXRsZSwgbmFtZSkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsNCi0JfQkNCi0JDQotCS8qKg0KLQkgKiBWYWxpZGF0ZXMgPGNvZGU+bmFtZTwvY29kZT4gZm9yIE5DTmFtZQ0KLQkgKiBAcGFyYW0gbmFtZQ0KLQkgKiBAcmV0dXJuIC0xIGlmIHRoZSBuYW1lIGlzIHZhbGlkIG9yID4gLTEgd2hpY2ggaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSB3cm9uZyBjaGFyYWN0ZXIuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVOQ05hbWUyKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG5hbWUpIA0KLQl7DQotCQlpZiAobmFtZT09bnVsbCB8fCBuYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7DQotCQkJcmV0dXJuIFN0YXR1c1V0aWxzLnN0YXR1c0Vycm9yKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzVXRpbE1lc3NhZ2VzLldzZGxOYW1lc1ZhbGlkYXRvcl9FbXB0eVhtbE5hbWUyLCB0aXRsZSkpOw0KLQkJfQ0KLQkJDQotCQlpbnQgZXJyUG9zID0gY2hlY2tOQ05hbWUobmFtZSk7DQotCQlpZiAoZXJyUG9zID4gLTEpIHsNCi0JCQlyZXR1cm4gU3RhdHVzVXRpbHMuc3RhdHVzRXJyb3IoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NVdGlsTWVzc2FnZXMuV3NkbE5hbWVzVmFsaWRhdG9yX0ludmFsaWROQ05hbWUyLCBuYW1lLmNoYXJBdChlcnJQb3MpLCB0aXRsZSkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBuYW1lIHNwZWNpZmllZCBpcyBhIHZhbGlkIE5DTmFtZQ0KLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBjaGVjaw0KLQkgKiBAcmV0dXJuIGluZGV4IG9mIHRoZSBmaXJzdCBzeW1ib2wgd2hpY2ggdmlvbGF0ZXMgdGhlIE5DTmFtZSBydWxlcyBvciAtMSBpbiBjYXNlIHRoZSBuYW1lIGlzIGEgdmFsaWQgTkNOYW1lDQotCSAqIEBzZWUgTkNOYW1lI2lzVmFsaWQoU3RyaW5nKQ0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNoZWNrTkNOYW1lKGZpbmFsIFN0cmluZyBuYW1lKQ0KLQl7DQotCQlmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOw0KLQkJZm9yKGludCBpID0gMDsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykNCi0JCXsNCi0JCQlidWlsZGVyLmFwcGVuZChuYW1lLmNoYXJBdChpKSk7DQotCQkJaWYoIU5DTmFtZS5pc1ZhbGlkKGJ1aWxkZXIudG9TdHJpbmcoKSkpDQotCQkJew0KLQkJCQlyZXR1cm4gaTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiAtMTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0Fubm90YXRpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0Fubm90YXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmMmZkMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbTsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFubm90YXRpb25JbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Bbm5vdGF0aW9uSW5zcGVjdG9ySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQW5ub3RhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5BcnJheVZhbHVlSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQm9vbGVhblZhbHVlSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQ2xhc3NWYWx1ZUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkludGVnZXJWYWx1ZUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLlBhcmFtVmFsdWVQYWlySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuUXVhbGlmaWVkTmFtZVZhbHVlSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuU3RyaW5nVmFsdWVJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwudGV4dC5KYXhXc1V0aWxNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOw0KLQ0KLQ0KLS8qKg0KLSAqIEZhY3RvcnkgY2xhc3MgY29udGFpbmluZyBjb21tb24gZmFjdG9yeSBhbmQgdXRpbGl0eSBtZXRob2RzIEFubm90YXRpb24gcHJvY2Vzc2luZy4NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkZhY3RvcnkNCi17DQotCS8qKg0KLQkgKiBDcmVhdGVzIGNvbXBsZXggQW5ub3RhdGlvbiwgZS5nLiBBbm5vdGF0aW9uIG9mIGtpbmQgXEBXZWJTZXJ2aWNlKHBhcmFtMT0idmFsdWUxIiwgcGFyYW0yPSJ2YWx1ZTIiKS4NCi0JICogDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uUU5hbWUNCi0JICogQHBhcmFtIHBhcmFtVmFsdWVQYWlycw0KLQkgKiANCi0JICogQHJldHVybiBJbnN0YW50aWF0ZWQgQW5ub3RhdGlvbiBvZiB0eXBlIElDb21wbGV4QW5ub3RhdGlvbi4NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSA8dHQ+YW5ub3RhdGlvblFOYW1lPC90dD4gb3IgPHR0PnBhcmFtVmFsdWVQYWlyczwvdHQ+IGFyZSBudWxsLg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIDx0dD5hbm5vdGF0aW9uUU5hbWU8L3R0PiBpcyBlbXB0eSBTdHJpbmcuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBJQW5ub3RhdGlvbjxUPiBjcmVhdGVBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uUU5hbWUsIFNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVQYWlycywgZmluYWwgVCBhcHBsaWVkRWxlbWVudCkNCi0Jew0KLQkJaWYgKGFubm90YXRpb25RTmFtZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYW5ub3RhdGlvblFOYW1lIHNob3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYgKGFubm90YXRpb25RTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhbm5vdGF0aW9uUU5hbWUgc2hvdWxkIG5vdCBiZSBlbXB0eSBTdHJpbmchIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCWlmIChwYXJhbVZhbHVlUGFpcnMgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInBhcmFtVmFsdWVQYWlycyBzaG91bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCWZpbmFsIEFubm90YXRpb25JbXBsPFQ+IGltcGwgPSBuZXcgQW5ub3RhdGlvbkltcGw8VD4oYW5ub3RhdGlvblFOYW1lLCBwYXJhbVZhbHVlUGFpcnMpOw0KLQkJaW1wbC5zZXRKYXZhRWxlbWVudChhcHBsaWVkRWxlbWVudCk7DQotCQkNCi0JCXJldHVybiBpbXBsOw0KLQl9DQotCQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZXMge0BsaW5rIElBbm5vdGF0aW9ufSBpbnN0YW5jZSB0aGF0IHJlZmVyZW5jZXMgPGNvZGU+YXBwbGllZEVsZW1lbnQ8L2NvZGU+IGphdmEgZWxlbWVudCANCi0JICogQHBhcmFtIGFubm90YXRpb25RTmFtZSB0aGUgYW5ub3RhdGlvbiBuYW1lDQotCSAqIEBwYXJhbSBhcHBsaWVkRWxlbWVudCB0aGUgamF2YSBlbGVtZW50IHRoYXQgdGhpcyBhbm5vdGF0aW9uIGlzIGFwcGxpZWQgb24NCi0JICogQHBhcmFtIHBhcmFtVmFsdWVQYWlycyB0aGUgYW5ub3RhdGlvbiBhdHRyaWJ1dGVzDQotCSAqIEByZXR1cm4ge0BsaW5rIElBbm5vdGF0aW9ufSBpbnN0YW5jZQ0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhc2Ugc29tZSBvZiBwYXJhbXMgaXMgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5hbm5vdGF0aW9uUU5hbWU8L2NvZGU+IGlzIGVtcHR5IHN0cmluZw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBjcmVhdGVBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uUU5hbWUsIElKYXZhRWxlbWVudCBhcHBsaWVkRWxlbWVudCwgU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZVBhaXJzKQ0KLQl7DQotCQludWxsQ2hlY2tQYXJhbShhbm5vdGF0aW9uUU5hbWUsICJhbm5vdGF0aW9uUU5hbWUiKTsJIC8vJE5PTi1OTFMtMSQJDQotCQlpZiAoYW5ub3RhdGlvblFOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYW5ub3RhdGlvblFOYW1lIHNob3VsZCBub3QgYmUgZW1wdHkgU3RyaW5nISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQludWxsQ2hlY2tQYXJhbShwYXJhbVZhbHVlUGFpcnMsICJwYXJhbVZhbHVlUGFpcnMiKTsgLy8kTk9OLU5MUy0xJA0KLQkJbnVsbENoZWNrUGFyYW0oYXBwbGllZEVsZW1lbnQsICJhcHBsaWVkRWxlbWVudCIpOyAvLyROT04tTkxTLTEkDQotDQotCQlmaW5hbCBBbm5vdGF0aW9uSW1wbDxJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbkltcGw8SUphdmFFbGVtZW50Pihhbm5vdGF0aW9uUU5hbWUsIHBhcmFtVmFsdWVQYWlycyk7DQotCQlhbm5vdGF0aW9uLnNldEFwcGxpZWRFbGVtZW50V2l0aG91dFNhdmUoYXBwbGllZEVsZW1lbnQpOw0KLQkJDQotCQlyZXR1cm4gYW5ub3RhdGlvbjsNCi0JfQkNCi0JDQotCS8qKg0KLQkqIENyZWF0ZXMgcGFyYW0tdmFsdWUgcGFpciBuZWVkZWQgaW4gY29tcGxleCBBbm5vdGF0aW9ucy4NCi0JICogDQotCSAqIEBwYXJhbSBwYXJhbQ0KLQkgKiBAcGFyYW0gdmFsdWUNCi0JICogDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgSVBhcmFtVmFsdWVQYWlyDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+cGFyYW08L2NvZGU+IG9yIDxjb2RlPnZhbHVlPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5wYXJhbTwvY29kZT4gcGFyYW1ldGVyIGlzIGVtcHR5IFN0cmluZy4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVBhcmFtVmFsdWVQYWlyIGNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoU3RyaW5nIHBhcmFtLCBJVmFsdWUgdmFsdWUpDQotCXsNCi0JCWlmIChwYXJhbSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicGFyYW0gc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZiAocGFyYW0udHJpbSgpLmxlbmd0aCgpID09IDApDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyYW0gc2hvdWxkIG5vdCBiZSBlbXB0eSBTdHJpbmchIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCWlmICh2YWx1ZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidmFsdWUgc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlyZXR1cm4gbmV3IFBhcmFtVmFsdWVQYWlySW1wbChwYXJhbSwgdmFsdWUpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ3JlYXRlcyB7QGxpbmsgSVZhbHVlfSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCA8Y29kZT52YWx1ZXM8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIHZhbHVlcw0KLQkgKiANCi0JICogQHJldHVybiBpbnN0YW5jZSBvZiB7QGxpbmsgSVZhbHVlfQ0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPnZhbHVlczwvY29kZT4gaXMgbnVsbC4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT52YWx1ZXM8L2NvZGU+IGlzIGVtcHR5IFNldC4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVZhbHVlIGNyZWF0ZUFycmF5VmFsdWUoU2V0PElWYWx1ZT4gdmFsdWVzKQ0KLQl7DQotCQlpZiAodmFsdWVzID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ2YWx1ZXMgc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZiAodmFsdWVzLnNpemUoKSA8IDEpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidmFsdWVzIHNob3VsZCBub3QgYmUgZW1wdHkgU2V0ISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlyZXR1cm4gbmV3IEFycmF5VmFsdWVJbXBsKHZhbHVlcyk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDcmVhdGVzIHtAbGluayBJVmFsdWV9IGluc3RhbmNlIG91dCBvZiA8Y29kZT52YWx1ZTwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gdmFsdWUNCi0JICogDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2Yge0BsaW5rIElWYWx1ZX0NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVZhbHVlIGNyZWF0ZUJvb2xlYW5WYWx1ZShib29sZWFuIHZhbHVlKQ0KLQl7DQotCQlyZXR1cm4gbmV3IEJvb2xlYW5WYWx1ZUltcGwodmFsdWUpOw0KLQl9DQotCQkNCi0JLyoqDQotCSAqIENyZWF0ZXMge0BsaW5rIElWYWx1ZX0gaW5zdGFuY2Ugb3V0IG9mIDxjb2RlPnZhbHVlPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSB2YWx1ZQ0KLQkgKiANCi0JICogQHJldHVybiBpbnN0YW5jZSBvZiB7QGxpbmsgU3RyaW5nfQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJVmFsdWUgY3JlYXRlQ2xhc3NWYWx1ZShTdHJpbmcgdmFsdWUpDQotCXsNCi0JCWlmICh2YWx1ZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidmFsdWUgc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZih2YWx1ZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidmFsdWUgc2hvdWxkIG5vdCBiZSBlbXB0eSBTdHJpbmciKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbmV3IENsYXNzVmFsdWVJbXBsKHZhbHVlKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZXMge0BsaW5rIElWYWx1ZX0gaW5zdGFuY2Ugb3V0IG9mIDxjb2RlPnZhbHVlPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSB2YWx1ZQ0KLQkgKiANCi0JICogQHJldHVybiBpbnN0YW5jZSBvZiB7QGxpbmsgSVZhbHVlfQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJVmFsdWUgY3JlYXRlSW50ZWdlclZhbHVlKFN0cmluZyB2YWx1ZSkNCi0Jew0KLQkJcmV0dXJuIG5ldyBJbnRlZ2VyVmFsdWVJbXBsKHZhbHVlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyB7QGxpbmsgSVZhbHVlfSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPiBmdWxseSBxdWFsaWZpZWQgbmFtZS4NCi0JICogDQotCSAqIEBwYXJhbSBxdWFsaWZpZWROYW1lDQotCSAqDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2Yge0BsaW5rIElWYWx1ZX0NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSA8dHQ+cXVhbGlmaWVkTmFtZTwvdHQ+IGlzIG51bGwuDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4gaXMgbm90IGluIGNvcnJlY3QgZm9ybSBlLmcuIGNvdWxkIG5vdCBiZSBlbXB0eSBTdHJpbmcsIHNob2xkIGJlIHF1YWxpZmllZC4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVZhbHVlIGNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkNCi0Jew0KLQkJaWYgKHF1YWxpZmllZE5hbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInF1YWxpZmllZE5hbWUgc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlpZiAocXVhbGlmaWVkTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCB8fCBxdWFsaWZpZWROYW1lLmluZGV4T2YoJy4nKSA9PSAtMSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWFsaWZpZWROYW1lIGlzIG5vdCBpbiBjb3JyZWN0IGZvcm0hIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBuZXcgUXVhbGlmaWVkTmFtZVZhbHVlSW1wbChxdWFsaWZpZWROYW1lKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZXMge0BsaW5rIElWYWx1ZX0gaW5zdGFuY2Ugb3V0IG9mIDxjb2RlPnZhbHVlPC9jb2RlPiBjb250ZW50Lg0KLQkgKiANCi0JICogQHBhcmFtIHZhbHVlDQotCSAqDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2Yge0BsaW5rIElWYWx1ZX0NCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIDx0dD52YWx1ZTwvdHQ+IGlzIG51bGwuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElWYWx1ZSBjcmVhdGVTdHJpbmdWYWx1ZShTdHJpbmcgdmFsdWUpDQotCXsNCi0JCWlmICh2YWx1ZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidmFsdWUgc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlyZXR1cm4gbmV3IFN0cmluZ1ZhbHVlSW1wbCh2YWx1ZSk7DQotCX0NCi0JDQotCQ0KLS8vCS8qKg0KLS8vCSAqIFJldHJpZXZlcyBhbGwgQW5ub3RhdGlvbnMgZnJvbSBjbGFzcy4NCi0vLwkgKiANCi0vLwkgKiBAcGFyYW0gamF2YUVsZW1lbnQNCi0vLwkgKg0KLS8vCSAqIEByZXR1cm4gY29udGFpbmVkIGFubm90YXRpb25zIGluIDxjb2RlPmphdmFFbGVtZW50PC9jb2RlPg0KLS8vCSAqIA0KLS8vCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIGlmIGV4Y2VwdGlvbiBvY2N1cnMNCi0vLwkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDx0dD5qYXZhRWxlbWVudDwvdHQ+IGlzIG51bGwuDQotLy8JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4gaXMgbm90IG9mIHRoZSBjb3JyZWN0IHR5cGUuIFN1cHBvcnRlZCB0eXBlcyBhcmU6IEl0eXBlLCBJTWV0aG9kLCBJRmllbGQsIElUeXBlUGFyYW1ldGVyDQotLy8JICovDQotLy8JcHVibGljIHN0YXRpYyBTZXQ8SUFubm90YXRpb24+IGdldEFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLS8vCXsNCi0vLwkJaWYgKGphdmFFbGVtZW50ID09IG51bGwpDQotLy8JCXsNCi0vLwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiamF2YUVsZW1lbnQgc2hvdWxkIG5vdCBiZSBudWxsISIpOw0KLS8vCQl9DQotLy8JCWlmKCEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgfHwgIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpIHx8ICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJRmllbGQpIHx8ICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZVBhcmFtZXRlcikpDQotLy8JCXsNCi0vLwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImphdmFFbGVtZW50IGlzIG5vdCBvZiBjb3JyZWN0IHR5cGUhIik7DQotLy8JCX0NCi0vLwkJcHBwcHBwDQotLy8JfQ0KLQkNCi0JLyoqDQotCSAqIFJlbW92ZXMgYWxsIEFubm90YXRpb25zIGZyb20gPGNvZGU+amF2YUVsZW1lbnQ8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIGphdmFFbGVtZW50DQotCSAqDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPHR0PmphdmFFbGVtZW50PC90dD4gaXMgbnVsbC4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4gaXMgbm90IG9mIHRoZSBjb3JyZWN0IHR5cGUuIFN1cHBvcnRlZCB0eXBlcyBhcmU6IEl0eXBlLCBJTWV0aG9kLCBJRmllbGQsIElUeXBlUGFyYW1ldGVyDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJaWYgKGphdmFFbGVtZW50ID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJqYXZhRWxlbWVudCBzaG91bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKCEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgJiYgIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QpICYmICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJRmllbGQpICYmICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZVBhcmFtZXRlcikpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiamF2YUVsZW1lbnQgaXMgbm90IG9mIGNvcnJlY3QgdHlwZSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJcmVtb3ZlQW5ub3RhdGlvbnMoamF2YUVsZW1lbnQsIG51bGwpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmVtb3ZlcyBBbm5vdGF0aW9ucyB3aXRoIG5hbWVzIGNvbnRhaW5lZCBpbiA8Y29kZT5hbm5vdGF0aW9uczwvY29kZT4gZnJvbSA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4gYW5kIGl0cyBjaGlsZHJlbiwgaWYgc3VjaCBleGlzdC4NCi0JICogDQotCSAqIEBwYXJhbSBqYXZhRWxlbWVudA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbnMNCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPHR0PmphdmFFbGVtZW50PC90dD4gb3IgPHR0PmFubm90YXRpb25zPC90dD4gaXMgbnVsbC4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4gaXMgbm90IG9mIHRoZSBjb3JyZWN0IHR5cGUuIFN1cHBvcnRlZCB0eXBlcyBhcmU6IEl0eXBlLCBJTWV0aG9kLCBJRmllbGQsIElUeXBlUGFyYW1ldGVyDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFubm90YXRpb25zKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgU2V0PFN0cmluZz4gYW5ub3RhdGlvbnMpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWlmIChqYXZhRWxlbWVudCA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiamF2YUVsZW1lbnQgc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZighKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpICYmICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kKSAmJiAhKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUZpZWxkKSAmJiAhKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGVQYXJhbWV0ZXIpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImphdmFFbGVtZW50IGlzIG5vdCBvZiBjb3JyZWN0IHR5cGUhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXRyeSANCi0JCXsNCi0JCQlBbm5vdGF0aW9uVXRpbHMuZ2V0SW5zdGFuY2UoKS5yZW1vdmVBbm5vdGF0aW9ucyhqYXZhRWxlbWVudCwgYW5ub3RhdGlvbnMsIHRydWUpOw0KLQkJfSANCi0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUuZ2V0U3RhdHVzKCkuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCX0gDQotCQljYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSANCi0JCXsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgSmF4V3NVdGlsTWVzc2FnZXMuSW52YWxpZFRyZWVTdGF0ZU1zZywgZSk7DQotCQl9IA0KLQkJY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSANCi0JCXsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgSmF4V3NVdGlsTWVzc2FnZXMuQ29tcFVuaXRNaXNzaW5nTXNnLCBlKTsNCi0JCX0gDQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSANCi0JCXsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZS5nZXRTdGF0dXMoKS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfQ0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkNhbm5vdFBlcmZvcm1FZGl0TXNnLCBlKTsNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZSBpbnN0YW5jZSBvZiBJQW5ub3RhdGlvbkluc3BlY3RvciBmb3IgYSBzcGVjaWZpYyBJVHlwZS4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlIC0gSVR5cGUsIHdoaWNoIHdpbGwgYmUgaW5zcGVjdGVkLg0KLQkgKiAgDQotCSAqIEByZXR1cm4gSUFubm90YXRpb25JbnNwZWN0b3INCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSUFubm90YXRpb25JbnNwZWN0b3IgY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihJVHlwZSB0eXBlKQ0KLQl7DQotCQlyZXR1cm4gbmV3IEFubm90YXRpb25JbnNwZWN0b3JJbXBsKHR5cGUpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1NThhOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmV4Y2VwdGlvbi5Mb2NhbGl6ZWRFeGNlcHRpb247DQotDQotLyoqDQotICogRXhjZXB0aW9uIHRocm93biBieSBhbm5vdGF0aW9uIGdlbmVyYXRvciBpbiBjYXNlIHdoZW4gdW5leHBlY3RlZCBjb25kaXRpb24gaXMgbWV0DQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotDQotcHVibGljIGNsYXNzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24gZXh0ZW5kcyBMb2NhbGl6ZWRFeGNlcHRpb24NCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZ2V0dGluZyBlcnJvciBtZXNzYWdlLCBsb2NhbGl6ZWQgbWVzc2FnZSBhbmQge0BsaW5rIFRocm93YWJsZX0gdG8gYmUgd3JhcHBlZA0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogQHBhcmFtIGxvY2FsaXplZE1lc3NhZ2UgDQotCSAqIEBwYXJhbSB0DQotCSAqLw0KLQlwdWJsaWMgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgU3RyaW5nIGxvY2FsaXplZE1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSB0KQ0KLQl7DQotCQlzdXBlcihtZXNzYWdlLCBsb2NhbGl6ZWRNZXNzYWdlLCB0KTsJDQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIHdpdGggZXJyb3IgbWVzc2FnZSBhbmQgYSBsb2NhbGl6ZWQgbWVzc2FnZS4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqIEBwYXJhbSBsb2NhbGl6ZWRNZXNzYWdlDQotCSAqLw0KLQlwdWJsaWMgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgU3RyaW5nIGxvY2FsaXplZE1lc3NhZ2UpDQotCXsNCi0JCXN1cGVyKG1lc3NhZ2UsIGxvY2FsaXplZE1lc3NhZ2UpOwkJDQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uV3JpdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0Fubm90YXRpb25Xcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2YwNzMyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0Fubm90YXRpb25Xcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb2R5RGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRmllbGREZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklFeHRlbmRlZE1vZGlmaWVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmNsYXp6LkFTVFV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Bbm5vdGF0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQW5ub3RhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwudGV4dC5KYXhXc1V0aWxNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5FZGl0UmVzb3VyY2VzTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5GaWxlVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuSUZpbGVVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0Ow0KLQ0KLS8qKg0KLSAqIENsYXNzLCB3aGljaCBpcyB1c2VkIHRvIHNhdmUgdGhlIGFubm90YXRpb25zLg0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqDQotICovDQotcHVibGljIGNsYXNzIEFubm90YXRpb25Xcml0ZXINCi17DQotCXByaXZhdGUgc3RhdGljIEFubm90YXRpb25Xcml0ZXIgd3JpdGVyID0gbnVsbDsNCi0JcHJpdmF0ZSBmaW5hbCBJRmlsZVV0aWxzIGZpbGVVdGlscyA9IEZpbGVVdGlscy5nZXRJbnN0YW5jZSgpOw0KLQ0KLQkvKioNCi0JICogVGhlIGZhY3RvcnkgbWV0aG9kLg0KLQkgKiANCi0JICogQHJldHVybiBhIEFubm90YXRpb25Xcml0ZXIgaW5zdGFuY2UuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IEFubm90YXRpb25Xcml0ZXIgZ2V0SW5zdGFuY2UoKQ0KLQl7DQotCQlpZiAod3JpdGVyID09IG51bGwpDQotCQl7DQotCQkJd3JpdGVyID0gbmV3IEFubm90YXRpb25Xcml0ZXIoKTsNCi0JCX0NCi0JCXJldHVybiB3cml0ZXI7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBBZGRzIEFubm90YXRpb24gdG8gc3BlY2lmaWMgSUphdmFFbGVtZW50Lg0KLQkgKiANCi0JICogQHBhcmFtIGphdmFFbGVtZW50DQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDx0dD5qYXZhRWxlbWVudDwvdHQ+IGlzIG51bGwuDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+amF2YUVsZW1lbnQ8L2NvZGU+IGlzIG5vdCBvZiB0aGUgY29ycmVjdCB0eXBlLiBTdXBwb3J0ZWQgdHlwZXMgYXJlOiBJVHlwZSwgSU1ldGhvZCwgSUZpZWxkLCBJVHlwZVBhcmFtZXRlci4NCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLg0KLQkgKi8NCi0JcHVibGljIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIHNldEFwcGxpZWRFbGVtZW50KGZpbmFsIElBbm5vdGF0aW9uPFQ+IGFubm90YXRpb24sIGZpbmFsIFQgamF2YUVsZW1lbnQpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUFubm90YXRpb25JbXBsPFQ+IGFubm90YXRpb25JbXBsID0gKEFubm90YXRpb25JbXBsPFQ+KWFubm90YXRpb247DQotCQlhbm5vdGF0aW9uSW1wbC5zZXRKYXZhRWxlbWVudChqYXZhRWxlbWVudCk7DQotCQkNCi0JCXNldEFubm90YXRhdGlvblN0cmluZ1ZhbGx1ZShhbm5vdGF0aW9uSW1wbCwgdHJ1ZSwgamF2YUVsZW1lbnQpOw0KLQl9DQotCQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIHNldEFubm90YXRhdGlvblN0cmluZ1ZhbGx1ZShBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uSW1wbCwgYm9vbGVhbiBuZWVkU2F2ZSwgZmluYWwgVCBqYXZhRWxlbWVudCkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJaWYgKCFuZWVkU2F2ZSkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkNCi0JCXsNCi0JCQlhZGRUb0NsYXNzKGFubm90YXRpb25JbXBsLCAoSVR5cGUpamF2YUVsZW1lbnQpOwkJCQkNCi0JCX0NCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUZpZWxkKQ0KLQkJew0KLQkJCWFkZFRvRmllbGQoYW5ub3RhdGlvbkltcGwsIChJRmllbGQpamF2YUVsZW1lbnQpOw0KLQkJfQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJTWV0aG9kKQ0KLQkJew0KLQkJCWFkZFRvTWV0aG9kKGFubm90YXRpb25JbXBsLCAoSU1ldGhvZClqYXZhRWxlbWVudCk7DQotCQl9DQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlUGFyYW1ldGVyKQ0KLQkJew0KLQkJCWFkZFRvUGFyYW0oYW5ub3RhdGlvbkltcGwsIChJVHlwZVBhcmFtZXRlcilqYXZhRWxlbWVudCk7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgYWRkVG9DbGFzcyhBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uSW1wbCwgSVR5cGUgY2xhc3NUeXBlKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NUeXBlLmdldEVsZW1lbnROYW1lKCk7DQotDQotCQlhZGRUb01lbWJlcihhbm5vdGF0aW9uSW1wbCwgY2xhc3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCBjbGFzc1R5cGUsIGNsYXNzTmFtZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCBhZGRUb0ZpZWxkKEFubm90YXRpb25JbXBsPFQ+IGFubm90YXRpb25JbXBsLCBJRmllbGQgZmllbGRUeXBlKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmcgY2xhc3NOYW1lID0gZmllbGRUeXBlLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCk7DQotDQotCQlhZGRUb01lbWJlcihhbm5vdGF0aW9uSW1wbCwgZmllbGRUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCBmaWVsZFR5cGUsIGNsYXNzTmFtZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCBhZGRUb01ldGhvZChBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uSW1wbCwgSU1ldGhvZCBtZXRob2RUeXBlKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmcgY2xhc3NOYW1lID0gbWV0aG9kVHlwZS5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpOw0KLQ0KLQkJYWRkVG9NZW1iZXIoYW5ub3RhdGlvbkltcGwsIG1ldGhvZFR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksIG1ldGhvZFR5cGUsIGNsYXNzTmFtZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCBhZGRUb1BhcmFtKEFubm90YXRpb25JbXBsPFQ+IGFubm90YXRpb25JbXBsLCBJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW0pIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUlNZW1iZXIgbWVtYmVyID0gdHlwZVBhcmFtLmdldERlY2xhcmluZ01lbWJlcigpOw0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7DQotCQlpZiAobWVtYmVyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCkNCi0JCXsNCi0JCQljbGFzc05hbWUgPSBtZW1iZXIuZ2V0RGVjbGFyaW5nVHlwZSgpLmdldEVsZW1lbnROYW1lKCk7DQotCQl9IGVsc2UNCi0JCXsNCi0JCQljbGFzc05hbWUgPSBtZW1iZXIuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCX0NCi0NCi0JCWFkZFRvTWVtYmVyKGFubm90YXRpb25JbXBsLCBtZW1iZXIuZ2V0Q29tcGlsYXRpb25Vbml0KCksIHR5cGVQYXJhbSwgY2xhc3NOYW1lKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIGFkZFRvTWVtYmVyKEFubm90YXRpb25JbXBsPFQ+IGFubm90YXRpb25JbXBsLCBJQ29tcGlsYXRpb25Vbml0IGNVbml0LCBJSmF2YUVsZW1lbnQgdHlwZSwgU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJaWYgKGNVbml0ID09IG51bGwpDQotCQkJew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQ0KLQkJCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQoY1VuaXQsIG51bGwpOw0KLQkJCUFTVCBhc3QgPSB1bml0LmdldEFTVCgpOw0KLQ0KLQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKUFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKGNsYXNzTmFtZSwgdW5pdCk7DQotCQkJaWYgKHR5cGVEZWNsYXJhdGlvbiAhPSBudWxsKQ0KLQkJCXsNCi0JCQkJc3dpdGNoICh0eXBlLmdldEVsZW1lbnRUeXBlKCkpDQotCQkJCXsNCi0JCQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRToNCi0JCQkJCWFkZEFubm90YXRpb24oYW5ub3RhdGlvbkltcGwsIGNVbml0LCB1bml0LCBhc3QsIHR5cGVEZWNsYXJhdGlvbik7DQotCQkJCQlicmVhazsNCi0JCQkJY2FzZSBJSmF2YUVsZW1lbnQuTUVUSE9EOg0KLQkJCQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZERlY2xhcmF0aW9uKChJTWV0aG9kKSB0eXBlLCB0eXBlRGVjbGFyYXRpb24pOw0KLQkJCQkJYWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uSW1wbCwgY1VuaXQsIHVuaXQsIGFzdCwgbWV0aG9kRGVjbGFyYXRpb24pOw0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgSUphdmFFbGVtZW50LkZJRUxEOg0KLQkJCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRGaWVsZERlY2xhcmF0aW9uKChJRmllbGQpIHR5cGUsIHR5cGVEZWNsYXJhdGlvbik7DQotCQkJCQlhZGRBbm5vdGF0aW9uKGFubm90YXRpb25JbXBsLCBjVW5pdCwgdW5pdCwgYXN0LCBmaWVsZERlY2xhcmF0aW9uKTsNCi0JCQkJCWJyZWFrOw0KLQkJCQljYXNlIElKYXZhRWxlbWVudC5UWVBFX1BBUkFNRVRFUjoNCi0JCQkJCUlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSAoSVR5cGVQYXJhbWV0ZXIpIHR5cGU7DQotCQkJCQlpZiAodHlwZVBhcmFtZXRlci5nZXREZWNsYXJpbmdNZW1iZXIoKS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpDQotCQkJCQl7DQotCQkJCQkJbWV0aG9kRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZERlY2xhcmF0aW9uKChJTWV0aG9kKSB0eXBlUGFyYW1ldGVyLmdldERlY2xhcmluZ01lbWJlcigpLCB0eXBlRGVjbGFyYXRpb24pOw0KLQkJCQkJCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1EZWNsYXJhdGlvbiA9IGdldFBhcmFtRGVjbGFyYXRpb24odHlwZVBhcmFtZXRlciwgbWV0aG9kRGVjbGFyYXRpb24pOw0KLQkJCQkJCWFkZEFubm90YXRpb24oYW5ub3RhdGlvbkltcGwsIGNVbml0LCB1bml0LCBhc3QsIHBhcmFtRGVjbGFyYXRpb24pOw0KLQkJCQkJfQ0KLQkJCQkJYnJlYWs7DQotCQkJCWRlZmF1bHQ6DQotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bnN1cHBvcnRlZCB0eXBlIGZvciBhbm5vdGF0aW9uIik7IC8vJE5PTi1OTFMtMSQNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkludmFsaWRUcmVlU3RhdGVNc2csIGUpOw0KLQkJfQ0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZS5nZXRTdGF0dXMoKS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfQ0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkNhbm5vdFBlcmZvcm1FZGl0TXNnLCBlKTsNCi0JCX0NCi0JCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgSmF4V3NVdGlsTWVzc2FnZXMuQ29tcFVuaXRNaXNzaW5nTXNnLCBlKTsNCi0JCX0NCi0JfQ0KLQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCBhZGRBbm5vdGF0aW9uKEFubm90YXRpb25JbXBsPFQ+IGFubm90YXRpb25JbXBsLCBJQ29tcGlsYXRpb25Vbml0IGNVbml0LCBDb21waWxhdGlvblVuaXQgdW5pdCwgQVNUIGFzdCwgQVNUTm9kZSBkZWNsYXJhdGlvbikgDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQllZGl0UmVzTWFuYWdlcigpLnNldEZpbGVFZGl0YWJsZSgoSUZpbGUpIGNVbml0LmdldFJlc291cmNlKCkpOw0KLQ0KLQkJdW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQlFeHByZXNzaW9uIGFubm90ID0gYW5ub3RhdGlvbkltcGwuZ2V0RXhwcmVzc2lvbih1bml0LCBhc3QpOw0KLQ0KLQkJTGlzdCBtb2RpZmllcnMgPSBudWxsOw0KLQ0KLQkJc3dpdGNoIChkZWNsYXJhdGlvbi5nZXROb2RlVHlwZSgpKQ0KLQkJew0KLQkJY2FzZSBBU1ROb2RlLk1FVEhPRF9ERUNMQVJBVElPTjoNCi0JCWNhc2UgQVNUTm9kZS5GSUVMRF9ERUNMQVJBVElPTjoNCi0JCWNhc2UgQVNUTm9kZS5UWVBFX0RFQ0xBUkFUSU9OOg0KLQkJCW1vZGlmaWVycyA9ICgoQm9keURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbikubW9kaWZpZXJzKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIEFTVE5vZGUuU0lOR0xFX1ZBUklBQkxFX0RFQ0xBUkFUSU9OOg0KLQkJCW1vZGlmaWVycyA9ICgoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24pLm1vZGlmaWVycygpOw0KLQkJCWJyZWFrOw0KLQkJZGVmYXVsdDoNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhZGRBbm5vdGF0aW9uKCkgaWxsZWdhbCBkZWNsYXRhaW9uIHR5cGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJbW9kaWZpZXJzLmFkZCgwLCBhbm5vdCk7DQotDQotCQlJRG9jdW1lbnQgZG9jID0gQW5ub3RhdGlvblV0aWxzLmdldEluc3RhbmNlKCkuZ2V0RG9jdW1lbnQoY1VuaXQpOw0KLQ0KLQkJVGV4dEVkaXQgZWRpdCA9IHVuaXQucmV3cml0ZShkb2MsIG51bGwpOw0KLQkJZWRpdC5hcHBseShkb2MpOw0KLQ0KLQkJSVN0YXR1cyBzdGF0dXMgPSBlZGl0UmVzTWFuYWdlcigpLnNldEZpbGVFZGl0YWJsZSgoSUZpbGUpIGNVbml0LmdldFJlc291cmNlKCkpOw0KLQkJaWYoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSykNCi0JCXsNCi0JCQlmaWxlVXRpbHMuc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudEFuZFNhdmVEaXJ0eUVkaXRvcnMoY1VuaXQsIGRvYy5nZXQoKSwgdHJ1ZSwgbnVsbCk7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oIkFubm90YXR0aW9uIGNvdWxkIG5vdCBiZSBzdG9yZWQsIHRoZSBmaWxlIGlzIG5vdCB3cml0YWJsZSIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJCUpheFdzVXRpbE1lc3NhZ2VzLkFubm90YXRpb25DYW5ub3RCZVN0b3JlZE1zZyk7IA0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gZ2V0UGFyYW1EZWNsYXJhdGlvbihJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyLCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikNCi0Jew0KLQkJLy9UT0RPIGNoZWNrIHRoaXMgbWV0aG9kDQotCQlmaW5hbCBTdHJpbmcgcGFyYW1OYW1lID0gdHlwZVBhcmFtZXRlci5nZXRFbGVtZW50TmFtZSgpOw0KLQ0KLQkJZm9yIChPYmplY3QgZGVjbCA6IG1ldGhvZERlY2xhcmF0aW9uLnBhcmFtZXRlcnMoKSkNCi0JCXsNCi0JCQlpZiAoIShkZWNsIGluc3RhbmNlb2YgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikpDQotCQkJew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotDQotCQkJaWYgKHBhcmFtTmFtZS5lcXVhbHMoKChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBkZWNsKS5nZXROYW1lKCkudG9TdHJpbmcoKSkpDQotCQkJew0KLQkJCQlyZXR1cm4gKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIGRlY2w7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBVcGRhdGVzIHRoZSBQYXJhbWV0ZXItVmFsdWUgUGFpcnMgb2Ygc3BlY2lmaWMgQW5ub3RhdGlvbi4NCi0JICogDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uIC0gQW5ub3RhdGlvbiwgd2hpY2ggd2lsbCBiZSB1cGRhdGVkLg0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQkgKi8NCi0JcHVibGljIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIHVwZGF0ZShmaW5hbCBJQW5ub3RhdGlvbjxUPiBhbm5vdGF0aW9uKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0dGlvbkltcGwgPSBuZXcgQW5ub3RhdGlvbkltcGw8VD4oYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpKTsNCi0JCXRyeQ0KLQkJew0KLQkJCXVwZGF0ZVRoZUFubm90YXRpb24oYW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLCBhbm5vdGF0dGlvbkltcGwpOw0KLQkJfSANCi0JCWNhdGNoKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZSkgew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5JbnZhbGlkVHJlZVN0YXRlTXNnLCBlKTsNCi0JCX0gDQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5DYW5ub3RQZXJmb3JtRWRpdE1zZywgZSk7DQotCQl9IA0KLQkJY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkNvbXBVbml0TWlzc2luZ01zZywgZSk7DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBVcGRhdGVzIHRoZSBQYXJhbS1WYWx1ZSBQYWlycyBvZiBzcGVjaWZpYyBBbm5vdGF0aW9uLg0KLQkgKiANCi0JICogQHBhcmFtIGFubm90YXRpb24gLSBBbm5vdGF0aW9uLCB3aGljaCB3aWxsIGJlIHVwZGF0ZWQuDQotCSAqIEBwYXJhbSBwYXJhbVZhbHVlUGFpcnMgd2hpY2ggd2lsbCBiZSB1cGRhdGVkLiBPbGQgcGFpcnMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBuZXcgb25jZS4NCi0JICogQHBhcmFtIHJlcGxhY2VQcmV2aW91c1BhaXJzIGJvb2xlYW4gdmFsdWUgd2hpY2ggc3BlY2lmaWVzIHRoZSB3YXksIGhvdyBuZXcgSVBhcmFtVmFsdWVQYWlycyB3aWxsIGJlIHVwZGF0ZWQuIElmIHRoZSB2YWx1ZSBpcyA8dHQ+dHJ1ZTwvdHQ+LA0KLQkgKiB0aGUgU2V0IHdpdGggdGhlIG9sZCBJUGFyYW1WYWx1ZVBhaXJzIHdpbGwgYmUgY2xlYXJlZCBhbmQgdGhlIG5ldyB2YWx1ZXMgd2lsbCBiZSBhcHBsaWVkLiBJZiB0aGUgdmFsdWUgaXMgPHR0PmZhbHNlPC90dD4gdGhlIG9sZCBwYWlycyB3aWxsIGJlIGtlcHQNCi0JICogYW5kIHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZSAgdmFsdWVzIGZyb20gdGhlIG5ldyBTZXQsIGlmIHRoZXJlIGFyZSBwYXJhbXMgd2hpY2ggZG8gbm90IGV4aXN0IGluIHRoZSBvbGQgb25lLCB0aGV5IHdpbGwgYmUgYWRkZWQuDQotCSAqIA0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKiANCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgcHVibGljIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIHVwZGF0ZShmaW5hbCBJQW5ub3RhdGlvbjxUPiBhbm5vdGF0aW9uKSBpbnN0ZWFkLg0KLQkgKi8NCi0JQERlcHJlY2F0ZWQNCi0JcHVibGljIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIHVwZGF0ZShmaW5hbCBJQW5ub3RhdGlvbjxUPiBhbm5vdGF0aW9uLCBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlUGFpcnMsIGJvb2xlYW4gcmVwbGFjZVByZXZpb3VzUGFpcnMpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsJDQotCQl1cGRhdGVBbm5vdGF0aW9uKGFubm90YXRpb24sIGFubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKSwgcGFyYW1WYWx1ZVBhaXJzLCByZXBsYWNlUHJldmlvdXNQYWlycyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIA0KLQkgKiBAcGFyYW0gPFQ+DQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uDQotCSAqIEBwYXJhbSBqYXZhRWxlbWVudA0KLQkgKiBAcGFyYW0gcGFyYW1WYWx1ZVBhaXJzDQotCSAqIEBwYXJhbSByZXBsYWNlUHJldmlvdXNQYWlycw0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uDQotCSAqIA0KLQkgKi8NCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCB1cGRhdGVBbm5vdGF0aW9uKGZpbmFsIElBbm5vdGF0aW9uPFQ+IGFubm90YXRpb24sIGZpbmFsIFQgamF2YUVsZW1lbnQsIFNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVQYWlycywgYm9vbGVhbiByZXBsYWNlUHJldmlvdXNQYWlycykgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24sIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJQW5ub3RhdGlvbkltcGw8VD4gYW5ub3RhdGlvbkltcGwgPSAoQW5ub3RhdGlvbkltcGw8VD4pYW5ub3RhdGlvbjsNCi0JCXRyeQ0KLQkJew0KLQkJCWlmKHJlcGxhY2VQcmV2aW91c1BhaXJzKQ0KLQkJCXsNCi0JCQkJYW5ub3RhdGlvbkltcGwuc2V0UGFyYW1WYWx1ZVBhaXJzKHBhcmFtVmFsdWVQYWlycyk7DQotCQkJfQ0KLQkJCWVsc2UNCi0JCQl7DQotCQkJCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhaXIgOiBwYXJhbVZhbHVlUGFpcnMpDQotCQkJCXsNCi0JCQkJCWJvb2xlYW4gaXNVcGRhdGVkID0gZmFsc2U7DQotCQkJCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiB0bXBQYXJhbVZhbHVlUGFpcnMgPSBhbm5vdGF0aW9uSW1wbC5nZXRQYXJhbVZhbHVlUGFpcnMoKTsNCi0JCQkJCWZvciAoSVBhcmFtVmFsdWVQYWlyIHRoaXNQYWlyIDogdG1wUGFyYW1WYWx1ZVBhaXJzKQ0KLQkJCQkJew0KLQkJCQkJCWlmKHRoaXNQYWlyLmdldFBhcmFtKCkuZXF1YWxzKHBhaXIuZ2V0UGFyYW0oKSkpDQotCQkJCQkJew0KLQkJCQkJCQl0bXBQYXJhbVZhbHVlUGFpcnMucmVtb3ZlKHRoaXNQYWlyKTsNCi0JCQkJCQkJdG1wUGFyYW1WYWx1ZVBhaXJzLmFkZChwYWlyKTsNCi0JCQkJCQkJaXNVcGRhdGVkID0gdHJ1ZTsNCi0JCQkJCQkJYnJlYWs7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJaWYoIWlzVXBkYXRlZCkNCi0JCQkJCXsNCi0JCQkJCQl0bXBQYXJhbVZhbHVlUGFpcnMuYWRkKHBhaXIpOw0KLQkJCQkJfQ0KLQkJCQkJYW5ub3RhdGlvbkltcGwuc2V0UGFyYW1WYWx1ZVBhaXJzKHRtcFBhcmFtVmFsdWVQYWlycyk7DQotCQkJCX0NCi0JCQl9DQotCQkJdXBkYXRlVGhlQW5ub3RhdGlvbihqYXZhRWxlbWVudCwgYW5ub3RhdGlvbkltcGwpOw0KLQkJCQ0KLQkJCS8vcmVtb3ZlKGFubm90YXRpb24pOw0KLQkJCS8vc2V0QXBwbGllZEVsZW1lbnQoYW5ub3RhdGlvbiwgamF2YUVsZW1lbnQpOw0KLQkJfSANCi0JCWNhdGNoKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZSkgew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5JbnZhbGlkVHJlZVN0YXRlTXNnLCBlKTsNCi0JCX0gDQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5DYW5ub3RQZXJmb3JtRWRpdE1zZywgZSk7DQotCQl9IA0KLQkJY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkNvbXBVbml0TWlzc2luZ01zZywgZSk7DQotCQl9DQotCX0NCi0NCi0NCi0JLyoqDQotCSAqIFJlbW92ZXMgQW5ub3RhdGlvbi4NCi0JICogDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uIC0gQW5ub3RhdGlvbiwgd2hpY2ggd2lsbCBiZSByZW1vdmVkLg0KLQkgKiANCi0JICogQHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiANCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIA0KLQkgKi8NCi0JcHVibGljIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIHJlbW92ZShmaW5hbCBJQW5ub3RhdGlvbjxUPiBhbm5vdGF0aW9uKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlyZW1vdmVBbm5vdGF0aW9uKGFubm90YXRpb24sIGFubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKSk7DQotCX0NCi0NCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCByZW1vdmVBbm5vdGF0aW9uKGZpbmFsIElBbm5vdGF0aW9uPFQ+IGFubm90YXRpb24sIGZpbmFsIFQgamF2YUVsZW1lbnQpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUFubm90YXRpb25JbXBsPFQ+IGFubm90YXRpb25JbXBsID0gKEFubm90YXRpb25JbXBsPFQ+KWFubm90YXRpb247DQotCQl0cnkNCi0JCXsNCi0vLwkJCWlmKGFubm90YXRpb25JbXBsLmdldEFubm90YXRpb25TdHJpbmdWYWx1ZSgpID09IG51bGwgfHwgYW5ub3RhdGlvbkltcGwuZ2V0QW5ub3RhdGlvblN0cmluZ1ZhbHVlKCkudHJpbSgpLmVxdWFscygiIikpDQotLy8JCQl7DQotLy8JCQkJYW5ub3RhdGlvbkltcGwuc2V0QW5ub3RhdGlvblN0cmluZ1ZhbHVlKGNyZWF0ZUFubm90YXRhdGlvblN0cmluZ1ZhbGx1ZShhbm5vdGF0aW9uSW1wbCwgamF2YUVsZW1lbnQpKTsNCi0vLwkJCQlBbm5vdGF0aW9uVXRpbHMuZ2V0SW5zdGFuY2UoKS5yZW1vdmVBbm5vdGF0aW9uKGphdmFFbGVtZW50LCBhbm5vdGF0aW9uSW1wbC5nZXRBbm5vdGF0aW9uU3RyaW5nVmFsdWUoKSk7DQotLy8JCQl9DQotLy8JCQllbHNlDQotLy8JCQl7DQotCQkJCUFubm90YXRpb25VdGlscy5nZXRJbnN0YW5jZSgpLnJlbW92ZUFubm90YXRpb24oamF2YUVsZW1lbnQsIGFubm90YXRpb25JbXBsLmdldFNpbXBsZUFubm90YXRpb25OYW1lKCkpOw0KLS8vCQkJfQ0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gYmxlKQ0KLQkJew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGJsZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkNhbm5vdFBlcmZvcm1FZGl0TXNnLCBibGUpOw0KLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZm5mZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkNvbXBVbml0TWlzc2luZ01zZywgZm5mZSk7DQotCQl9CQ0KLQl9DQotDQotCS8vIGkwMzY1MDkgYWRkZWQNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgdXBkYXRlVGhlQW5ub3RhdGlvbihmaW5hbCBUIGphdmFFbGVtZW50LCBmaW5hbCBBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uSW1wbCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24NCi0JewkJDQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGlDdSA9IGdldEN1KGphdmFFbGVtZW50KTsNCi0JCWZpbmFsIENvbXBpbGF0aW9uVW5pdCB1bml0ID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQoaUN1LCBudWxsKTsNCi0JCQ0KLQkJQm9keURlY2xhcmF0aW9uIGJkID0gbnVsbDsNCi0JCUFubm90YXRpb24gZm91bmQgPSBudWxsOw0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkNCi0JCXsNCi0JCQliZCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKGphdmFFbGVtZW50LmdldEVsZW1lbnROYW1lKCksIHVuaXQpOw0KLQkJCWZvdW5kID0gZmluZEFubm90YXRpb24oYmQsIGFubm90YXRpb25JbXBsKTsNCi0NCi0JCQl1bml0LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsNCi0JCQlpZiAoZm91bmQhPW51bGwpIHsNCi0JCQkJYmQubW9kaWZpZXJzKCkucmVtb3ZlKGZvdW5kKTsNCi0JCQl9DQotCQkJDQotCQkJZmluYWwgRXhwcmVzc2lvbiBhbm5vdCA9IGFubm90YXRpb25JbXBsLmdldEV4cHJlc3Npb24odW5pdCwgdW5pdC5nZXRBU1QoKSk7DQotCQkJYmQubW9kaWZpZXJzKCkuYWRkKDAsIGFubm90KTsNCi0JCX0NCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkNCi0JCXsNCi0JCQlUeXBlRGVjbGFyYXRpb24gdGQgPSAoVHlwZURlY2xhcmF0aW9uKUFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCgoSU1ldGhvZClqYXZhRWxlbWVudCkuZ2V0RGVjbGFyaW5nVHlwZSgpLmdldEVsZW1lbnROYW1lKCksIHVuaXQpOw0KLQkJCWJkID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRNZXRob2REZWNsYXJhdGlvbigoKElNZXRob2QpamF2YUVsZW1lbnQpLCB0ZCk7DQotCQkJZm91bmQgPSBmaW5kQW5ub3RhdGlvbihiZCwgYW5ub3RhdGlvbkltcGwpOw0KLQkJDQotCQkJdW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQkJaWYgKGZvdW5kIT1udWxsKSB7DQotCQkJCWJkLm1vZGlmaWVycygpLnJlbW92ZShmb3VuZCk7DQotCQkJfQ0KLQkJCQ0KLQkJCWZpbmFsIEV4cHJlc3Npb24gYW5ub3QgPSBhbm5vdGF0aW9uSW1wbC5nZXRFeHByZXNzaW9uKHVuaXQsIHVuaXQuZ2V0QVNUKCkpOw0KLQkJCWJkLm1vZGlmaWVycygpLmFkZCgwLCBhbm5vdCk7DQotCQl9DQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElGaWVsZCkNCi0JCXsNCi0JCQlUeXBlRGVjbGFyYXRpb24gdGQgPSAoVHlwZURlY2xhcmF0aW9uKUFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCgoSUZpZWxkKWphdmFFbGVtZW50KS5nZXREZWNsYXJpbmdUeXBlKCkuZ2V0RWxlbWVudE5hbWUoKSwgdW5pdCk7DQotCQkJYmQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldEZpZWxkRGVjbGFyYXRpb24oKChJRmllbGQpamF2YUVsZW1lbnQpLCB0ZCk7DQotCQkJZm91bmQgPSBmaW5kQW5ub3RhdGlvbihiZCwgYW5ub3RhdGlvbkltcGwpOw0KLQkJDQotCQkJdW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQkJaWYgKGZvdW5kIT1udWxsKSB7DQotCQkJCWJkLm1vZGlmaWVycygpLnJlbW92ZShmb3VuZCk7DQotCQkJfQ0KLQkJCQ0KLQkJCWZpbmFsIEV4cHJlc3Npb24gYW5ub3QgPSBhbm5vdGF0aW9uSW1wbC5nZXRFeHByZXNzaW9uKHVuaXQsIHVuaXQuZ2V0QVNUKCkpOw0KLQkJCWJkLm1vZGlmaWVycygpLmFkZCgwLCBhbm5vdCk7DQotCQl9DQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlUGFyYW1ldGVyKQ0KLQkJew0KLQkJCWlmKCgoSVR5cGVQYXJhbWV0ZXIpamF2YUVsZW1lbnQpLmdldERlY2xhcmluZ01lbWJlcigpIGluc3RhbmNlb2YgSVR5cGUpDQotCQkJew0KLQkJCQliZCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCgoSVR5cGVQYXJhbWV0ZXIpamF2YUVsZW1lbnQpLmdldERlY2xhcmluZ01lbWJlcigpLmdldEVsZW1lbnROYW1lKCksIHVuaXQpOw0KLQkJCQlTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtID0gZmluZFBhcmFtZXRlcihiZCwgamF2YUVsZW1lbnQpOw0KLQkJCQlpZihwYXJhbSAhPSBudWxsKQ0KLQkJCQl7DQotCQkJCQlmb3VuZCA9IGZpbmRQYXJhbUFubm90YXRpb24ocGFyYW0sIGFubm90YXRpb25JbXBsLCBqYXZhRWxlbWVudCk7DQotCQkJCX0NCi0NCi0JCQkJdW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQkJCWlmIChmb3VuZCE9bnVsbCkgew0KLQkJCQkJcGFyYW0ubW9kaWZpZXJzKCkucmVtb3ZlKGZvdW5kKTsNCi0JCQkJfQ0KLQkJCQkNCi0JCQkJZmluYWwgRXhwcmVzc2lvbiBhbm5vdCA9IGFubm90YXRpb25JbXBsLmdldEV4cHJlc3Npb24odW5pdCwgdW5pdC5nZXRBU1QoKSk7DQotCQkJCXBhcmFtLm1vZGlmaWVycygpLmFkZCgwLCBhbm5vdCk7DQotCQkJfQ0KLQkJCWVsc2UNCi0JCQl7DQotCQkJCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IChUeXBlRGVjbGFyYXRpb24pQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oKChJTWV0aG9kKSgoSVR5cGVQYXJhbWV0ZXIpamF2YUVsZW1lbnQpLmdldFBhcmVudCgpKS5nZXREZWNsYXJpbmdUeXBlKCkuIGdldEVsZW1lbnROYW1lKCksIHVuaXQpOw0KLQkJCQliZCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24oKChJTWV0aG9kKSgoSVR5cGVQYXJhbWV0ZXIpamF2YUVsZW1lbnQpLmdldFBhcmVudCgpKSwgdGQpOw0KLQkJCQlTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtID0gZmluZFBhcmFtZXRlcihiZCwgamF2YUVsZW1lbnQpOw0KLQkJCQlpZihwYXJhbSAhPSBudWxsKQ0KLQkJCQl7DQotCQkJCQlmb3VuZCA9IGZpbmRQYXJhbUFubm90YXRpb24ocGFyYW0sIGFubm90YXRpb25JbXBsLCBqYXZhRWxlbWVudCk7DQotCQkJCX0NCi0NCi0JCQkJdW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQkJCWlmIChmb3VuZCE9bnVsbCkgew0KLQkJCQkJcGFyYW0ubW9kaWZpZXJzKCkucmVtb3ZlKGZvdW5kKTsNCi0JCQkJfQ0KLQkJCQkNCi0JCQkJZmluYWwgRXhwcmVzc2lvbiBhbm5vdCA9IGFubm90YXRpb25JbXBsLmdldEV4cHJlc3Npb24odW5pdCwgdW5pdC5nZXRBU1QoKSk7DQotCQkJCXBhcmFtLm1vZGlmaWVycygpLmFkZCgwLCBhbm5vdCk7DQotCQkJfQ0KLQkJfQ0KLQkJCQkNCi0JCXNldEFubm90YXRhdGlvblN0cmluZ1ZhbGx1ZShhbm5vdGF0aW9uSW1wbCwgZmFsc2UsIGphdmFFbGVtZW50KTsNCi0JCWZpbmFsIElEb2N1bWVudCBkb2MgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXREb2N1bWVudChpQ3UpOwkNCi0JCWZpbmFsIFRleHRFZGl0IGVkaXQgPSB1bml0LnJld3JpdGUoZG9jLCBqYXZhRWxlbWVudC5nZXRKYXZhUHJvamVjdCgpLmdldE9wdGlvbnModHJ1ZSkpOw0KLQkJZWRpdC5hcHBseShkb2MpOw0KLQ0KLQkJSVN0YXR1cyBzdGF0dXMgPSBlZGl0UmVzTWFuYWdlcigpLnNldEZpbGVFZGl0YWJsZSgoSUZpbGUpIGlDdS5nZXRSZXNvdXJjZSgpKTsNCi0JCWlmKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spDQotCQl7DQotCQkJZmlsZVV0aWxzLnNldENvbXBpbGF0aW9uVW5pdENvbnRlbnRBbmRTYXZlRGlydHlFZGl0b3JzKGlDdSwgZG9jLmdldCgpLCB0cnVlLCBudWxsKTsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbigiQW5ub3RhdHRpb24gY291bGQgbm90IGJlIHN0b3JlZCwgdGhlIGZpbGUgaXMgbm90IHdyaXRhYmxlIiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkJCQkJSmF4V3NVdGlsTWVzc2FnZXMuQW5ub3RhdGlvbkNhbm5vdEJlU3RvcmVkTXNnKTsgDQotCQl9DQotCX0NCi0JDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIEFubm90YXRpb24gZmluZEFubm90YXRpb24oZmluYWwgQm9keURlY2xhcmF0aW9uIHRkLCBmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uKQ0KLQl7DQotCQlBbm5vdGF0aW9uIGFubjsNCi0JCWZvciAoSUV4dGVuZGVkTW9kaWZpZXIgbW9kaWZpZXIgOiAoTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4pdGQubW9kaWZpZXJzKCkpIA0KLQkJew0KLQkJCWlmKCFtb2RpZmllci5pc0Fubm90YXRpb24oKSkgew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJDQotCQkJYW5uID0gKEFubm90YXRpb24pbW9kaWZpZXI7DQotCQkJaWYgKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lbmRzV2l0aChhbm4uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpIHsNCi0JCQkJcmV0dXJuIGFubjsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIGZpbmRQYXJhbWV0ZXIoZmluYWwgQm9keURlY2xhcmF0aW9uIHRkLCBUIGphdmFFbGVtZW50KQ0KLQl7DQotCQlpZiAodGQgIT0gbnVsbCkNCi0JCXsNCi0JCQlmb3IgKE9iamVjdCBwYXJhbSA6ICgoTWV0aG9kRGVjbGFyYXRpb24pdGQpLnBhcmFtZXRlcnMoKSkNCi0JCQl7DQotCQkJCWlmIChwYXJhbSBpbnN0YW5jZW9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gJiYNCi0JCQkJCQkoKElUeXBlUGFyYW1ldGVyKWphdmFFbGVtZW50KS5nZXRFbGVtZW50TmFtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCgoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbilwYXJhbSkuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pcGFyYW07DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IEFubm90YXRpb24gZmluZFBhcmFtQW5ub3RhdGlvbihmaW5hbCBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtLCBmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uLCBUIGphdmFFbGVtZW50KQ0KLQl7DQotCQlBbm5vdGF0aW9uIGFubjsNCi0JCWZvciAoSUV4dGVuZGVkTW9kaWZpZXIgbW9kaWZpZXIgOiAoTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4pKHBhcmFtLm1vZGlmaWVycygpKSkgDQotCQl7DQotCQkJaWYoIW1vZGlmaWVyLmlzQW5ub3RhdGlvbigpKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlhbm4gPSAoQW5ub3RhdGlvbiltb2RpZmllcjsNCi0JCQlpZiAoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVuZHNXaXRoKGFubi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSkgew0KLQkJCQlyZXR1cm4gYW5uOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgZ2V0Q3UoZmluYWwgSUphdmFFbGVtZW50IGphdmFFbGVtZW50KQ0KLQl7DQotCQlzd2l0Y2ggKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIA0KLQkJew0KLQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRToNCi0JCQlyZXR1cm4gKChJVHlwZSkgamF2YUVsZW1lbnQpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJY2FzZSBJSmF2YUVsZW1lbnQuRklFTEQ6DQotCQkJcmV0dXJuICgoSUZpZWxkKSBqYXZhRWxlbWVudCkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQljYXNlIElKYXZhRWxlbWVudC5NRVRIT0Q6DQotCQkJcmV0dXJuICgoSU1ldGhvZCkgamF2YUVsZW1lbnQpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRV9QQVJBTUVURVI6DQotCQkJcmV0dXJuICgoSVR5cGVQYXJhbWV0ZXIpIGphdmFFbGVtZW50KS5nZXREZWNsYXJpbmdNZW1iZXIoKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByaXZhdGUgRWRpdFJlc291cmNlc01hbmFnZXIgZWRpdFJlc01hbmFnZXIoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IEVkaXRSZXNvdXJjZXNNYW5hZ2VyKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZDhkODM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotDQotLyoqDQotICogSW50ZXJmYWNlIHJlcHJlc2VudGluZyBDb21wbGV4IEFubm90YXRpb24gY29uc2lzdGluZyBvZiBwYXJhbS12YWx1ZSBwYWlycy4NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElBbm5vdGF0aW9uPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+DQotew0KLQkvKioNCi0JICogUmV0dXJuIHRoZSBwYXJhbS12YWx1ZSBwYWlycyB3aGljaCB0aGlzIEFubm90YXRpb24gaGFzLg0KLQkgKiANCi0JICogQHJldHVybiBTZXQgb2YgcGFyYW0tdmFsdWVzIHBhaXJzLg0KLQkgKi8NCi0JcHVibGljIFNldDxJUGFyYW1WYWx1ZVBhaXI+IGdldFBhcmFtVmFsdWVQYWlycygpOw0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgd2l0aCBuYW1lIHBhcmFtLiANCi0JICogQHBhcmFtIHBhcmFtIC0gdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB3aG8ncyB2YWx1ZSBpcyByZXF1ZXN0ZWQNCi0JICogQHJldHVybiAtIHRoZSB2YWx1ZSByZXByZXNlbnRlZCBhcyBhIHN0cmluZy4gTnVsbCBpZiBzdWNoIHBhcmFtZXRlciBjYW5ub3QgYmUgZm91bmQgb3IgaGFzIGEgdmFsdWUgb2YgbnVsbC4NCi0JICogQHRocm93cyAtIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHBhcmFtIGlzIG51bGwNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZShTdHJpbmcgcGFyYW0pOw0KLQkJDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBULCB0byB3aGljaCB0aGlzIGFubm90YXR0aW9uIGlzIGFzc29jaWF0ZWQuDQotCSAqLw0KLSAgICBwdWJsaWMgVCBnZXRBcHBsaWVkRWxlbWVudCgpOw0KLSAgICAgICAgDQotICAgIA0KLS8vRnJvbSBJQW5ub3RhdHRpb25CYXNlICAgIA0KLQkvKioNCi0JICogQHJldHVybiAtIGFubm90YXRpb24gbmFtZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOw0KLQkNCi0JLyoqDQotCSAqIEdldHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IGxvY2F0aW9uIGluIHRoZSBzb3VyY2UgY29kZS4NCi0JICogDQotCSAqIEByZXR1cm4gSUxvY2F0b3INCi0JICovDQotCXB1YmxpYyBJTG9jYXRvciBnZXRMb2NhdG9yKCk7DQotCQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uQmFzZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbkJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmY5MDBkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247DQotDQotLyoqDQotICogQmFzZSBpbnRlcmZhY2UgcmVwcmVzZW50aW5nIEFubm90YXRpb24gYW5kIHRoZSBmdW5jdGlvbmFsaXR5LCByZXF1aXJlZCBieSBpdC4NCi0gKg0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUFubm90YXRpb25CYXNlPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+DQotew0KLQkvKiogc2ltcGxlIGFubm90YXRpb24gdHlwZSBJRCAqLw0KLQlwdWJsaWMgZmluYWwgaW50IFNJTVBMRV9BTk5PVEFUSU9OID0gMTsNCi0NCi0JLyoqIHNpbmdsZSBlbGVtZW50IGFubm90YXRpb24gdHlwZSBJRCAqLw0KLQlwdWJsaWMgZmluYWwgaW50IFNJTkdMRV9FTEVNRU5UX0FOTk9UQVRJT04gPSAyOw0KLQ0KLQkvKiogY29tcGxleCBhbm5vdGF0aW9uIHR5cGUgSUQgKi8NCi0JcHVibGljIGZpbmFsIGludCBDT01QTEVYX0FOTk9UQVRJT04gPSA0Ow0KLQ0KLQkvKioNCi0JICogQHJldHVybiAtIGFubm90YXRpb24gbmFtZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOw0KLQ0KLQkvKioNCi0JICogR2V0dGluZyB0aGUgVHlwZUlEIG9mIGN1cnJlbnQgQW5ub3RhdGlvbg0KLQkgKiANCi0JICogQHJldHVybiBJbnRlZ2VyIHZhbHVlLCB3aGljaCByZXByZXNlbnRzIHRoZSBBbm5vdGF0aW9uIFR5cGVJRA0KLQkgKi8NCi0JcHVibGljIGludCBnZXRUeXBlKCk7DQotCQ0KLQkvKioNCi0JICogQWRkcyBjdXJyZW50IEFubm90YXRpb24gdG8gc3BlY2lmaWMgSUphdmFFbGVtZW50LiBJdCBpcyBub3QgcG9zc2libGUgdG8gaGF2ZSBJTWVtYmVyIGFzIHBhcmFtZXRlciBiZWNhdXNlIHRoZXJlIGlzIElUeXBlUGFyYW1ldGVyIGFzIHBhcmFtZXRlciB3aGVuIGFkZCB0byBUeXBQYXJhbWV0ZXIgaXMgZXhlY3V0ZWQuDQotCSAqIA0KLQkgKiBAcGFyYW0gamF2YUVsZW1lbnQNCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPHR0PmphdmFFbGVtZW50PC90dD4gaXMgbnVsbC4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4gaXMgbm90IG9mIHRoZSBjb3JyZWN0IHR5cGUuIFN1cHBvcnRlZCB0eXBlcyBhcmU6IElUeXBlLCBJTWV0aG9kLCBJRmllbGQsIElUeXBlUGFyYW1ldGVyLg0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRBcHBsaWVkRWxlbWVudChUIGphdmFFbGVtZW50KSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbjsNCi0JDQotCS8qKg0KLQkgKiBSZW1vdmUgdGhlIGN1cnJlbnQgQW5ub3RhdGlvbiBmcm9tIHRoZSBhc3NvY2lhdGVkIEphdmFFbGVtZW50Lg0KLQkgKiANCi0JICogQHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiANCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB0aHJvd3MgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbjsNCi0JDQotCS8qKg0KLQkgKiBHZXRzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBsb2NhdGlvbiBpbiB0aGUgc291cmNlIGNvZGUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIElMb2NhdG9yDQotCSAqLw0KLQlwdWJsaWMgSUxvY2F0b3IgZ2V0TG9jYXRvcigpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uSW5zcGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uSW5zcGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzZjA1ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbkluc3BlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElBbm5vdGF0aW9uSW5zcGVjdG9yDQotew0KLQkvKioNCi0JICogUmV0cmlldmVzIGFsbCBUeXBlIGxldmVsIEFubm90YXRpb25zIGZyb20gPGNvZGU+dHlwZTwvY29kZT4sIHdoaWNoIGlzIHVzZWQgdG8gaW5zdGFudGlhdGUgdGhlIElBbm5vdGF0aW9uSW5zcGVjdG9yLg0KLQkgKiANCi0JICogQHJldHVybiBjb250YWluZWQgVHlwZSBsZXZlbCBBbm5vdGF0aW9ucyBpbiA8Y29kZT50eXBlPC9jb2RlPiBvciBlbXB0eSBDb2xsZWN0aW9uIGlmIG5vdCBwcmVzZW50Lg0KLQkgKg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGluc3BlY3RUeXBlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlcyBhIFR5cGUgbGV2ZWwgQW5ub3RhdGlvbiB3aXRoIHNwZWNpZmljIFFOYW1lIGZyb20gPGNvZGU+dHlwZTwvY29kZT4sIHdoaWNoIGlzIHVzZWQgdG8gaW5zdGFudGlhdGUgdGhlIElBbm5vdGF0aW9uSW5zcGVjdG9yLg0KLQkgKiANCi0JICogQHBhcmFtIGFubm90YXRpb25RTmFtZSAtIHNwZWNpZmllZCBRTmFtZSBmb3IgdGhlIEFubm90YXRpb24uDQotCSAqIA0KLQkgKiBAcmV0dXJuIFR5cGUgbGV2ZWwgQW5ub3RhdGlvbiBpbiA8Y29kZT50eXBlPC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPiwgaWYgc3VjaCBBbm5vdGF0aW9uIGRvIG5vdCBwcmVzZW50Lg0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5hbm5vdGF0aW9uUU5hbWU8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5hbm5vdGF0aW9uUU5hbWU8L2NvZGU+IGlzIGVtcHR5IFN0cmluZy4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCUlBbm5vdGF0aW9uPElUeXBlPiBpbnNwZWN0VHlwZShmaW5hbCBTdHJpbmcgYW5ub3RhdGlvblFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogUmV0cmlldmVzIGFsbCBNZXRob2QgbGV2ZWwgQW5ub3RhdGlvbnMgZnJvbSA8Y29kZT5tZXRob2Q8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIG1ldGhvZA0KLQkgKiANCi0JICogQHJldHVybiBjb250YWluZWQgTWV0aG9kIGxldmVsIEFubm90YXRpb25zIGluIDxjb2RlPm1ldGhvZDwvY29kZT4gb3IgZW1wdHkgQ29sbGVjdGlvbiBpZiBub3QgcHJlc2VudC4NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPHR0Pm1ldGhvZDwvdHQ+IGlzIG51bGwuDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLSAgIENvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IGluc3BlY3RNZXRob2QoSU1ldGhvZCBtZXRob2QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZXMgYSBNZXRob2QgbGV2ZWwgQW5ub3RhdGlvbiB3aXRoIHNwZWNpZmljIFFOYW1lIGZyb20gPGNvZGU+bWV0aG9kPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSBtZXRob2QNCi0JICogQHBhcmFtIGFubm90YXRpb25RTmFtZSAtIHNwZWNpZmllZCBRTmFtZSBmb3IgdGhlIEFubm90YXRpb24uDQotCSAqIA0KLQkgKiBAcmV0dXJuIGNvbnRhaW5lZCBNZXRob2QgbGV2ZWwgQW5ub3RhdGlvbiBpbiA8Y29kZT5tZXRob2Q8L2NvZGU+IG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8dHQ+bWV0aG9kPC90dD4gb3IgPGNvZGU+YW5ub3RhdGlvblFOYW1lPC9jb2RlPiBhcmUgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmFubm90YXRpb25RTmFtZTwvY29kZT4gaXMgZW1wdHkgU3RyaW5nLg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0gIElBbm5vdGF0aW9uPElNZXRob2Q+IGluc3BlY3RNZXRob2QoSU1ldGhvZCBtZXRob2QsIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQotDQotICAgIC8qKg0KLQkgKiBSZXRyaWV2ZXMgYWxsIEZpZWxkIGxldmVsIEFubm90YXRpb25zIGZyb20gPGNvZGU+ZmllbGQ8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIGZpZWxkDQotCSAqIA0KLQkgKiBAcmV0dXJuIGNvbnRhaW5lZCBGaWxlZCBsZXZlbCBBbm5vdGF0aW9ucyBpbiA8Y29kZT5maWVsZDwvY29kZT4gb3IgZW1wdHkgQ29sbGVjdGlvbiBpZiBub3QgcHJlc2VudC4NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+ZmllbGQ8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0gIENvbGxlY3Rpb248SUFubm90YXRpb248SUZpZWxkPj4gaW5zcGVjdEZpZWxkKElGaWVsZCBmaWVsZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsNCi0gICANCi0gICAgLyoqDQotCSAqIFJldHJpZXZlcyBhIEZpZWxkIGxldmVsIEFubm90YXRpb24gd2l0aCBzcGVjaWZpYyBRTmFtZSBmcm9tIDxjb2RlPmZpZWxkPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSBmaWVsZA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvblFOYW1lIC0gc3BlY2lmaWVkIFFOYW1lIGZvciB0aGUgQW5ub3RhdGlvbi4NCi0JICogDQotCSAqIEByZXR1cm4gY29udGFpbmVkIEZpbGVkIGxldmVsIEFubm90YXRpb25zIGluIDxjb2RlPmZpZWxkPC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+ZmllbGQ8L2NvZGU+IG9yIDxjb2RlPmFubm90YXRpb25RTmFtZTwvY29kZT4gYXJlIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5hbm5vdGF0aW9uUU5hbWU8L2NvZGU+IGlzIGVtcHR5IFN0cmluZy4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotICBJQW5ub3RhdGlvbjxJRmllbGQ+IGluc3BlY3RGaWVsZChJRmllbGQgZmllbGQsIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQotDQotICAgIC8qKg0KLQkgKiBSZXRyaWV2ZXMgYWxsIFR5cGVQYXJhbWV0ZXIgbGV2ZWwgQW5ub3RhdGlvbnMgZnJvbSA8Y29kZT5wYXJhbTwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gcGFyYW0NCi0JICogDQotCSAqIEByZXR1cm4gY29udGFpbmVkIFR5cGVQYXJhbWV0ZXIgbGV2ZWwgQW5ub3RhdGlvbnMgaW4gPGNvZGU+cGFyYW08L2NvZGU+IG9yIGVtcHR5IENvbGxlY3Rpb24gaWYgbm90IHByZXNlbnQuDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPnBhcmFtPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotICBDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPj4gaW5zcGVjdFBhcmFtKElUeXBlUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLSAgIA0KLSAgICAvKioNCi0JICogUmV0cmlldmVzIGEgVHlwZVBhcmFtZXRlciBsZXZlbCBBbm5vdGF0aW9uIHdpdGggc3BlY2lmaWMgUU5hbWUgZnJvbSA8Y29kZT5wYXJhbTwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gcGFyYW0NCi0JICogQHBhcmFtIGFubm90YXRpb25RTmFtZSAtIHNwZWNpZmllZCBRTmFtZSBmb3IgdGhlIEFubm90YXRpb24uDQotCSAqIA0KLQkgKiBAcmV0dXJuIGNvbnRhaW5lZCBUeXBlUGFyYW1ldGVyIGxldmVsIEFubm90YXRpb25zIGluIDxjb2RlPnBhcmFtPC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+cGFyYW08L2NvZGU+IG9yIDxjb2RlPmFubm90YXRpb25RTmFtZTwvY29kZT4gYXJlIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5hbm5vdGF0aW9uUU5hbWU8L2NvZGU+IGlzIGVtcHR5IFN0cmluZy4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotICBJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gaW5zcGVjdFBhcmFtKElUeXBlUGFyYW1ldGVyIHBhcmFtLCBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvblFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLSAgIA0KLSAgIA0KLSAgIA0KLQkNCi0vLwkvKioNCi0vLwkgKiBSZXRyaWV2ZXMgYWxsIGFubm90YXRpb25zIGZyb20gPGNvZGU+amF2YUVsZW1lbnQ8L2NvZGU+Lg0KLS8vCSAqIA0KLS8vCSAqIEBwYXJhbSBqYXZhRWxlbWVudA0KLS8vCSAqIA0KLS8vCSAqIEByZXR1cm4gY29udGFpbmVkIGFubm90YXRpb25zIGluIDxjb2RlPmphdmFFbGVtZW50PC9jb2RlPiBvciBlbXB0eSBDb2xsZWFjdGlvbiBpZiBub3QgcHJlc2VudC4NCi0vLwkgKiANCi0vLwkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDx0dD5qYXZhRWxlbWVudDwvdHQ+IGlzIG51bGwuDQotLy8JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4gaXMgbm90IG9mIHRoZSBjb3JyZWN0IHR5cGUuIFN1cHBvcnRlZCB0eXBlcyBhcmU6IEl0eXBlLCBJTWV0aG9kLCBJRmllbGQuDQotLy8JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0vLwkgKi8NCi0vLwlwdWJsaWMgQ29sbGVjdGlvbjxJQW5ub3RhdGlvbj4gaW5zcGVjdChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb25Qcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvblByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiOTBiY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvblByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQXR0cmlidXRlVHlwZUVudW07DQotDQotcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvblByb3BlcnR5DQotew0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCk7DQotDQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpOw0KLQkNCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpOw0KLQkNCi0JcHVibGljIEF0dHJpYnV0ZVR5cGVFbnVtIGdldEF0dHJpYnV0ZVR5cGUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2NjNzY5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Bbm5vdGF0aW9uUHJvcGVydHk7DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBhbm5vdGF0aW9ucyBjb250YWluZXIuDQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXINCi17DQotCXB1YmxpYyB2b2lkIGFkZEFubm90YXRpb25Qcm9wZXJ0eShmaW5hbCBBbm5vdGF0aW9uUHJvcGVydHkgYW5ub3RhdGlvblByb3BlcnR5LCBmaW5hbCBFbGVtZW50VHlwZSB0YXJnZXQpOw0KLQkNCi0JcHVibGljIFNldDxJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4+IGdldFBhcmFtZXRlckFubm90YXRpb25zKElUeXBlUGFyYW1ldGVyIHRQYXJhbSk7DQotDQotCXB1YmxpYyBTZXQ8SUFubm90YXRpb248SVR5cGU+PiBnZXRUeXBlQW5ub3RhdGlvbnMoSVR5cGUgdHlwZSk7DQotDQotCXB1YmxpYyBTZXQ8SUFubm90YXRpb248SU1ldGhvZD4+IGdldE1ldGhvZEFubm90YXRpb25zKElNZXRob2QgbWV0aG9kKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JTG9jYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNDc2MzZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zOw0KLQ0KLS8qKg0KLSAqIENsYXNzIHRoYXQgaG9sZHMgaW5mb3JtYXRpb24gdG8gbG9jYXRlIHNwZWNpZmljIHJlZ2lvbiBpbiB0aGUgc291cmNlIGNvZGUgDQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElMb2NhdG9yDQotew0KLQkvKioNCi0JICogQHJldHVybiB0aGUgbGluZSBudW1iZXIgaW4gdGhlIHNvdXJjZSB3aGVyZSB0aGUgcmVnaW9uIHBvaW50ZWQgYnkgdGhpcyBsb2NhdG9yIHN0YXJ0cyAgDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKTsNCi0JDQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoaXMgcmVnaW9uIGluIHNvdXJjZSBjb2RlDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldFN0YXJ0UG9zaXRpb24oKTsNCi0JDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHJlZ2lvbg0KLQkgKi8NCi0JcHVibGljIGludCBnZXRMZW5ndGgoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JUGFyYW1WYWx1ZVBhaXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSVBhcmFtVmFsdWVQYWlyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmZTZlNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JUGFyYW1WYWx1ZVBhaXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSByZXByZXNlbnRpbmcgcGFyYW0gdmFsdWUgcGFpciBpbiBhbm5vdGF0aW9uLiBQYXJhbSB2YWx1ZSBwYWlyIGhhcyB0aGUgZm9sbG93aW5nIGZvcm06IHBhcmFtPXZhbHVlDQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotcHVibGljIGludGVyZmFjZSBJUGFyYW1WYWx1ZVBhaXINCi17DQotCS8qKg0KLQkgKiBAcmV0dXJuIHBhcmFtIG5hbWUNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyYW0oKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIHZhbHVlDQotCSAqLw0KLQlwdWJsaWMgSVZhbHVlIGdldFZhbHVlKCk7DQotCQ0KLQkvKioNCi0JICogR2V0cyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgbG9jYXRpb24gaW4gdGhlIHNvdXJjZSBjb2RlLg0KLQkgKiANCi0JICogQHJldHVybiBJTG9jYXRvcg0KLQkgKi8NCi0JcHVibGljIElMb2NhdG9yIGdldExvY2F0b3IoKTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JVmFsdWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyYzRhNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSByZXByZXNlbnRpbmcgYXJ0aWZhY3QgdmFsdWUgaW4gYW5ub3RhdGlvbi4NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElWYWx1ZQ0KLXsNCi0JLyoqDQotCSAqIE9idGFpbnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHZhbHVlLiBUaGUgb2J0YWluZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGNhbiBsYXRlciBvbiBiZSB1c2VkIHRvIGluc3RhbnRpYXRlDQotCSAqIGFuIGluc3RhbmNlIG9mIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgY29uc2lkZWRlcmVkIGVxdWFsIHRvIHRoZSByZXR1cm5lZCB2YWx1ZS4NCi0JICogPHA+DQotCSAqIAk8Yz5AQW5ub3RhdGlvbkV4YW1wbGUoMSk8L2M+IC8vYW5ub2F0aW9uIHdpdGggb25lIGF0dHJpYnV0ZS9wYXJhbWV0ZXIgY2FsbGVkICJ2YWx1ZSIgd2l0aCB2YWx1ZSBvZiAiMSIuIA0KLQkgKiA8L3A+DQotCSAqIFRoZSB0b1N0cmluZyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHN0cmluZyAiMSIsIHdoaWNoIGNhbiBsYXRlciBvbiBiZSB1c2VkIGJ5IEludGVnZXIucGFyc2UoU3RyaW5nKSB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgSW50ZWdlcg0KLQkgKiBlcXVhbCB0byB0aGUgdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhlIGludGVnZXIgbGl0ZXJhbCAxDQotCSAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHZhbHVlDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCk7DQotCQ0KLQkvKioNCi0JICogR2V0cyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgbG9jYXRpb24gaW4gdGhlIHNvdXJjZSBjb2RlLg0KLQkgKiANCi0JICogQHJldHVybiBJTG9jYXRvcg0KLQkgKi8NCi0JcHVibGljIElMb2NhdG9yIGdldExvY2F0b3IoKTsNCi0JDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvY2xhenovQVNUVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvY2xhenovQVNUVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjhkNTAwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2NsYXp6L0FTVFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuY2xheno7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFBhcnNlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRmllbGREZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5GaWxlVXRpbHM7DQotDQotLyoqDQotICogVXRpbGl0eSBjbGFzcyB0aGF0IHByb3ZpZGVzIGhlbHBlciBtZXRob2RzIGZvciB7QGxpbmsgQVNUfSBwcm9jZXNzaW5nLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQVNUVXRpbHMgDQotew0KLQlwcml2YXRlIHN0YXRpYyBBU1RVdGlscyBpbnN0YW5jZTsNCi0JDQotCXByaXZhdGUgQVNUVXRpbHMoKSB7DQotCQkvLyBkaXNhYmxlIGNvbnN0cnVjdGlvbg0KLQl9DQotCQ0KLQkvKioNCi0JICogQHJldHVybiBjcmVhdGUgbmV3IGluc3RhbmNlIGZvciB0aGlzIHV0aWxpdHkNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgQVNUVXRpbHMgZ2V0SW5zdGFuY2UoKSB7DQotCQlpZihpbnN0YW5jZT09bnVsbCkgew0KLQkJCWluc3RhbmNlID0gbmV3IEFTVFV0aWxzKCk7IA0KLQkJfQ0KLQkJcmV0dXJuIGluc3RhbmNlOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ3JlYXRlcyBBU1QgdHJlZSBvdXQgb2Yge0BsaW5rIEZpbGV9IGluc3RhbmNlLg0KLQkgKiBAcGFyYW0gc291cmNlRmlsZSBqYXZhIGNsYXNzIGZpbGUgIA0KLQkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yDQotCSAqIEByZXR1cm4gY3JlYXRlZCB7QGxpbmsgQVNUTm9kZX0NCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIEFTVE5vZGUgY3JlYXRlQVNUKGZpbmFsIEZpbGUgc291cmNlRmlsZSwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKHNvdXJjZUZpbGUsICJzb3VyY2VGaWxlIik7IC8vJE5PTi1OTFMtMSQNCi0JCQ0KLQkJZmluYWwgQVNUUGFyc2VyIHBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOw0KLQkJcGFyc2VyLnNldFNvdXJjZShGaWxlVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRGaWxlQ29udGVudChzb3VyY2VGaWxlKS50b0NoYXJBcnJheSgpKTsNCi0JCXJldHVybiBwYXJzZXIuY3JlYXRlQVNUKG1vbml0b3IpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIHtAbGluayBBU1R9IHRyZWUgb3V0IG9mIHtAbGluayBJVHlwZX0gaW5zdGFuY2UuDQotCSAqIEBwYXJhbSBzb3VyY2VUeXBlIGphdmEgY2xhc3MNCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvcg0KLQkgKiBAcmV0dXJuIGNyZWF0ZWQge0BsaW5rIEFTVE5vZGV9IGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZUN1LCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKHNvdXJjZUN1LCAic291cmNlQ3UiKTsgLy8kTk9OLU5MUy0xJA0KLQkJZmluYWwgQVNUUGFyc2VyIHBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOw0KLQkJcGFyc2VyLnNldFNvdXJjZShzb3VyY2VDdSk7DQotCQlwYXJzZXIuc2V0QmluZGluZ3NSZWNvdmVyeShmYWxzZSk7DQotCQlyZXR1cm4gKENvbXBpbGF0aW9uVW5pdClwYXJzZXIuY3JlYXRlQVNUKG1vbml0b3IpOw0KLQl9CQkNCi0JDQotCS8qKg0KLQkgKiBGaW5kcyB7QGxpbmsgRmllbGREZWNsYXJhdGlvbn0gaW4ge0BsaW5rIFR5cGVEZWNsYXJhdGlvbn0gd2l0aCBuYW1lIDxjb2RlPmZpZWxkVHlwZS5nZXRFbGVtZW50TmFtZSgpPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSBmaWVsZFR5cGUNCi0JICogQHBhcmFtIHR5cGVEZWNsYXJhdGlvbg0KLQkgKiBAcmV0dXJuIGZvdW5kIG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JcHVibGljIEZpZWxkRGVjbGFyYXRpb24gZ2V0RmllbGREZWNsYXJhdGlvbihmaW5hbCBJRmllbGQgZmllbGRUeXBlLCBmaW5hbCBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKQ0KLQl7DQotCQlmb3IgKEZpZWxkRGVjbGFyYXRpb24gZmQgOiB0eXBlRGVjbGFyYXRpb24uZ2V0RmllbGRzKCkpDQotCQl7DQotCQkJZm9yIChPYmplY3QgZnIgOiBmZC5mcmFnbWVudHMoKSkNCi0JCQl7DQotCQkJCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2ZGYgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcjsNCi0JCQkJaWYgKHZkZi5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGZpZWxkVHlwZS5nZXRFbGVtZW50TmFtZSgpKSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIGZkOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIGJvb2xlYW4gY29tcGFyZU1ldGhvZFBhcmFtcyhmaW5hbCBJTWV0aG9kIG1ldGhvZFR5cGUsIGZpbmFsIE1ldGhvZERlY2xhcmF0aW9uIG1kKQ0KLQl7DQotCQlMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IGxpc3QgPSBtZC5wYXJhbWV0ZXJzKCk7DQotCQlpZiAobGlzdC5zaXplKCkgPT0gbWV0aG9kVHlwZS5nZXROdW1iZXJPZlBhcmFtZXRlcnMoKSkNCi0JCXsNCi0JCQlTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZFR5cGUuZ2V0UGFyYW1ldGVyVHlwZXMoKTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspDQotCQkJew0KLQkJCQlpZiAoIWlzU2FtZVBhcmFtKHBhcmFtZXRlclR5cGVzW2ldLCAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgbGlzdC5nZXQoaSkpKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCX0NCi0JCQl9DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCXByaXZhdGUgYm9vbGVhbiBpc1NhbWVQYXJhbShmaW5hbCBTdHJpbmcgdHlwZSwgZmluYWwgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBzdkRlY2wpDQotCXsNCi0JCXJldHVybiB0eXBlLmVxdWFscyhnZXRUeXBlU2lnbmF0dXJlKHN2RGVjbCkpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0cmlldmVzIHR5cGUgc2lnbmF0dXJlIGZyb20ge0BsaW5rIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb259LiBBcyB7QGxpbmsgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbn0gcmV0dXJucyBvbmx5IHRoZSBjbGVhbiB0eXBlIGluIGNhc2UNCi0JICogZGVjbGFyYXRpb24gb2YgdHlwZSA8dHQ+aW50IHBhcmFBcnJbXVtdPC90dD4gaXMgaW4gY29kZSB0aGUgbWV0aG9kIGFkZHMgYXJyYXkgaWRlbnRpZmllcnMgZm9yIHR5cGUgZGVjbGFyYXRpb24gaW50IHRoaXMgY2FzZS4NCi0JICogDQotCSAqIEBwYXJhbSBzdkRlY2wNCi0JICogQHJldHVybiB0aGUgc2lnbmF0eXJlIGZvciB0aGUgdHlwZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRUeXBlU2lnbmF0dXJlKGZpbmFsIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gc3ZEZWNsKQ0KLQl7DQotCQlTdHJpbmcgdHlwZU5hbWUgPSBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZShzdkRlY2wuZ2V0VHlwZSgpLnRvU3RyaW5nKCksIGZhbHNlKTsNCi0NCi0JCWlmIChzdkRlY2wuZ2V0RXh0cmFEaW1lbnNpb25zKCkgPiAwICYmIHR5cGVOYW1lLmluZGV4T2YoJ1snKSA9PSAtMSkNCi0JCXsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN2RGVjbC5nZXRFeHRyYURpbWVuc2lvbnMoKTsgaSsrKQ0KLQkJCXsNCi0JCQkJdHlwZU5hbWUgPSAiWyIgKyB0eXBlTmFtZTsvLyAkSkwtU1RSX0NPTkNBVCQgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiB0eXBlTmFtZTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEZpbmRzIHtAbGluayBNZXRob2REZWNsYXJhdGlvbn0gaW4ge0BsaW5rIFR5cGVEZWNsYXJhdGlvbn0gaGF2aW5nIG5hbWUgPGNvZGU+bWV0aG9kVHlwZS5nZXRFbGVtZW50TmFtZSgpPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSBtZXRob2RUeXBlDQotCSAqIEBwYXJhbSB0eXBlRGVjbGFyYXRpb24NCi0JICogQHJldHVybiBmb3VuZCBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICovDQotCXB1YmxpYyAgTWV0aG9kRGVjbGFyYXRpb24gZ2V0TWV0aG9kRGVjbGFyYXRpb24oZmluYWwgSU1ldGhvZCBtZXRob2RUeXBlLCBmaW5hbCBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKQ0KLQl7DQotCQlmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1kIDogdHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKSkNCi0JCXsNCi0JCQlpZiAobWQuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhtZXRob2RUeXBlLmdldEVsZW1lbnROYW1lKCkpKQ0KLQkJCXsNCi0JCQkJaWYgKGNvbXBhcmVNZXRob2RQYXJhbXMobWV0aG9kVHlwZSwgbWQpKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gbWQ7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHJpZXZlcyB7QGxpbmsgVHlwZURlY2xhcmF0aW9ufSBmcm9tIHtAbGluayBDb21waWxhdGlvblVuaXR9IHdpdGggbmFtZSA8dHQ+Y2xhc3NOYW1lPC90dD4NCi0JICogDQotCSAqIEBwYXJhbSBjbGFzc05hbWUNCi0JICogQHBhcmFtIHVuaXQNCi0JICogQHJldHVybiBmb3VuZCB7QGxpbmsgVHlwZURlY2xhcmF0aW9ufSBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXB1YmxpYyBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgQ29tcGlsYXRpb25Vbml0IHVuaXQpDQotCXsNCi0JCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IG51bGw7DQotCQkvLyBsb29raW5nIHVwIHRoZSBzZWxlY3RlZCB0eXBlDQotCQlmb3IgKE9iamVjdCB0eXBlT2JqZWN0IDogdW5pdC50eXBlcygpKQ0KLQkJew0KLQkJCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHRtcFR5cGVEZWNsYXJhdGlvbiA9IChBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbikgdHlwZU9iamVjdDsNCi0JCQlpZiAodG1wVHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKSkNCi0JCQl7DQotCQkJCXR5cGVEZWNsYXJhdGlvbiA9IHRtcFR5cGVEZWNsYXJhdGlvbjsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlpZiAodHlwZURlY2xhcmF0aW9uID09IG51bGwpDQotCQl7DQotCQkJTGlzdDxBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbj4gbGlzdCA9IHVuaXQudHlwZXMoKTsNCi0JCQl0eXBlRGVjbGFyYXRpb24gPSBnZXRJbm5lckNsYXNzKGxpc3QudG9BcnJheShuZXcgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb25bbGlzdC5zaXplKCldKSwgY2xhc3NOYW1lKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbjsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBnZXRJbm5lckNsYXNzKGZpbmFsIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uW10gdHlwZXMsIGZpbmFsIFN0cmluZyBjbGFzc05hbWUpDQotCXsNCi0JCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7DQotCQlmb3IgKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGFic3RyYWN0VHlwZSA6IHR5cGVzKQ0KLQkJew0KLQkJCWlmIChhYnN0cmFjdFR5cGUuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhjbGFzc05hbWUpKSB7DQotCQkJCXJldHVybiBhYnN0cmFjdFR5cGU7DQotCQkJfQ0KLQ0KLQkJCWlmICghKGFic3RyYWN0VHlwZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikpIHsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCQ0KLQkJCXJlc3VsdCA9IGdldElubmVyQ2xhc3MoKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uW10pICgoVHlwZURlY2xhcmF0aW9uKSBhYnN0cmFjdFR5cGUpLmdldFR5cGVzKCksIGNsYXNzTmFtZSk7DQotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG51bGw7DQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZG9tL3ZhbGlkYXRpb24vRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9kb20vdmFsaWRhdGlvbi9Eb21WYWxpZGF0aW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlYTdiNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9kb20vdmFsaWRhdGlvbi9Eb21WYWxpZGF0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5kb20udmFsaWRhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgRG9tVmFsaWRhdGlvbkNvbnN0YW50cyANCi17DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktFUl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLldzVmFsaWRhdG9yTWFya2VyIjsgLy8kTk9OLU5MUy0xJA0KLQkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTEVNRU5UQVRJT04gPSAiaW1wbGVtZW50YXRpb24iOyAvLyROT04tTkxTLTEkDQotCQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU19DT05TVFJBSU5UX0lEID0gIndlYlNlcnZpY2VDb25zdHJhaW50IjsgLy8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUF9DT05TVFJBSU5UX0lEID0gIndlYlBhcmFtQ29uc3RyYWludCI7IC8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01fQ09OU1RSQUlOVF9JRCA9ICJ3ZWJNZXRob2RDb25zdHJhaW50IjsgLy8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUlfQ09OU1RSQUlOVF9JRCA9ICJzZWlDb25zdHJhaW50IjsgLy8kTk9OLU5MUy0xJA0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2V4Y2VwdGlvbi9Mb2NhbGl6ZWRFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZXhjZXB0aW9uL0xvY2FsaXplZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxY2UwODQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZXhjZXB0aW9uL0xvY2FsaXplZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLQ0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgaXMgYmFzZSBjbGFzcyBmb3IgYWxsIENIRUNLRUQgZXhjZXB0aW9ucyBmb3IgdGhlIFdTIFRvb2xzDQotICogdG9vbHNldC4gVGhpcyBleGNlcHRpb24gY29ycmVjdGx5IG92ZXJyaWRlcyBnZXRMb2NhbGl6ZWRNZXNzYWdlKCkNCi0gKiBvZiBFeGNlcHRpb24gY2xhc3MgYW5kIHByb3ZpZGUgcHJvcGVyIGxvY2FsaXplZCBtZXNzYWdlLg0KLSAqIFRvIGFjaGlldmUgdGhhdCB0aGVyZSBpcyBhIGxpbWl0YXRpb24gLSBpdCB3aWxsIGJlIGltcG9zc2libGUgdG8gcmV0dXJuIGxvY2FsaXplZA0KLSAqIG1lc3NhZ2UgaWYgaXQgaGF2ZW4ndCBiZWVuIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igb2YgZXhjZXB0aW9uLCBzbyB0aGVyZSBpcyBubw0KLSAqIGNvbnN0cnVjdG9yIHdpdGhvdXQgbG9jYWxpemVkIG1lc3NhZ2UuDQotICogDQotICogQGF1dGhvciBNbGFkZW4gVG9tb3YNCi0gKiovDQotDQotcHVibGljIGNsYXNzIExvY2FsaXplZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOw0KLQkNCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbG9jYWxpemVkTWVzc2FnZTsNCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RzIGV4Y2VwdGlvbiB3aXRoIGFiaWxpdHkgdG8gcHJvdmlkZSBsb2NhbGl6ZWQgbWVzc2FnZQ0KLQkgKiBAcGFyYW0gbWVzc2FnZSAtIHRoZSBkZXRhaWwgbWVzc2FnZSAod2hpY2ggaXMgc2F2ZWQgZm9yIGxhdGVyIHJldHJpZXZhbA0KLSAgICAgKiAgICAgICAgIGJ5IHRoZSB7QGxpbmsgI2dldE1lc3NhZ2UoKX0gbWV0aG9kKQ0KLQkgKiBAcGFyYW0gbG9jYWxpemVkTWVzc2FnZSAtIHRoZSBsb2NhbGl6ZWQgbWVzc2FnZSAod2hpY2ggaXMgc2F2ZWQgZm9yIGxhdGVyIHJldHJpZXZhbA0KLSAgICAgKiAgICAgICAgIGJ5IHRoZSB7QGxpbmsgI2dldExvY2FsaXplZE1lc3NhZ2UoKX0gbWV0aG9kKQ0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgLSBpbiBjYXNlIGxvY2FsaXplZCBtZXNzYWdlIGlzIG51bGwNCi0JICogKi8NCi0JcHVibGljIExvY2FsaXplZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGxvY2FsaXplZE1lc3NhZ2UpIHsNCi0JCXN1cGVyKG1lc3NhZ2UpOw0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGxvY2FsaXplZE1lc3NhZ2UsICJsb2NhbGl6ZWRNZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQNCi0JCXRoaXMubG9jYWxpemVkTWVzc2FnZSA9IGxvY2FsaXplZE1lc3NhZ2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdHMgZXhjZXB0aW9uIHdpdGggYWJpbGl0eSB0byBwcm92aWRlIGxvY2FsaXplZCBtZXNzYWdlDQotCSAqIEBwYXJhbSBtZXNzYWdlIC0gdGhlIGRldGFpbCBtZXNzYWdlICh3aGljaCBpcyBzYXZlZCBmb3IgbGF0ZXIgcmV0cmlldmFsDQotICAgICAqICAgICAgICAgYnkgdGhlIHtAbGluayAjZ2V0TWVzc2FnZSgpfSBtZXRob2QpDQotCSAqIEBwYXJhbSBsb2NhbGl6ZWRNZXNzYWdlIC0gdGhlIGxvY2FsaXplZCBtZXNzYWdlICh3aGljaCBpcyBzYXZlZCBmb3IgbGF0ZXIgcmV0cmlldmFsDQotICAgICAqICAgICAgICAgYnkgdGhlIHtAbGluayAjZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSBtZXRob2QpDQotCSAqIEBwYXJhbSBjYXVzZSAtICBjYXVzZSB0aGUgY2F1c2UgKHdoaWNoIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwgYnkgdGhlDQotICAgICAqICAgICAgICAge0BsaW5rICNnZXRDYXVzZSgpfSBtZXRob2QpLg0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgLSBpbiBjYXNlIGxvY2FsaXplZCBtZXNzYWdlIGlzIG51bGwNCi0JICogKi8NCi0JDQotCXB1YmxpYyBMb2NhbGl6ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0JCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShsb2NhbGl6ZWRNZXNzYWdlLCAibG9jYWxpemVkTWVzc2FnZSIpOyAvLyROT04tTkxTLTEkDQotCQl0aGlzLmxvY2FsaXplZE1lc3NhZ2UgPSBsb2NhbGl6ZWRNZXNzYWdlOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyBsb2NhbGl6ZWQgbWVzc2FnZSB3aXRoIHdoaWNoIHRoZSBleGNlcHRpb24gd2FzIGNvbnN0cnVjdGVkLiovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsaXplZE1lc3NhZ2UoKSB7DQotCQlyZXR1cm4gbG9jYWxpemVkTWVzc2FnZTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2V4Y2VwdGlvbi9NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZXhjZXB0aW9uL01pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTIxMjk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZXhjZXB0aW9uL01pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZXhjZXB0aW9uOw0KLQ0KLQ0KLS8qKg0KLSAqIEluZGljYXRlcyB0aGF0IGEgcmVzb3VyY2Ugb2YgYW55IGtpbmQgY291bGRuJ3QgYmUgZm91bmQgYnV0IHRoaXMgd2FzIGV4cGVjdGVkLg0KLSAqIA0KLSAqIEBhdXRob3IgSm9lcmcgRGVobWVsDQotICovDQotcHVibGljIGNsYXNzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleHRlbmRzIExvY2FsaXplZEV4Y2VwdGlvbg0KLXsNCi0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIHdpdGggYSBtZXNzYWdlIGFuZCBhIGxvY2FsaXplZCBtZXNzYWdlLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBlcnJvciBtZXNzYWdlDQotCSAqIEBwYXJhbSBsb2NhbGl6ZWRNZXNzYWdlDQotCSAqICAgICAgICAgICAgbG9jYWxpemVkIG1lc3NhZ2UNCi0JICovDQotCXB1YmxpYyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlKQ0KLQl7DQotCQlzdXBlcihtZXNzYWdlLCBsb2NhbGl6ZWRNZXNzYWdlKTsJCQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIHdpdGggbWVzc2FnZSwgbG9jYWxpemVkIG1lc3NhZ2UgYW5kIGNhdXNpbmcgZXhjZXB0aW9uLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBlcnJvciBtZXNzYWdlDQotCSAqIEBwYXJhbSBsb2NhbGl6ZWRNZXNzYWdlDQotCSAqICAgICAgICAgICAgbG9jYWxpemVkIG1lc3NhZ2UNCi0JICogQHBhcmFtIGNhdXNlDQotCSAqICAgICAgICAgICAgY2F1c2luZyBleGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpDQotCXsNCi0JCXN1cGVyKG1lc3NhZ2UsIGxvY2FsaXplZE1lc3NhZ2UsIGNhdXNlKTsJCQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZmFjZXRzL0ZhY2V0VXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZmFjZXRzL0ZhY2V0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTg4ZGE3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ZhY2V0cy9GYWNldFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZmFjZXRzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBGYWNldFV0aWxzIGltcGxlbWVudHMgSUZhY2V0VXRpbHMNCi17DQotCS8qKg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIGlmIDxjPnByb2plY3Q8L2M+IG9yIDxjPmZhY2V0SWRzPC9jPiBpcyBudWxsDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlGYWNldChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcuLi4gZmFjZXRJZHMpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShwcm9qZWN0KTsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmYWNldElkcyk7DQotDQotCQlpZiAoIWlzRmFjZXRlZFByb2plY3QocHJvamVjdCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gZ2V0RmFjZXRlZFByb2plY3QocHJvamVjdCk7DQotCQlmb3IgKFN0cmluZyBmYWNldElkIDogZmFjZXRJZHMpDQotCQl7DQotCQkJZmluYWwgSVByb2plY3RGYWNldCBmYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChmYWNldElkKTsNCi0JCQlpZiAoZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KGZhY2V0KSkNCi0JCQl7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBoYXNGYWNldFdpdGhWZXJzaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmYWNldFZlcnNpb24sIFN0cmluZyBmYWNldElkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlyZXR1cm4gaGFzRmFjZXRXaXRoVmVyc2lvbihwcm9qZWN0LCBmYWNldFZlcnNpb24sIGZhY2V0SWQsIHRydWUpOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGlzRmFjZXRlZFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJU2V0PElGYWNldGVkUHJvamVjdD4gZmFjZXRlZFByb2plY3RzID0gZ2V0QWxsV29ya3NwYWNlRmFjZXRlZFByb2plY3RzKCk7DQotCQlmaW5hbCBJdGVyYXRvcjxJRmFjZXRlZFByb2plY3Q+IGkgPSBmYWNldGVkUHJvamVjdHMuaXRlcmF0b3IoKTsNCi0JCXdoaWxlIChpLmhhc05leHQoKSkNCi0JCXsNCi0JCQlmaW5hbCBJRmFjZXRlZFByb2plY3QgZnAgPSAoSUZhY2V0ZWRQcm9qZWN0KSBpLm5leHQoKTsNCi0JCQlpZiAocHJvamVjdC5lcXVhbHMoZnAuZ2V0UHJvamVjdCgpKSkNCi0JCQl7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBoYXNGYWNldFdpdGhWZXJzaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmYWNldFZlcnNpb24sIFN0cmluZyBmYWNldElkLCBib29sZWFuIGFjY2VwdEhpZ2hlckZhY2V0VmVyc2lvbikgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKHByb2plY3QpOw0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGZhY2V0VmVyc2lvbik7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZmFjZXRJZCk7DQotDQotCQlpZiAoIWlzRmFjZXRlZFByb2plY3QocHJvamVjdCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBhbGxGYWNldHNWZXJzaW9ucyA9IGdldFByb2plY3RGYWNldHMocHJvamVjdCk7DQotCQlmb3IgKElQcm9qZWN0RmFjZXRWZXJzaW9uIHZlciA6IGFsbEZhY2V0c1ZlcnNpb25zKQ0KLQkJew0KLQkJCWlmICh2ZXIuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0SWQoKS5lcXVhbHMoZmFjZXRJZCkpDQotCQkJew0KLQkJCQlyZXR1cm4gaXNGYWNldEFjY2VwdGFibGUodmVyLCBmYWNldFZlcnNpb24sIGFjY2VwdEhpZ2hlckZhY2V0VmVyc2lvbik7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXByaXZhdGUgYm9vbGVhbiBpc0ZhY2V0QWNjZXB0YWJsZShJUHJvamVjdEZhY2V0VmVyc2lvbiBmYWNldFZlcnNpb24sIFN0cmluZyBmYWNldFZlcnNpb25JZCwgYm9vbGVhbiBhY2NlcHRIaWdoZXJGYWNldFZlcnNpb24pDQotCQkJCQkJCQkJdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJYXNzZXJ0IGZhY2V0VmVyc2lvbiAhPSBudWxsOw0KLQ0KLQkJLy8gQ2hlY2sgZm9yIGV4YWN0IHZlcnNpb24NCi0JCWlmICghYWNjZXB0SGlnaGVyRmFjZXRWZXJzaW9uKQ0KLQkJew0KLQkJCXJldHVybiBmYWNldFZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpLmVxdWFscyhmYWNldFZlcnNpb25JZCk7DQotCQl9DQotDQotCQlDb21wYXJhdG9yPFN0cmluZz4gY29tcGFyYXRvciA9IGZhY2V0VmVyc2lvbi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRWZXJzaW9uQ29tcGFyYXRvcigpOw0KLQkJU3RyaW5nIGN1cnJlbnRGYWNldFZlcnNpb24gPSBmYWNldFZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpOw0KLQkJcmV0dXJuIGNvbXBhcmF0b3IuY29tcGFyZShjdXJyZW50RmFjZXRWZXJzaW9uLCBmYWNldFZlcnNpb25JZCkgPj0gMDsNCi0JfQ0KLQ0KLQlwcml2YXRlIElGYWNldGVkUHJvamVjdCBnZXRGYWNldGVkUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlyZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOw0KLQl9DQotDQotCXByaXZhdGUgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRQcm9qZWN0RmFjZXRzKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWFzc2VydCBpc0ZhY2V0ZWRQcm9qZWN0KHByb2plY3QpOw0KLQ0KLQkJcmV0dXJuIGdldEZhY2V0ZWRQcm9qZWN0KHByb2plY3QpLmdldFByb2plY3RGYWNldHMoKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIFNldDxJRmFjZXRlZFByb2plY3Q+IGdldEFsbFdvcmtzcGFjZUZhY2V0ZWRQcm9qZWN0cygpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRGYWNldGVkUHJvamVjdHMoKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ZhY2V0cy9JRmFjZXRVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9mYWNldHMvSUZhY2V0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODcyNzc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ZhY2V0cy9JRmFjZXRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZmFjZXRzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotCQ0KLXB1YmxpYyBpbnRlcmZhY2UgSUZhY2V0VXRpbHMNCi17DQotCS8qKg0KLQkgKiBDb25zdGFudCBmb3IgRUpCMzAgZmFjZXQgSUQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl8zMF9GQUNFVF9JRCA9ICJqc3QuZWpiIjsgLy8kTk9OLU5MUy0xJA0KLQkNCi0JLyoqDQotCSAqIENvbnN0YW50IGZvciBFSkIzMCBmYWNldCB2ZXJzaW9uIDMuMA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCXzMwX0ZBQ0VUX1ZFUlNJT04gPSAiMy4wIjsgLy8kTk9OLU5MUy0xJA0KLQkNCi0JLyoqDQotCSAqIENvbnN0YW50IGZvciBXZWIgMi41IGZhY2V0IElEDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfMjVfRkFDRVRfSUQgPSAianN0LndlYiI7IC8vJE5PTi1OTFMtMSQNCi0JDQotCS8qKg0KLQkgKiBDb25zdGFudCBmb3IgV2ViIGZhY2V0IHZlcnNpb24gMi41DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfMjVfRkFDRVRfVkVSU0lPTiA9ICIyLjUiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiBDb25zdGFudCBmb3IgQXBwbGljYXRpb24gY2xpZW50IGZhY2V0IElEDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfMjVfRkFDRVRfSUQgPSAianN0LmFwcGNsaWVudCI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIENvbnN0YW50IGZvciBBcHBsaWNhdGlvbiBjbGllbnQgZmFjZXQgdmVyc2lvbiAyLjUNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUENMSUVOVF8yNV9GQUNFVF9WRVJTSU9OCT0gIjUuMCI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIENoZWNrcyB3aGV0aGVyIDxjb2RlPnByb2plY3Q8L2NvZGU+IGhhcyBhIGZhY2V0IHdpdGggaWQgPGNvZGU+ZmFjZXRJZDwvY29kZT4gd2l0aCB2ZXJzaW9uIDxjb2RlPmZhY2V0VmVyc2lvbjwvY29kZT4NCi0JICogSW4gY2FzZSB0aGUgcHJvamVjdCBzcGVjaWZpZWQgaXMgbm90IGEgZmFjZXRlZCBwcm9qZWN0LCBmYWxzZSBpcyByZXR1cm5lZCANCi0JICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGlzIGVxdWl2YWxlbnQgdG8gaW52b2tpbmcgaGFzRmFjZXRXaXRoVmVyc2lvbihwcm9qZWN0LCBmYWNldFZlcnNpb24sIGZhY2V0SWQsIGZhbHNlKQ0KLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdA0KLQkgKiBAcGFyYW0gZmFjZXRWZXJzaW9uIHRoZSBmYWNldCB2ZXJzaW9uDQotCSAqIEBwYXJhbSBmYWNldElkIHRoZSBmYWNldCBpZA0KLQkgKiBAcmV0dXJuIHRydWUgaW4gY2FzZSB0aGUgcHJvamVjdCBzcGVjaWZpZWQgaXMgYSBmYWNldGVkIHByb2plY3QgYW5kIGhhcyB0aGUgZmFjZXQgd2l0aCB0aGUgdmVyc2lvbiBzcGVjaWZpZWQ7IGZhbHNlIG90aGVyd2lzZQ0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGFueSBvZiB0aGUgaW5wdXQgcGFyYW1ldGVycyBpcyBudWxsDQotCSAqIEBzZWUgSUZhY2V0VXRpbHMjaGFzRmFjZXRXaXRoVmVyc2lvbihJUHJvamVjdCwgU3RyaW5nLCBTdHJpbmcsIGJvb2xlYW4pDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBoYXNGYWNldFdpdGhWZXJzaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmYWNldFZlcnNpb24sIFN0cmluZyBmYWNldElkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0JDQotCS8qKg0KLQkgKiBDaGVja3Mgd2hldGhlciA8Y29kZT5wcm9qZWN0PC9jb2RlPiBoYXMgYSBmYWNldCB3aXRoIGlkIDxjb2RlPmZhY2V0SWQ8L2NvZGU+IHdpdGggdmVyc2lvbiA8Y29kZT5mYWNldFZlcnNpb248L2NvZGU+DQotCSAqIEluIGNhc2UgdGhlIHByb2plY3Qgc3BlY2lmaWVkIGlzIG5vdCBhIGZhY2V0ZWQgcHJvamVjdCwgZmFsc2UgaXMgcmV0dXJuZWQgDQotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0DQotCSAqIEBwYXJhbSBmYWNldFZlcnNpb24gdGhlIGZhY2V0IHZlcnNpb24NCi0JICogQHBhcmFtIGZhY2V0SWQgdGhlIGZhY2V0IGlkDQotCSAqIEBwYXJhbSBhY2NlcHRIaWdoZXJGYWNldFZlcnNpb24gYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBoaWdoZXIgZmFjZXQgdmVyc2lvbnMgYXJlIGFjY2VwdGFibGUNCi0JICogQHJldHVybiB0cnVlIGluIGNhc2UgdGhlIHByb2plY3Qgc3BlY2lmaWVkIGlzIGEgZmFjZXRlZCBwcm9qZWN0IGFuZCBoYXMgdGhlIGZhY2V0IHdpdGggdGhlIHZlcnNpb24gc3BlY2lmaWVkOyBmYWxzZSBvdGhlcndpc2UNCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBhbnkgb2YgdGhlIGlucHV0IHBhcmFtZXRlcnMgaXMgbnVsbA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaGFzRmFjZXRXaXRoVmVyc2lvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZmFjZXRWZXJzaW9uLCBTdHJpbmcgZmFjZXRJZCwgYm9vbGVhbiBhY2NlcHRIaWdoZXJGYWNldFZlcnNpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIHByb2plY3Qgc3BlY2lmaWVkIGlzIGEgZmFjZXRlZCBwcm9qZWN0DQotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0DQotCSAqIEByZXR1cm4NCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+cHJvamVjdDwvY29kZT4gaXMgbnVsbA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNGYWNldGVkUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25CYXNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25CYXNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMmVkYTJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uQmFzZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25CYXNlOw0KLQ0KLS8qKg0KLSAqIEJhc2Uge0BsaW5rIElBbm5vdGF0aW9uQmFzZX0gaW1wbGVtZW50YXRpb24NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5ub3RhdGlvbkJhc2VJbXBsPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGV4dGVuZHMgVmFsdWVJbXBsDQotew0KLQlwcml2YXRlIFN0cmluZyBhbm5vdGF0aW9uTmFtZTsvLyBDb250YWluZXIgZm9yIEFubm90YXRpb24gTmFtZTsNCi0JcHJvdGVjdGVkIFQgamF2YUVsZW1lbnQ7IC8vIENvbmF0aW5lciBmb3IgdGhlIHBhcmVudCBJSmF2YUVsZW1lbnQ7DQotCS8vcHJpdmF0ZSBTdHJpbmcgYW5ub3RhdGlvblN0cmluZ1ZhbHVlOy8vQ29uYXRpbmVyIHRvIGN1cnJlbnQgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgYW5ub3RhdGlvbg0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVCA9ICIuIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IuDQotCSAqIA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbk5hbWUNCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5hbm5vdGF0aW9uTmFtZTwvY29kZT4gaXMgbnVsbC4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5hbm5vdGF0aW9uTmFtZTwvY29kZT4gaXMgZW1wdHkgU3RyaW5nLg0KLQkgKi8NCi0JcHVibGljIEFubm90YXRpb25CYXNlSW1wbChTdHJpbmcgYW5ub3RhdGlvbk5hbWUpDQotCXsNCi0JCXRoaXMuYW5ub3RhdGlvbk5hbWUgPSBhbm5vdGF0aW9uTmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogRXh0cmFjdHMgb25seSB0aGUgQW5ub3RhdGlvbiBuYW1lIGluIGNhc2UgaXQgaXMgaW4gZnVsbHkgcXVhbGlmaWVkIGZvcm0uDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBzaW1wbGUgQW5ub3RhdGlvbiBuYW1lLg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRTaW1wbGVBbm5vdGF0aW9uTmFtZSgpDQotCXsNCi0JCWludCBsYXN0RG90SW5kZXggPSBhbm5vdGF0aW9uTmFtZS5sYXN0SW5kZXhPZihET1QpOw0KLQ0KLQkJaWYgKGxhc3REb3RJbmRleCA9PSAtMSkNCi0JCXsNCi0JCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWU7DQotCQl9DQotDQotCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWUuc3Vic3RyaW5nKGxhc3REb3RJbmRleCArIDEpOw0KLQl9DQotDQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKQ0KLQl7DQotCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIEFkZHMgQW5ub3RhdGlvbiB0byBzcGVjaWZpYyBJSmF2YUVsZW1lbnQuDQotCSAqIA0KLQkgKiBAcGFyYW0gamF2YUVsZW1lbnQNCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPHR0PmphdmFFbGVtZW50PC90dD4gaXMgbnVsbC4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4gaXMgbm90IG9mIHRoZSBjb3JyZWN0IHR5cGUuIFN1cHBvcnRlZCB0eXBlcyBhcmU6IElUeXBlLCBJTWV0aG9kLCBJRmllbGQsIElUeXBlUGFyYW1ldGVyLg0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0QXBwbGllZEVsZW1lbnRXaXRob3V0U2F2ZShUIGphdmFFbGVtZW50KQ0KLQl7DQotCQlzZXRKYXZhRWxlbWVudChqYXZhRWxlbWVudCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0SmF2YUVsZW1lbnQoVCBqYXZhRWxlbWVudCkNCi0Jew0KLQkJaWYgKGphdmFFbGVtZW50ID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJqYXZhRWxlbWVudCBzaG91bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKCEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgJiYgIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpICYmICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJRmllbGQpICYmICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZVBhcmFtZXRlcikpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiamF2YUVsZW1lbnQgaXMgbm90IG9mIGNvcnJlY3QgdHlwZSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJdGhpcy5qYXZhRWxlbWVudCA9IGphdmFFbGVtZW50Ow0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0Jew0KLQkJcmV0dXJuIGFubm90YXRpb25OYW1lLmhhc2hDb2RlKCk7DQotCX0NCi0JDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopDQotCXsNCi0JCWlmICh0aGlzID09IG9iaikNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWlmIChvYmogPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlmaW5hbCBBbm5vdGF0aW9uQmFzZUltcGw8VD4gb3RoZXIgPSAgKEFubm90YXRpb25CYXNlSW1wbDxUPilvYmo7DQotCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWUuZXF1YWxzKG90aGVyLmFubm90YXRpb25OYW1lKTsNCi0JfQkNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWQzYjVhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVOYW1lOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotDQotLyoqDQotICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElBbm5vdGF0aW9ufQ0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uSW1wbDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBleHRlbmRzIEFubm90YXRpb25CYXNlSW1wbDxUPiBpbXBsZW1lbnRzIElBbm5vdGF0aW9uPFQ+DQotew0KLQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb24jZ2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuU3RyaW5nKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKFN0cmluZyBwYXJhbSkNCi0Jew0KLQkJZm9yIChJUGFyYW1WYWx1ZVBhaXIgcGFpciA6IGdldFBhcmFtVmFsdWVQYWlycygpKQ0KLQkJew0KLQkJCWlmIChwYXJhbS5lcXVhbHMocGFpci5nZXRQYXJhbSgpKSkNCi0JCQl7DQotCQkJCXJldHVybiBwYWlyLmdldFZhbHVlKCkhPW51bGwgPyBwYWlyLmdldFZhbHVlKCkudG9TdHJpbmcoKSA6IG51bGw7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHJpdmF0ZSBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlUGFpcnM7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiANCi0JICogQHBhcmFtIGFubm90YXRpb25OYW1lIC0NCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiBhbm5vdGF0aW9uDQotCSAqIEBwYXJhbSBwYXJhbVZhbHVlUGFpcnMgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBwYXJhbT12YWx1ZSBwYXJpcw0KLQkgKi8NCi0JcHVibGljIEFubm90YXRpb25JbXBsKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZVBhaXJzKQ0KLQl7DQotCQlzdXBlcihhbm5vdGF0aW9uTmFtZSk7DQotCQl0aGlzLnBhcmFtVmFsdWVQYWlycyA9IHBhcmFtVmFsdWVQYWlyczsNCi0JfQ0KLQ0KLQlwdWJsaWMgU2V0PElQYXJhbVZhbHVlUGFpcj4gZ2V0UGFyYW1WYWx1ZVBhaXJzKCkNCi0Jew0KLQkJcmV0dXJuIHBhcmFtVmFsdWVQYWlyczsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRQYXJhbVZhbHVlUGFpcnMoU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZVBhaXJzKQ0KLQl7DQotCQl0aGlzLnBhcmFtVmFsdWVQYWlycyA9IHBhcmFtVmFsdWVQYWlyczsNCi0JfQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKENvbXBpbGF0aW9uVW5pdCB1bml0LCBBU1QgYXN0KQ0KLQl7DQotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90ID0gYXN0Lm5ld05vcm1hbEFubm90YXRpb24oKTsNCi0JCWJvb2xlYW4gd2FzQWRkZWQgPSBhZGRJbXBvcnRzKGFzdCwgdW5pdCwgZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQlpZiAod2FzQWRkZWQpDQotCQl7DQotCQkJKChTaW1wbGVOYW1lKSBhbm5vdC5nZXRUeXBlTmFtZSgpKS5zZXRJZGVudGlmaWVyKGdldFNpbXBsZUFubm90YXRpb25OYW1lKCkpOw0KLQkJfSBlbHNlDQotCQl7DQotCQkJTmFtZSBuYW1lID0gYXN0Lm5ld05hbWUoZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQkJYW5ub3Quc2V0VHlwZU5hbWUobmFtZSk7DQotCQl9DQotCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlUGFpciA6IHBhcmFtVmFsdWVQYWlycykNCi0JCXsNCi0JCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IGFzdC5uZXdNZW1iZXJWYWx1ZVBhaXIoKTsNCi0JCQlwYWlyLmdldE5hbWUoKS5zZXRJZGVudGlmaWVyKHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCkpOw0KLQkJCXBhaXIuc2V0VmFsdWUoKChWYWx1ZUltcGwpIHBhcmFtVmFsdWVQYWlyLmdldFZhbHVlKCkpLmdldEV4cHJlc3Npb24odW5pdCwgYXN0KSk7DQotCQkJYW5ub3QudmFsdWVzKCkuYWRkKHBhaXIpOw0KLQkJfQ0KLQkJcmV0dXJuIGFubm90Ow0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0Jew0KLQkJaWYocGFyYW1WYWx1ZVBhaXJzID09IG51bGwgfHwgcGFyYW1WYWx1ZVBhaXJzLnNpemUoKSA8IDEpDQotCQl7DQotCQkJcmV0dXJuIDMxICogc3VwZXIuaGFzaENvZGUoKTsNCi0JCX0NCi0JCXJldHVybiAzMSAqIHN1cGVyLmhhc2hDb2RlKCkgKyBBcnJheXMuaGFzaENvZGUocGFyYW1WYWx1ZVBhaXJzLnRvQXJyYXkobmV3IElQYXJhbVZhbHVlUGFpcltwYXJhbVZhbHVlUGFpcnMuc2l6ZSgpXSkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikNCi0Jew0KLQkJaWYgKCFzdXBlci5lcXVhbHMob2JqKSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlmaW5hbCBBbm5vdGF0aW9uSW1wbDw/PiBvdGhlciA9IChBbm5vdGF0aW9uSW1wbDw/Pikgb2JqOw0KLQkJcmV0dXJuIChBcnJheXMuZXF1YWxzKHBhcmFtVmFsdWVQYWlycy50b0FycmF5KG5ldyBJUGFyYW1WYWx1ZVBhaXJbcGFyYW1WYWx1ZVBhaXJzLnNpemUoKV0pLCBvdGhlci5wYXJhbVZhbHVlUGFpcnMudG9BcnJheShuZXcgSVBhcmFtVmFsdWVQYWlyW3BhcmFtVmFsdWVQYWlycy5zaXplKCldKSkpOw0KLQl9DQotDQotCXB1YmxpYyBUIGdldEFwcGxpZWRFbGVtZW50KCkNCi0Jew0KLQkJcmV0dXJuIHRoaXMuamF2YUVsZW1lbnQ7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25JbnNwZWN0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvbkluc3BlY3RvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmM4NjdlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvbkluc3BlY3RvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklJbXBvcnREZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9keURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9vbGVhbkxpdGVyYWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRmllbGREZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklFeHRlbmRlZE1vZGlmaWVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdW1iZXJMaXRlcmFsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUXVhbGlmaWVkTmFtZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlF1YWxpZmllZFR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5jbGF6ei5BU1RVdGlsczsNCi0NCi0vKioNCi0gKiBDbGFzcywgd2hpY2ggaXMgbWFkZSB0byBsb2FkIGFuZCByZXR1cm4gYW5ub3RhdGlvbnMgZnJvbSBhIGdpdmVuIElKYXZhRWxlbWV0Lg0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uSW5zcGVjdG9ySW1wbCBpbXBsZW1lbnRzIElBbm5vdGF0aW9uSW5zcGVjdG9yDQotew0KLQlwcml2YXRlIElUeXBlIGlUeXBlOw0KLQlwcml2YXRlIENvbXBpbGF0aW9uVW5pdCBjVW5pdDsNCi0NCi0JcHVibGljIEFubm90YXRpb25JbnNwZWN0b3JJbXBsKGZpbmFsIElUeXBlIHR5cGUpDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbSh0eXBlLCAidHlwZSIpOyAvLyROT04tTkxTLTEkDQotCQkNCi0JCXRoaXMuaVR5cGUgPSB0eXBlOw0KLQl9CQ0KLQ0KLQlwdWJsaWMgSUFubm90YXRpb248SU1ldGhvZD4gaW5zcGVjdE1ldGhvZChmaW5hbCBJTWV0aG9kIG1ldGhvZCwgZmluYWwgU3RyaW5nIGFubm90YXRpb25RTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0obWV0aG9kLCAibWV0aG9kIik7IC8vJE5PTi1OTFMtMSQNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShhbm5vdGF0aW9uUU5hbWUsICJhbm5vdGF0aW9uUU5hbWUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJaWYoIShtZXRob2QgaW5zdGFuY2VvZiBJTWV0aG9kKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXRob2QgYXJndW1lbnQgaXMgbm90IG9mIGNvcnJlY3QgVHlwZSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYoYW5ub3RhdGlvblFOYW1lLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYW5ub3RhdGlvblFOYW1lIGFyZ3VtZW50IGlzIG5vdCB3aXRoIHByb3BwZXIgdmFsdWUhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBnZXRTcGVjaWZpY0Fubm90YXRpb25Gcm9tTWVtYmVyKG1ldGhvZCwgbWV0aG9kLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCksIGFubm90YXRpb25RTmFtZSk7CQkNCi0JfQkNCi0NCi0JcHVibGljIENvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IGluc3BlY3RNZXRob2QoSU1ldGhvZCBtZXRob2QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKG1ldGhvZCwgIm1ldGhvZCIpOyAvLyROT04tTkxTLTEkDQotCQkNCi0JCWlmKCEobWV0aG9kIGluc3RhbmNlb2YgSU1ldGhvZCkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWV0aG9kIGFyZ3VtZW50IGlzIG5vdCBvZiBjb3JyZWN0IFR5cGUhIik7CS8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBnZXRGcm9tTWVtYmVyKG1ldGhvZCwgbWV0aG9kLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCkpOwkJDQotCX0NCi0JDQotCXB1YmxpYyBJQW5ub3RhdGlvbjxJRmllbGQ+IGluc3BlY3RGaWVsZChmaW5hbCBJRmllbGQgZmllbGQsIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0oZmllbGQsICJmaWVsZCIpOyAvLyROT04tTkxTLTEkDQotCQludWxsQ2hlY2tQYXJhbShhbm5vdGF0aW9uUU5hbWUsICJhbm5vdGF0aW9uUU5hbWUiKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJaWYoIShmaWVsZCBpbnN0YW5jZW9mIElGaWVsZCkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmllbGQgYXJndW1lbnQgaXMgbm90IG9mIGNvcnJlY3QgVHlwZSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYoYW5ub3RhdGlvblFOYW1lLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYW5ub3RhdGlvblFOYW1lIGFyZ3VtZW50IGlzIG5vdCB3aXRoIHByb3BwZXIgdmFsdWUhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCWZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSBmaWVsZC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpOw0KLQkJcmV0dXJuIGdldFNwZWNpZmljQW5ub3RhdGlvbkZyb21NZW1iZXIoZmllbGQsIGNsYXNzTmFtZSwgYW5ub3RhdGlvblFOYW1lKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJRmllbGQ+PiBpbnNwZWN0RmllbGQoSUZpZWxkIGZpZWxkKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmIChmaWVsZCA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZmllbGQgc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZighKGZpZWxkIGluc3RhbmNlb2YgSUZpZWxkKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmaWVsZCBhcmd1bWVudCBpcyBub3Qgb2YgY29ycmVjdCBUeXBlISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlmaW5hbCBTdHJpbmcgY2xhc3NOYW1lID0gZmllbGQuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCXJldHVybiBnZXRGcm9tTWVtYmVyKGZpZWxkLCBjbGFzc05hbWUpOw0KLQl9DQotDQotCXB1YmxpYyBJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gaW5zcGVjdFBhcmFtKGZpbmFsIElUeXBlUGFyYW1ldGVyIHBhcmFtLCBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvblFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKHBhcmFtLCAicGFyYW0iKTsgLy8kTk9OLU5MUy0xJA0KLQkJbnVsbENoZWNrUGFyYW0oYW5ub3RhdGlvblFOYW1lLCAiYW5ub3RhdGlvblFOYW1lIik7IC8vJE5PTi1OTFMtMSQNCi0JCQ0KLQkJaWYoIShwYXJhbSBpbnN0YW5jZW9mIElUeXBlUGFyYW1ldGVyKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJhbSBhcmd1bWVudCBpcyBub3Qgb2YgY29ycmVjdCBUeXBlISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZihhbm5vdGF0aW9uUU5hbWUudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhbm5vdGF0aW9uUU5hbWUgYXJndW1lbnQgaXMgbm90IHdpdGggcHJvcHBlciB2YWx1ZSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzTmFtZUZyb21QYXJhbShwYXJhbSk7DQotCQlyZXR1cm4gZ2V0U3BlY2lmaWNBbm5vdGF0aW9uRnJvbU1lbWJlcihwYXJhbSwgY2xhc3NOYW1lLCBhbm5vdGF0aW9uUU5hbWUpOwkJDQotCX0NCi0JDQotCXB1YmxpYyBDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPj4gaW5zcGVjdFBhcmFtKElUeXBlUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmIChwYXJhbSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicGFyYW0gc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZighKHBhcmFtIGluc3RhbmNlb2YgSVR5cGVQYXJhbWV0ZXIpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmFtIGFyZ3VtZW50IGlzIG5vdCBvZiBjb3JyZWN0IFR5cGUhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBnZXRGcm9tTWVtYmVyKHBhcmFtLCBnZXRDbGFzc05hbWVGcm9tUGFyYW0ocGFyYW0pKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSUFubm90YXRpb248SVR5cGU+IGluc3BlY3RUeXBlKGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0oYW5ub3RhdGlvblFOYW1lLCAiYW5ub3RhdGlvblFOYW1lIik7IC8vJE5PTi1OTFMtMSQNCi0JCQ0KLQkJaWYgKGFubm90YXRpb25RTmFtZS50cmltKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJA0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFubm90YXRpb25RTmFtZSBhcmd1bWVudCBpcyBub3Qgd2l0aCBwcm9wcGVyIHZhbHVlISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkNCi0JCXJldHVybiBnZXRTcGVjaWZpY0Fubm90YXRpb25Gcm9tTWVtYmVyKGlUeXBlLCBpVHlwZS5nZXRFbGVtZW50TmFtZSgpLCBhbm5vdGF0aW9uUU5hbWUpOw0KLQl9DQotCQ0KLQlwdWJsaWMgQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGluc3BlY3RUeXBlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlyZXR1cm4gZ2V0RnJvbU1lbWJlcihpVHlwZSwgaVR5cGUuZ2V0RWxlbWVudE5hbWUoKSk7DQotCX0JDQotCQ0KLQkvLyAjIGltcGxlbWVudGF0aW9uDQotCQ0KLQlwcml2YXRlIFN0cmluZyBnZXRDbGFzc05hbWVGcm9tUGFyYW0oZmluYWwgSVR5cGVQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYocGFyYW0uZ2V0RGVjbGFyaW5nTWVtYmVyKCkgaW5zdGFuY2VvZiBJTWV0aG9kKQ0KLQkJew0KLQkJCXJldHVybiBwYXJhbS5nZXREZWNsYXJpbmdNZW1iZXIoKS5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHBhcmFtLmdldERlY2xhcmluZ01lbWJlcigpLmdldEVsZW1lbnROYW1lKCk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBTZXQ8SUFubm90YXRpb248VD4+IGdldEZyb21NZW1iZXIoVCB0eXBlLCBTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmICghaXNTdXBwb3J0ZWRKYXZhRWxlbWVudCh0eXBlKSkgew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhc3NlZCBhcmd1bWVudCBpcyBub3Qgb2YgY29ycmVjdCB0eXBlLiIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkNCi0JCUlDb21waWxhdGlvblVuaXQgY1VuaXQgPSBudWxsOw0KLQkJaWYodHlwZSBpbnN0YW5jZW9mIElNZW1iZXIpIHsNCi0JCQljVW5pdCA9ICgoSU1lbWJlcil0eXBlKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWNVbml0ID0gKChJVHlwZVBhcmFtZXRlcil0eXBlKS5nZXREZWNsYXJpbmdNZW1iZXIoKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCX0NCi0JCQ0KLQkJaWYgKGNVbml0ID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbmV3IEhhc2hTZXQ8SUFubm90YXRpb248VD4+KCk7DQotCQl9DQotDQotCQlmaW5hbCBDb21waWxhdGlvblVuaXQgdW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJZmluYWwgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oY2xhc3NOYW1lLCB1bml0KTsNCi0JCQ0KLQkJc3dpdGNoKHR5cGUuZ2V0RWxlbWVudFR5cGUoKSkNCi0JCXsNCi0JCWNhc2UgSUphdmFFbGVtZW50LlRZUEU6DQotCQkJcmV0dXJuIGdldEFubm90YXRpb25zKHR5cGUsIHR5cGVEZWNsYXJhdGlvbik7DQotCQkJDQotCQljYXNlIElKYXZhRWxlbWVudC5GSUVMRDoNCi0JCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldEZpZWxkRGVjbGFyYXRpb24oKElGaWVsZCkgdHlwZSwgKFR5cGVEZWNsYXJhdGlvbil0eXBlRGVjbGFyYXRpb24pOw0KLQkJCXJldHVybiBnZXRBbm5vdGF0aW9ucyh0eXBlLCBmaWVsZERlY2xhcmF0aW9uKTsNCi0JCQkNCi0JCWNhc2UgSUphdmFFbGVtZW50Lk1FVEhPRDoNCi0JCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24oKElNZXRob2QpIHR5cGUsIChUeXBlRGVjbGFyYXRpb24pdHlwZURlY2xhcmF0aW9uKTsNCi0JCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbnModHlwZSwgbWV0aG9kRGVjbGFyYXRpb24pOw0KLQkJCQ0KLQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRV9QQVJBTUVURVI6DQotCQkJbWV0aG9kRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZERlY2xhcmF0aW9uKChJTWV0aG9kKSgoSVR5cGVQYXJhbWV0ZXIpIHR5cGUpLmdldFBhcmVudCgpLCAoVHlwZURlY2xhcmF0aW9uKXR5cGVEZWNsYXJhdGlvbik7DQotCQkJcmV0dXJuIGdldFBhcmFtQW5ub3RhdGlvbnModHlwZSwgbWV0aG9kRGVjbGFyYXRpb24pOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG5ldyBIYXNoU2V0PElBbm5vdGF0aW9uPFQ+PigpOw0KLQl9DQotDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBTZXQ8SUFubm90YXRpb248VD4+IGdldEFubm90YXRpb25zKFQgaU1lbWJlciwgQm9keURlY2xhcmF0aW9uIGJvZHlEZWNsYXJhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoYm9keURlY2xhcmF0aW9uICE9IG51bGwpDQotCQl7DQotCQkJTGlzdCBsaXN0ID0gYm9keURlY2xhcmF0aW9uLm1vZGlmaWVycygpOw0KLQkJCXJldHVybiBleHRyYWN0QW5ub3RhdGlvbnMoaU1lbWJlciwgbGlzdCk7DQotCQl9DQotCQlyZXR1cm4gbmV3IEhhc2hTZXQ8SUFubm90YXRpb248VD4+KCk7DQotCX0NCi0JDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBTZXQ8SUFubm90YXRpb248VD4+IGdldFBhcmFtQW5ub3RhdGlvbnMoVCBpTWVtYmVyLCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAobWV0aG9kRGVjbGFyYXRpb24gIT0gbnVsbCkNCi0JCXsNCi0JCQlmb3IgKE9iamVjdCBwYXJhbSA6IG1ldGhvZERlY2xhcmF0aW9uLnBhcmFtZXRlcnMoKSkNCi0JCQl7DQotCQkJCWlmIChwYXJhbSBpbnN0YW5jZW9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gJiYNCi0JCQkJCQkoKElUeXBlUGFyYW1ldGVyKWlNZW1iZXIpLmdldEVsZW1lbnROYW1lKCkudG9TdHJpbmcoKS5lcXVhbHMoKChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKXBhcmFtKS5nZXROYW1lKCkudG9TdHJpbmcoKSkpDQotCQkJCXsNCi0JCQkJCUxpc3QgbGlzdCA9ICgoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgcGFyYW0pLm1vZGlmaWVycygpOw0KLQkJCQkNCi0JCQkJCXJldHVybiBleHRyYWN0QW5ub3RhdGlvbnMoaU1lbWJlciwgbGlzdCk7DQotCQkJCX0NCi0JCQl9CQkJDQotCQl9DQotCQlyZXR1cm4gbmV3IEhhc2hTZXQ8SUFubm90YXRpb248VD4+KCk7DQotCX0NCi0JDQotDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBTZXQ8SUFubm90YXRpb248VD4+IGV4dHJhY3RBbm5vdGF0aW9ucyhUIGlNZW1iZXIsIExpc3QgbGlzdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOw0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCUlFeHRlbmRlZE1vZGlmaWVyIGVsZW1lbnQgPSAoSUV4dGVuZGVkTW9kaWZpZXIpIGl0ZXIubmV4dCgpOw0KLQkJCWlmIChlbGVtZW50LmlzQW5ub3RhdGlvbigpKQ0KLQkJCXsNCi0JCQkJdmFsdWVzLmFkZChjb252ZXJ0RXhwcmVzc2lvbigoRXhwcmVzc2lvbikgZWxlbWVudCkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCVNldDxJQW5ub3RhdGlvbjxUPj4gZXhwcmVzc2lvbnMgPSBuZXcgSGFzaFNldDxJQW5ub3RhdGlvbjxUPj4oKTsNCi0JCWZvciAoSVZhbHVlIHZhbHVlIDogdmFsdWVzKSANCi0JCXsNCi0JCQlBbm5vdGF0aW9uSW1wbDxUPiBhbm4gPSAoQW5ub3RhdGlvbkltcGw8VD4pdmFsdWU7DQotCQkJYW5uLnNldEFwcGxpZWRFbGVtZW50V2l0aG91dFNhdmUoaU1lbWJlcik7DQotCQkJZXhwcmVzc2lvbnMuYWRkKGFubik7DQotCQl9DQotCQlyZXR1cm4gZXhwcmVzc2lvbnM7CQkNCi0JfQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IElBbm5vdGF0aW9uPFQ+IGV4dHJhY3RTcGVjaWZpY0Fubm90YXRpb24oVCBpTWVtYmVyLCBMaXN0IGxpc3QsIElUeXBlIHR5cGUsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsNCi0JCVNldDxJVmFsdWU+IHZhbHVlcyA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkNCi0JCXsNCi0JCQlJRXh0ZW5kZWRNb2RpZmllciBlbGVtZW50ID0gKElFeHRlbmRlZE1vZGlmaWVyKSBpdGVyLm5leHQoKTsNCi0JCQlpZiAoZWxlbWVudC5pc0Fubm90YXRpb24oKSkNCi0JCQl7CQkJCQ0KLQkJCQlmaW5hbCBOYW1lIHR5cGVOYW1lID0gKChBbm5vdGF0aW9uKWVsZW1lbnQpLmdldFR5cGVOYW1lKCk7DQotCQkJCWlmIChhbm5vdGF0aW9uUU5hbWUuZW5kc1dpdGgodHlwZU5hbWUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKSB7DQotCQkJCQl2YWx1ZXMuYWRkKGNvbnZlcnRFeHByZXNzaW9uKChFeHByZXNzaW9uKSBlbGVtZW50KSk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlmb3IgKElWYWx1ZSB2YWx1ZSA6IHZhbHVlcykgDQotCQl7DQotCQkJQW5ub3RhdGlvbkltcGw8VD4gdG1wQW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uSW1wbDxUPil2YWx1ZTsNCi0JCQlpZihjaGVja1NwZWNpZmljQW5ub3RhdHRpb24odG1wQW5ub3RhdGlvbiwgdHlwZSwgYW5ub3RhdGlvblFOYW1lKSkNCi0JCQl7DQotCQkJCUFubm90YXRpb25JbXBsPFQ+IHJlc3VsdCA9IG5ldyBBbm5vdGF0aW9uSW1wbDxUPihhbm5vdGF0aW9uUU5hbWUsIHRtcEFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkpOw0KLQkJCQlyZXN1bHQuc2V0QXBwbGllZEVsZW1lbnRXaXRob3V0U2F2ZShpTWVtYmVyKTsNCi0JCQkJcmVzdWx0LnNldExvY2F0b3IodG1wQW5ub3RhdGlvbi5nZXRMb2NhdG9yKCkpOw0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOwkJDQotCX0JDQotDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGJvb2xlYW4gY2hlY2tTcGVjaWZpY0Fubm90YXR0aW9uKGZpbmFsIEFubm90YXRpb25JbXBsPFQ+IGFubm90YXRpb24sIGZpbmFsIElUeXBlIHR5cGUsIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscyhhbm5vdGF0aW9uUU5hbWUpIHx8IA0KLQkJCQkodHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpICsgIi4iICsgYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKS5lcXVhbHMoYW5ub3RhdGlvblFOYW1lKSkgLy8kTk9OLU5MUy0xJA0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlJQ29tcGlsYXRpb25Vbml0IGNVbml0ID0gdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCUlJbXBvcnREZWNsYXJhdGlvbltdIGltcG9ydHMgPSBjVW5pdC5nZXRJbXBvcnRzKCk7DQotCQlmb3IgKElJbXBvcnREZWNsYXJhdGlvbiBpbXBvcnREZWNsYXJhdGlvbiA6IGltcG9ydHMpDQotCQl7DQotCQkJaWYoYW5ub3RhdGlvblFOYW1lLmVuZHNXaXRoKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkgJiYgaW1wb3J0RGVjbGFyYXRpb24uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoYW5ub3RhdGlvblFOYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJZm9yIChJSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbGFyYXRpb24gOiBpbXBvcnRzKQ0KLQkJew0KLQkJCWlmKGltcG9ydERlY2xhcmF0aW9uLmdldEVsZW1lbnROYW1lKCkuZW5kc1dpdGgoIioiKSkgLy8kTk9OLU5MUy0xJA0KLQkJCXsNCi0JCQkJU3RyaW5nIGltcG9ydFN0ciA9IGltcG9ydERlY2xhcmF0aW9uLmdldEVsZW1lbnROYW1lKCkuc3Vic3RyaW5nKDAsIGltcG9ydERlY2xhcmF0aW9uLmdldEVsZW1lbnROYW1lKCkubGVuZ3RoKCkgLSAxKTsNCi0JCQkJaWYoYW5ub3RhdGlvblFOYW1lLmVuZHNXaXRoKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkgJiYgYW5ub3RhdGlvblFOYW1lLmluZGV4T2YoaW1wb3J0U3RyKSA9PSAwKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIElWYWx1ZSBjb252ZXJ0RXhwcmVzc2lvbihFeHByZXNzaW9uIGVsZW1lbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJc3dpdGNoIChlbGVtZW50LmdldE5vZGVUeXBlKCkpDQotCQl7DQotCQkJY2FzZSBBU1ROb2RlLk1BUktFUl9BTk5PVEFUSU9OOg0KLQkJCXsNCi0JCQkJTWFya2VyQW5ub3RhdGlvbiBtYSA9IChNYXJrZXJBbm5vdGF0aW9uKSBlbGVtZW50Ow0KLQkJCQlBbm5vdGF0aW9uSW1wbCBhbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb25JbXBsKGdldEZ1bGx5UXVhbGlmaWVkQW5ub3RhdGlvbk5hbWUobWEpLCBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCkpOw0KLQkJCQlhbm5vdGF0aW9uLnNldExvY2F0b3IoY3JlYXRlTG9jYXRvcihtYSkpOw0KLQkJCQlyZXR1cm4gYW5ub3RhdGlvbjsNCi0JCQl9DQotCQkJY2FzZSBBU1ROb2RlLlNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTjoNCi0JCQl7DQotCQkJCWZpbmFsIFNpbmdsZU1lbWJlckFubm90YXRpb24gc21hID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGVsZW1lbnQ7DQotCQkJCWZpbmFsIFNldDxJUGFyYW1WYWx1ZVBhaXI+IHZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0NCi0JCQkJZmluYWwgSVZhbHVlIHZhbHVlID0gY29udmVydEV4cHJlc3Npb24oc21hLmdldFZhbHVlKCkpOw0KLQkJCQlpZiAodmFsdWUhPW51bGwpIHsNCi0JCQkJCXZhbHVlcy5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgidmFsdWUiLCB2YWx1ZSkpOyAvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQkJDQotCQkJCUFubm90YXRpb25JbXBsIGFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbkltcGwoZ2V0RnVsbHlRdWFsaWZpZWRBbm5vdGF0aW9uTmFtZShzbWEpLCB2YWx1ZXMpOw0KLQkJCQlhbm5vdGF0aW9uLnNldExvY2F0b3IoY3JlYXRlTG9jYXRvcihzbWEpKTsNCi0JCQkJcmV0dXJuIGFubm90YXRpb247DQotCQkJfQ0KLQkJCWNhc2UgQVNUTm9kZS5OT1JNQUxfQU5OT1RBVElPTjoNCi0JCQl7DQotCQkJCXJldHVybiBnZXROb3JtYWxBbm5vdGF0aW9uVmFsdWUoKE5vcm1hbEFubm90YXRpb24pIGVsZW1lbnQpOw0KLQkJCX0NCi0JCQljYXNlIEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVI6DQotCQkJew0KLQkJCQlBcnJheUluaXRpYWxpemVyIGFyciA9IChBcnJheUluaXRpYWxpemVyKSBlbGVtZW50Ow0KLQkJCQlMaXN0PEV4cHJlc3Npb24+IGxpc3QgPSBhcnIuZXhwcmVzc2lvbnMoKTsNCi0JCQkJSXRlcmF0b3I8RXhwcmVzc2lvbj4gaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsNCi0JCQkJU2V0PElWYWx1ZT4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpDQotCQkJCXsNCi0JCQkJCUV4cHJlc3Npb24gZXhwciA9IChFeHByZXNzaW9uKSBpdGVyLm5leHQoKTsNCi0JCQkJCXJlc3VsdC5hZGQoY29udmVydEV4cHJlc3Npb24oZXhwcikpOw0KLQkJCQl9DQotCQkJCXJldHVybiBuZXcgQXJyYXlWYWx1ZUltcGwocmVzdWx0KTsNCi0JCQl9DQotCQkJY2FzZSBBU1ROb2RlLk5VTExfTElURVJBTDoNCi0JCQl7DQotCQkJCS8vIHJldHVybiBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVOdWxsVmFsdWUoKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgQVNUTm9kZS5TSU1QTEVfTkFNRToNCi0JCQl7DQotCQkJCWJyZWFrOy8vcmV0dXJuIG5ldyBTdHJpbmdWYWx1ZUltcGwoKChTaW1wbGVOYW1lKWVsZW1lbnQpLmdldElkZW50aWZpZXIoKSk7DQotCQkJfQ0KLQkJCWNhc2UgQVNUTm9kZS5UWVBFX0xJVEVSQUw6DQotCQkJew0KLQkJCQlyZXR1cm4gZ2V0VHlwZUxpdGVyYWxWYWx1ZSgoVHlwZUxpdGVyYWwpIGVsZW1lbnQpOw0KLQkJCX0NCi0JCQljYXNlIEFTVE5vZGUuUVVBTElGSUVEX05BTUU6DQotCQkJew0KLQkJCQlRdWFsaWZpZWROYW1lIHFuID0gKFF1YWxpZmllZE5hbWUpIGVsZW1lbnQ7DQotCQkJCVF1YWxpZmllZE5hbWVWYWx1ZUltcGwgcW5WYWx1ZSA9IG5ldyBRdWFsaWZpZWROYW1lVmFsdWVJbXBsKHFuLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCQkJcW5WYWx1ZS5zZXRMb2NhdG9yKGNyZWF0ZUxvY2F0b3IocW4pKTsNCi0JCQkJcmV0dXJuIHFuVmFsdWU7DQotCQkJfQ0KLQkJCWNhc2UgQVNUTm9kZS5CT09MRUFOX0xJVEVSQUw6DQotCQkJew0KLQkJCQlCb29sZWFuTGl0ZXJhbCBibCA9IChCb29sZWFuTGl0ZXJhbCkgZWxlbWVudDsNCi0JCQkJQm9vbGVhblZhbHVlSW1wbCBiVmFsdWUgPSBuZXcgQm9vbGVhblZhbHVlSW1wbChibC5ib29sZWFuVmFsdWUoKSk7DQotCQkJCWJWYWx1ZS5zZXRMb2NhdG9yKGNyZWF0ZUxvY2F0b3IoYmwpKTsNCi0JCQkJcmV0dXJuIGJWYWx1ZTsNCi0JCQl9DQotCQkJY2FzZSBBU1ROb2RlLkNIQVJBQ1RFUl9MSVRFUkFMOg0KLQkJCXsNCi0JCQkJLy8gQ2hhcmFjdGVyTGl0ZXJhbCBjbCA9IChDaGFyYWN0ZXJMaXRlcmFsKSBlbGVtZW50Ow0KLQkJCQkvLyBUT0RPIEZpbmlzaCB3aXRoIHRoaXMgcmV0dXJuIG5ldyBDaGFyYWN0ZXJWYWx1ZShjbC5jaGFyVmFsdWUoKSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIEFTVE5vZGUuTlVNQkVSX0xJVEVSQUw6DQotCQkJew0KLQkJCQlOdW1iZXJMaXRlcmFsIG5sID0gKE51bWJlckxpdGVyYWwpIGVsZW1lbnQ7DQotCQkJCUludGVnZXJWYWx1ZUltcGwgaW50VmFsdWUgPSBuZXcgSW50ZWdlclZhbHVlSW1wbChubC5nZXRUb2tlbigpKTsNCi0JCQkJaW50VmFsdWUuc2V0TG9jYXRvcihjcmVhdGVMb2NhdG9yKG5sKSk7DQotCQkJCXJldHVybiBpbnRWYWx1ZTsNCi0JCQl9DQotCQkJY2FzZSBBU1ROb2RlLlNUUklOR19MSVRFUkFMOg0KLQkJCXsNCi0JCQkJU3RyaW5nTGl0ZXJhbCBzbCA9IChTdHJpbmdMaXRlcmFsKSBlbGVtZW50Ow0KLQkJCQlTdHJpbmdWYWx1ZUltcGwgc3RyVmFsdWUgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKHNsLmdldExpdGVyYWxWYWx1ZSgpKTsNCi0JCQkJc3RyVmFsdWUuc2V0TG9jYXRvcihjcmVhdGVMb2NhdG9yKHNsKSk7DQotCQkJCXJldHVybiBzdHJWYWx1ZTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJVmFsdWUgZ2V0VHlwZUxpdGVyYWxWYWx1ZShUeXBlTGl0ZXJhbCB0bCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlUeXBlIHR5cGUgPSB0bC5nZXRUeXBlKCk7DQotCQlOYW1lIG5hbWUgPSBudWxsOw0KLQkJaWYgKHR5cGUuaXNRdWFsaWZpZWRUeXBlKCkpDQotCQl7DQotCQkJbmFtZSA9ICgoUXVhbGlmaWVkVHlwZSkgdHlwZSkuZ2V0TmFtZSgpOw0KLQkJfSBlbHNlDQotCQl7DQotCQkJaWYgKHR5cGUuaXNTaW1wbGVUeXBlKCkpDQotCQkJew0KLQkJCQluYW1lID0gKChTaW1wbGVUeXBlKSB0eXBlKS5nZXROYW1lKCk7DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKG5hbWUgIT0gbnVsbCkNCi0JCXsNCi0JCQlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQodGwpOw0KLQkJCWlmIChjdSAhPSBudWxsKQ0KLQkJCXsNCi0JCQkJU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTmFtZSA9IG5hbWUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7DQotCQkJCWlmICh0eXBlLmlzU2ltcGxlVHlwZSgpKQ0KLQkJCQl7DQotCQkJCQlmdWxseVF1YWxpZmllZE5hbWUgPSByZXNvbHZlVHlwZSgoSUNvbXBpbGF0aW9uVW5pdCkgY3UuZ2V0SmF2YUVsZW1lbnQoKSwgZnVsbHlRdWFsaWZpZWROYW1lKTsNCi0JCQkJfQ0KLQ0KLQkJCQlDbGFzc1ZhbHVlSW1wbCBjVmFsdWUgPSBuZXcgQ2xhc3NWYWx1ZUltcGwoZnVsbHlRdWFsaWZpZWROYW1lKTsNCi0JCQkJY1ZhbHVlLnNldExvY2F0b3IoY3JlYXRlTG9jYXRvcih0bCkpOw0KLQkJCQlyZXR1cm4gY1ZhbHVlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSBJVmFsdWUgZ2V0Tm9ybWFsQW5ub3RhdGlvblZhbHVlKE5vcm1hbEFubm90YXRpb24gbmEpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IGwgPSBuYS52YWx1ZXMoKTsNCi0JCUl0ZXJhdG9yPE1lbWJlclZhbHVlUGFpcj4gaXRlciA9IGwuaXRlcmF0b3IoKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkNCi0JCXsNCi0JCQlNZW1iZXJWYWx1ZVBhaXIgbXZwID0gKE1lbWJlclZhbHVlUGFpcikgaXRlci5uZXh0KCk7DQotCQkJSVZhbHVlIG12cHZhbCA9IGNvbnZlcnRFeHByZXNzaW9uKG12cC5nZXRWYWx1ZSgpKTsNCi0JCQlQYXJhbVZhbHVlUGFpckltcGwgcGFpciA9IG5ldyBQYXJhbVZhbHVlUGFpckltcGwobXZwLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCksIG12cHZhbCk7DQotCQkJcGFpci5zZXRMb2NhdG9yKGNyZWF0ZUxvY2F0b3IobXZwKSk7DQotCQkJcmVzdWx0LmFkZChwYWlyKTsNCi0JCX0NCi0JCQ0KLQkJQW5ub3RhdGlvbkltcGwgYW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uSW1wbChnZXRGdWxseVF1YWxpZmllZEFubm90YXRpb25OYW1lKG5hKSwgcmVzdWx0KTsNCi0JCWFubm90YXRpb24uc2V0TG9jYXRvcihjcmVhdGVMb2NhdG9yKG5hKSk7DQotCQlyZXR1cm4gYW5ub3RhdGlvbjsNCi0JfQkNCi0NCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRBbm5vdGF0aW9uTmFtZShBbm5vdGF0aW9uIGFubm8pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJTmFtZSB0eXBlTmFtZSA9IGFubm8uZ2V0VHlwZU5hbWUoKTsNCi0JCVN0cmluZyBmdWxseVF1YWxpZmllZE5hbWUgPSB0eXBlTmFtZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsNCi0JCWlmICh0eXBlTmFtZS5pc1NpbXBsZU5hbWUoKSkNCi0JCXsNCi0JCQlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoYW5ubyk7DQotCQkJZnVsbHlRdWFsaWZpZWROYW1lID0gcmVzb2x2ZVR5cGUoKElDb21waWxhdGlvblVuaXQpIGN1LmdldEphdmFFbGVtZW50KCksIGZ1bGx5UXVhbGlmaWVkTmFtZSk7DQotCQl9DQotCQlyZXR1cm4gZnVsbHlRdWFsaWZpZWROYW1lOw0KLQl9DQotCQ0KLQlwcml2YXRlIENvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoRXhwcmVzc2lvbiBlbGVtZW50KQ0KLQl7DQotCQlBU1ROb2RlIGN1ID0gZWxlbWVudDsNCi0JCXdoaWxlIChjdSAhPSBudWxsICYmICEoY3UgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpKQ0KLQkJew0KLQkJCWN1ID0gY3UuZ2V0UGFyZW50KCk7DQotCQl9DQotCQlyZXR1cm4gKENvbXBpbGF0aW9uVW5pdCkgY3U7DQotCX0NCi0JDQotCXByaXZhdGUgU3RyaW5nIHJlc29sdmVUeXBlKElDb21waWxhdGlvblVuaXQgaWN1LCBTdHJpbmcgZnVsbHlRdWFsaWZpZWROYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCVN0cmluZyBsb2NhbEZ1bGx5UXVhbGlmaWVkTmFtZSA9IGZ1bGx5UXVhbGlmaWVkTmFtZTsNCi0JCUlUeXBlW10gYWxsVHlwZXMgPSBpY3UuZ2V0QWxsVHlwZXMoKTsNCi0JCWlmIChhbGxUeXBlcyA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiBsb2NhbEZ1bGx5UXVhbGlmaWVkTmFtZTsNCi0JCX0NCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsVHlwZXMubGVuZ3RoOyBpKyspDQotCQl7DQotCQkJU3RyaW5nW11bXSByZXNvbHZlZFR5cGUgPSBhbGxUeXBlc1tpXS5yZXNvbHZlVHlwZShsb2NhbEZ1bGx5UXVhbGlmaWVkTmFtZSk7DQotCQkJaWYgKHJlc29sdmVkVHlwZSAhPSBudWxsICYmIHJlc29sdmVkVHlwZS5sZW5ndGggPiAwKQ0KLQkJCXsNCi0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZXNvbHZlZFR5cGVbMF0ubGVuZ3RoOyBqKyspDQotCQkJCXsNCi0JCQkJCWJ1ZiA9IGFwcGVuZERvdChqLCBidWYpOw0KLQkJCQkJYnVmLmFwcGVuZChyZXNvbHZlZFR5cGVbMF1bal0pOw0KLQkJCQl9DQotCQkJCWxvY2FsRnVsbHlRdWFsaWZpZWROYW1lID0gYnVmLnRvU3RyaW5nKCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBsb2NhbEZ1bGx5UXVhbGlmaWVkTmFtZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgYXBwZW5kRG90KGludCBpbmRleCwgU3RyaW5nQnVmZmVyIGJ1ZmYpDQotCXsNCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBidWZmOw0KLQkJaWYgKGluZGV4ICE9IDApDQotCQl7DQotCQkJcmVzdWx0LmFwcGVuZCgnLicpOw0KLQkJfQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBJQW5ub3RhdGlvbjxUPiBnZXRTcGVjaWZpY0Fubm90YXRpb25Gcm9tTWVtYmVyKGZpbmFsIFQgdHlwZSwgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgU3RyaW5nIGFubm90YXRpb25RTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoIWlzU3VwcG9ydGVkSmF2YUVsZW1lbnQodHlwZSkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFzc2VkIGFyZ3VtZW50IGlzIG5vdCBvZiBjb3JyZWN0IHR5cGUuIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCQ0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCA9IG51bGw7DQotCQlpZiAodHlwZSBpbnN0YW5jZW9mIElNZW1iZXIpIHsNCi0JCQljVW5pdCA9ICgoSU1lbWJlcil0eXBlKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWNVbml0ID0gKChJVHlwZVBhcmFtZXRlcil0eXBlKS5nZXREZWNsYXJpbmdNZW1iZXIoKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCX0NCi0JCQ0KLQkJaWYgKGNVbml0ID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0NCi0JCWZpbmFsIENvbXBpbGF0aW9uVW5pdCB1bml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQlmaW5hbCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIHVuaXQpOw0KLQkJDQotCQlzd2l0Y2godHlwZS5nZXRFbGVtZW50VHlwZSgpKQ0KLQkJew0KLQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRToNCi0JCQlyZXR1cm4gZ2V0U3BlY2lmaWNBbm5vdGF0aW9uKHR5cGUsIHR5cGVEZWNsYXJhdGlvbiwgKElUeXBlKXR5cGUsIGFubm90YXRpb25RTmFtZSk7DQotCQkNCi0JCWNhc2UgSUphdmFFbGVtZW50LkZJRUxEOg0KLQkJCUlGaWVsZCBmaWVsZCA9IChJRmllbGQpIHR5cGU7DQotCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRGaWVsZERlY2xhcmF0aW9uKGZpZWxkLCAoVHlwZURlY2xhcmF0aW9uKXR5cGVEZWNsYXJhdGlvbik7DQotCQkJcmV0dXJuIGdldFNwZWNpZmljQW5ub3RhdGlvbih0eXBlLCBmaWVsZERlY2xhcmF0aW9uLCBmaWVsZC5nZXREZWNsYXJpbmdUeXBlKCksIGFubm90YXRpb25RTmFtZSk7DQotDQotCQljYXNlIElKYXZhRWxlbWVudC5NRVRIT0Q6DQotCQkJSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCkgdHlwZTsNCi0JCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24obWV0aG9kLCAoVHlwZURlY2xhcmF0aW9uKXR5cGVEZWNsYXJhdGlvbik7DQotCQkJcmV0dXJuIGdldFNwZWNpZmljQW5ub3RhdGlvbih0eXBlLCBtZXRob2REZWNsYXJhdGlvbiwgbWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKSwgYW5ub3RhdGlvblFOYW1lKTsNCi0NCi0JCWNhc2UgSUphdmFFbGVtZW50LlRZUEVfUEFSQU1FVEVSOg0KLQkJCW1ldGhvZCA9IChJTWV0aG9kKSgoSVR5cGVQYXJhbWV0ZXIpIHR5cGUpLmdldFBhcmVudCgpOw0KLQkJCW1ldGhvZERlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRNZXRob2REZWNsYXJhdGlvbihtZXRob2QsIChUeXBlRGVjbGFyYXRpb24pdHlwZURlY2xhcmF0aW9uKTsNCi0JCQlyZXR1cm4gZ2V0U3BlY2lmaWNQYXJhbUFubm90YXRpb24odHlwZSwgbWV0aG9kRGVjbGFyYXRpb24sIG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCksIGFubm90YXRpb25RTmFtZSk7DQotCQl9DQotDQotCQlyZXR1cm4gbnVsbDsNCi0JfQkNCi0JDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IElBbm5vdGF0aW9uPFQ+IGdldFNwZWNpZmljQW5ub3RhdGlvbihmaW5hbCBUIGlNZW1iZXIsIGZpbmFsIEJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24sIGZpbmFsIElUeXBlIHR5cGUsIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKGJvZHlEZWNsYXJhdGlvbiAhPSBudWxsKQ0KLQkJew0KLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQkJCWZpbmFsIExpc3QgbGlzdCA9IGJvZHlEZWNsYXJhdGlvbi5tb2RpZmllcnMoKTsNCi0JCQlyZXR1cm4gZXh0cmFjdFNwZWNpZmljQW5ub3RhdGlvbihpTWVtYmVyLCBsaXN0LCB0eXBlLCBhbm5vdGF0aW9uUU5hbWUpOw0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IElBbm5vdGF0aW9uPFQ+IGdldFNwZWNpZmljUGFyYW1Bbm5vdGF0aW9uKFQgaU1lbWJlciwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIGZpbmFsIElUeXBlIHR5cGUsIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKG1ldGhvZERlY2xhcmF0aW9uICE9IG51bGwpDQotCQl7DQotCQkJZm9yIChPYmplY3QgcGFyYW0gOiBtZXRob2REZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKCkpDQotCQkJew0KLQkJCQlpZiAocGFyYW0gaW5zdGFuY2VvZiBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uICYmDQotCQkJCQkJKChJVHlwZVBhcmFtZXRlcilpTWVtYmVyKS5nZXRFbGVtZW50TmFtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCgoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbilwYXJhbSkuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpKQ0KLQkJCQl7DQotCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JCQkJCWZpbmFsIExpc3QgbGlzdCA9ICgoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgcGFyYW0pLm1vZGlmaWVycygpOw0KLQkJCQkNCi0JCQkJCXJldHVybiBleHRyYWN0U3BlY2lmaWNBbm5vdGF0aW9uKGlNZW1iZXIsIGxpc3QsIHR5cGUsIGFubm90YXRpb25RTmFtZSk7DQotCQkJCX0NCi0JCQl9CQkJDQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQkNCi0JDQotCXByaXZhdGUgYm9vbGVhbiBpc1N1cHBvcnRlZEphdmFFbGVtZW50KGZpbmFsIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgDQotCXsNCi0JCXJldHVybiAJamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKT09SUphdmFFbGVtZW50Lk1FVEhPRCB8fA0KLQkJCQlqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpPT1JSmF2YUVsZW1lbnQuVFlQRSB8fA0KLQkJCQlqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpPT1JSmF2YUVsZW1lbnQuRklFTEQgfHwNCi0JCQkJamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKT09SUphdmFFbGVtZW50LlRZUEVfUEFSQU1FVEVSOw0KLQl9DQotCQ0KLQlwcml2YXRlIENvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoKSANCi0Jew0KLQkJaWYgKGNVbml0PT1udWxsKSB7DQotCQkJY1VuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChpVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgbnVsbCk7DQotCQl9DQotCQkNCi0JCXJldHVybiBjVW5pdDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJTG9jYXRvciBjcmVhdGVMb2NhdG9yKGZpbmFsIEFTVE5vZGUgbm9kZSkNCi0Jew0KLQkJZmluYWwgaW50IGxpbmVOdW1iZXIgPSBnZXRDb21waWxhdGlvblVuaXQoKS5nZXRMaW5lTnVtYmVyKG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCXJldHVybiBuZXcgTG9jYXRvckltcGwobGluZU51bWJlciwgbm9kZS5nZXRTdGFydFBvc2l0aW9uKCksIG5vZGUuZ2V0TGVuZ3RoKCkpOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uUHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2MxN2JmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvblByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25Qcm9wZXJ0eTsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblByb3BlcnR5IGltcGxlbWVudHMgSUFubm90YXRpb25Qcm9wZXJ0eQ0KLXsNCi0JcHJpdmF0ZSBTdHJpbmcgYW5ub3RhdGlvbk5hbWU7DQotCXByaXZhdGUgU3RyaW5nIGF0dHJpYnV0ZU5hbWU7DQotCXByaXZhdGUgU3RyaW5nIHZhbHVlOw0KLQlwcml2YXRlIEF0dHJpYnV0ZVR5cGVFbnVtIGF0dHJpYnV0ZVR5cGU7DQotCQ0KLQkvKioNCi0JICogUHVibGljIGNvbnN0cnVjdG9yIGZvciBBbm5vdGF0aW9uUHJvcGVydHkgb2JqZWN0cw0KLQkgKiANCi0JICogQHBhcmFtIGFubm90YXRpb25OYW1lIC0gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBOYW1lIGZvciB0aGUgQW5ub3RhdGlvbi4NCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgLSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIE5hbWUgZm9yIHRoZSBBdHRyaWJ1dGUuDQotCSAqIEBwYXJhbSB2YWx1ZSAtIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgVmFsdWUgZm9yIHRoZSBBdHRyaWJ1dGUuDQotCSAqLw0KLQlwdWJsaWMgQW5ub3RhdGlvblByb3BlcnR5KGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSwgZmluYWwgQXR0cmlidXRlVHlwZUVudW0gYXR0cmlidXRlVHlwZSkNCi0Jew0KLQkJdGhpcy5hbm5vdGF0aW9uTmFtZSA9IGFubm90YXRpb25OYW1lOw0KLQkJdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTsNCi0JCXRoaXMudmFsdWUgPSB2YWx1ZTsNCi0JCXRoaXMuYXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGU7DQotCX0NCi0JCQ0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkNCi0Jew0KLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbk5hbWU7DQotCX0NCi0NCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkNCi0Jew0KLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlTmFtZTsNCi0JfQ0KLQkNCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpDQotCXsNCi0JCXJldHVybiB0aGlzLnZhbHVlOw0KLQl9DQotCQ0KLQlwdWJsaWMgQXR0cmlidXRlVHlwZUVudW0gZ2V0QXR0cmlidXRlVHlwZSgpDQotCXsNCi0JCXJldHVybiB0aGlzLmF0dHJpYnV0ZVR5cGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YjAxOGNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIgaW1wbGVtZW50cyBJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyDQotew0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFNldDxJUGFyYW1WYWx1ZVBhaXI+PiB0eXBlQW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAgPSANCi0JCW5ldyBIYXNoTWFwPFN0cmluZywgU2V0PElQYXJhbVZhbHVlUGFpcj4+KCk7DQotCXByaXZhdGUgTWFwPFN0cmluZywgU2V0PElQYXJhbVZhbHVlUGFpcj4+IG1ldGhvZEFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwID0gDQotCQluZXcgSGFzaE1hcDxTdHJpbmcsIFNldDxJUGFyYW1WYWx1ZVBhaXI+PigpOw0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFNldDxJUGFyYW1WYWx1ZVBhaXI+PiBwYXJhbWV0ZXJBbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcCA9IA0KLQkJbmV3IEhhc2hNYXA8U3RyaW5nLCBTZXQ8SVBhcmFtVmFsdWVQYWlyPj4oKTsNCi0JDQotCS8qKg0KLQkgKiBBZGQgQW5ub3RhdGlvbiBQcm9wZXJ0eSB0byB0aGUgY29udGFpbmVyLiANCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4gb3IgPGNvZGU+YW5ub3RhdGlvblByb3BlcnR5PC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZEFubm90YXRpb25Qcm9wZXJ0eShmaW5hbCBBbm5vdGF0aW9uUHJvcGVydHkgYW5ub3RhdGlvblByb3BlcnR5LCBmaW5hbCBFbGVtZW50VHlwZSB0YXJnZXQpDQotCXsNCi0JCWlmKGFubm90YXRpb25Qcm9wZXJ0eSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYW5ub3RhdGlvblByb3BlcnR5IGNvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZih0YXJnZXQgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInRhcmdldCBjb3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJaWYoISh0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLlRZUEUpKSAmJiAhKHRhcmdldC5lcXVhbHMoRWxlbWVudFR5cGUuTUVUSE9EKSkgJiYgISh0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLlBBUkFNRVRFUikpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRhcmdldCBwYXJhbWV0ZXIgaXMgbm90IG9mIGNvcnJlY3QgdHlwZSIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlNYXA8U3RyaW5nLCBTZXQ8SVBhcmFtVmFsdWVQYWlyPj4gYW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAgPSBudWxsOw0KLQkJDQotCQlpZih0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLlRZUEUpKQ0KLQkJew0KLQkJCWFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwID0gdHlwZUFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwOw0KLQkJfQ0KLQkJaWYodGFyZ2V0LmVxdWFscyhFbGVtZW50VHlwZS5NRVRIT0QpKQ0KLQkJew0KLQkJCWFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwID0gbWV0aG9kQW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXA7DQotCQl9DQotCQlpZih0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLlBBUkFNRVRFUikpDQotCQl7DQotCQkJYW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAgPSBwYXJhbWV0ZXJBbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcDsNCi0JCX0NCi0JCQ0KLQkJDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlc1NldCA9IGFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwLmdldChhbm5vdGF0aW9uUHJvcGVydHkuZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQlpZihwYXJhbVZhbHVlc1NldCA9PSBudWxsKQ0KLQkJew0KLQkJCXBhcmFtVmFsdWVzU2V0ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJCWFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwLnB1dChhbm5vdGF0aW9uUHJvcGVydHkuZ2V0QW5ub3RhdGlvbk5hbWUoKSwgcGFyYW1WYWx1ZXNTZXQpOw0KLQkJfQ0KLQ0KLQkJSVZhbHVlIHZhbHVlID0gbnVsbDsgDQotCQlpZihhbm5vdGF0aW9uUHJvcGVydHkuZ2V0QXR0cmlidXRlVHlwZSgpID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJDQotCQlpZihhbm5vdGF0aW9uUHJvcGVydHkuZ2V0QXR0cmlidXRlVHlwZSgpLmVxdWFscyhBdHRyaWJ1dGVUeXBlRW51bS5CT09MRUFOKSkNCi0JCXsNCi0JCQl2YWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUJvb2xlYW5WYWx1ZShuZXcgQm9vbGVhbihhbm5vdGF0aW9uUHJvcGVydHkuZ2V0VmFsdWUoKSkpOw0KLQkJfQ0KLQkJaWYoYW5ub3RhdGlvblByb3BlcnR5LmdldEF0dHJpYnV0ZVR5cGUoKS5lcXVhbHMoQXR0cmlidXRlVHlwZUVudW0uQ0xBU1MpKQ0KLQkJew0KLQkJCS8vVE9ETyBjaGFuZ2UgdGhpcyEhISEhIQ0KLQkJCS8vdmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVDbGFzc1ZhbHVlKGFubm90YXRpb25Qcm9wZXJ0eS5nZXRWYWx1ZSgpKTsNCi0JCX0NCi0JCWlmKGFubm90YXRpb25Qcm9wZXJ0eS5nZXRBdHRyaWJ1dGVUeXBlKCkuZXF1YWxzKEF0dHJpYnV0ZVR5cGVFbnVtLklOVEVHRVIpKQ0KLQkJew0KLQkJCXZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlSW50ZWdlclZhbHVlKGFubm90YXRpb25Qcm9wZXJ0eS5nZXRWYWx1ZSgpKTsNCi0JCX0NCi0JCWlmKGFubm90YXRpb25Qcm9wZXJ0eS5nZXRBdHRyaWJ1dGVUeXBlKCkuZXF1YWxzKEF0dHJpYnV0ZVR5cGVFbnVtLlFVQUxJRklFRF9OQU1FKSkNCi0JCXsNCi0JCQl2YWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZShhbm5vdGF0aW9uUHJvcGVydHkuZ2V0VmFsdWUoKSk7DQotCQl9DQotCQlpZih2YWx1ZSA9PSBudWxsKQ0KLQkJew0KLQkJCXZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoYW5ub3RhdGlvblByb3BlcnR5LmdldFZhbHVlKCkpOw0KLQkJfQ0KLQ0KLQkJSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWVQYWlyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZShhbm5vdGF0aW9uUHJvcGVydHkuZ2V0QXR0cmlidXRlTmFtZSgpLCB2YWx1ZSk7DQotCQkNCi0JCXBhcmFtVmFsdWVzU2V0LmFkZChwYXJhbVZhbHVlUGFpcik7DQotCX0NCi0JLyoqDQotCSAqIEBwYXJhbSBJVHlwZVBhcmFtZXRlciANCi0JICogQHJldHVybiBTZXQgd2l0aCBhbGwgQW5ub3RhdGlvbiBmcm9tIHRoZSBjb250YWluZXIsIHdoaWNoIGFyZSBJVHlwZVBhcmFtZXRlciByZWxldmFudC4NCi0JICovDQotCXB1YmxpYyBTZXQ8SUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+PiBnZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyhJVHlwZVBhcmFtZXRlciB0UGFyYW0pDQotCXsNCi0JCXJldHVybiBnZXRBbm5vdGF0aW9ucyhFbGVtZW50VHlwZS5QQVJBTUVURVIsIHRQYXJhbSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gU2V0IHdpdGggYWxsIEFubm90YXRpb24gZnJvbSB0aGUgY29udGFpbmVyLCB3aGljaCBhcmUgSVR5cGUgcmVsZXZhbnQuDQotCSAqLw0KLQlwdWJsaWMgU2V0PElBbm5vdGF0aW9uPElUeXBlPj4gZ2V0VHlwZUFubm90YXRpb25zKElUeXBlIHR5cGUpDQotCXsNCi0JCXJldHVybiBnZXRBbm5vdGF0aW9ucyhFbGVtZW50VHlwZS5UWVBFLCB0eXBlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHJldHVybiBTZXQgd2l0aCBhbGwgQW5ub3RhdGlvbiBmcm9tIHRoZSBjb250YWluZXIsIHdoaWNoIGFyZSBJTWV0aG9kIHJlbGV2YW50Lg0KLQkgKi8NCi0JcHVibGljIFNldDxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gZ2V0TWV0aG9kQW5ub3RhdGlvbnMoSU1ldGhvZCBtZXRob2QpDQotCXsNCi0JCXJldHVybiBnZXRBbm5vdGF0aW9ucyhFbGVtZW50VHlwZS5NRVRIT0QgLCBtZXRob2QpOw0KLQl9DQotCQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBTZXQ8SUFubm90YXRpb248VD4+IGdldEFubm90YXRpb25zKGZpbmFsIEVsZW1lbnRUeXBlIHRhcmdldCwgZmluYWwgVCBpVGFyZ2V0KQ0KLQl7DQotCQlpZighKHRhcmdldC5lcXVhbHMoRWxlbWVudFR5cGUuVFlQRSkpICYmICEodGFyZ2V0LmVxdWFscyhFbGVtZW50VHlwZS5NRVRIT0QpKSAmJiAhKHRhcmdldC5lcXVhbHMoRWxlbWVudFR5cGUuUEFSQU1FVEVSKSkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGFyZ2V0IHBhcmFtZXRlciBpcyBub3Qgb2YgY29ycmVjdCB0eXBlIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCU1hcDxTdHJpbmcsIFNldDxJUGFyYW1WYWx1ZVBhaXI+PiBhbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcCA9IG51bGw7DQotCQlpZih0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLlRZUEUpKQ0KLQkJew0KLQkJCWFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwID0gdHlwZUFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwOw0KLQkJfQ0KLQkJaWYodGFyZ2V0LmVxdWFscyhFbGVtZW50VHlwZS5NRVRIT0QpKQ0KLQkJew0KLQkJCWFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwID0gbWV0aG9kQW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXA7DQotCQl9DQotCQlpZih0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLlBBUkFNRVRFUikpDQotCQl7DQotCQkJYW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAgPSBwYXJhbWV0ZXJBbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcDsNCi0JCX0NCi0JCVNldDxJQW5ub3RhdGlvbjxUPj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8SUFubm90YXRpb248VD4+KCk7DQotCQlTZXQ8U3RyaW5nPiBrZXlzID0gYW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAua2V5U2V0KCk7DQotCQlmb3IgKFN0cmluZyBrZXkgOiBrZXlzKQ0KLQkJew0KLQkJCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVQYWlyc1NldCA9IGFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwLmdldChrZXkpOw0KLQkJCUlBbm5vdGF0aW9uPFQ+IGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKGtleSwgcGFyYW1WYWx1ZVBhaXJzU2V0LCBpVGFyZ2V0KTsNCi0JCQlyZXN1bHQuYWRkKGFubm90YXRpb24pOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9CQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvblV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4NTVhMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvZHlEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklFeHRlbmRlZE1vZGlmaWVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5jbGF6ei5BU1RVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLnRleHQuSmF4V3NVdGlsTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuRWRpdFJlc291cmNlc01hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuRmlsZVV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLklGaWxlVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsNCi0NCi0vKioNCi0gKiBDb250YWlucyB1dGlsaXRpZXMgZm9yIGdldHRpbmcgQVNUIG9iamVjdHMgbmVlZGVkIGluIGFubm90YXRpb24gcHJvY2Vzc2luZw0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVXRpbHMNCi17DQotCXByaXZhdGUgc3RhdGljIEFubm90YXRpb25VdGlscyB1dGlscyA9IG51bGw7DQotCXByaXZhdGUgZmluYWwgSUZpbGVVdGlscyBmaWxlVXRpbHMgPSBGaWxlVXRpbHMuZ2V0SW5zdGFuY2UoKTsNCi0NCi0JLyoqDQotCSAqIFRoZSBmYWN0b3J5IG1ldGhvZC4NCi0JICogDQotCSAqIEByZXR1cm4gYSBBbm5vdGF0aW9uVXRpbHMgaW5zdGFuY2UuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25VdGlscyBnZXRJbnN0YW5jZSgpDQotCXsNCi0JCWlmICh1dGlscyA9PSBudWxsKQ0KLQkJew0KLQkJCXV0aWxzID0gbmV3IEFubm90YXRpb25VdGlscygpOw0KLQkJfQ0KLQkJcmV0dXJuIHV0aWxzOw0KLQl9DQotCQ0KLQkvKioNCi0JICogR2V0cyBJRG9jdW1lbnQsIHdoaWNoIGNvcmVzcG9uZHMgdG8gb25lIENvbXBpbGF0aW9uVW5pdC4NCi0JICogDQotCSAqIEBwYXJhbSB1bml0IC0NCi0JICogICAgICAgICAgICBDb21waWxhdGlvbiBVbml0LCB3aGljaCB3aWxsIGJlIHVzZWQgYXMgc3RhcnRpbmcgcG9pbnQgdG8gZ2V0IHRoZSBJRG9jdW1lbnQuDQotCSAqIA0KLQkgKiBAcmV0dXJuIElEb2N1bWVudCB3aGljaCBpcyBmb3VuZC4NCi0JICogDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudChJQ29tcGlsYXRpb25Vbml0IHVuaXQpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCVN0cmluZyBzb3VyY2UgPSB1bml0LmdldEJ1ZmZlcigpLmdldENvbnRlbnRzKCk7IA0KLQkJcmV0dXJuIG5ldyBEb2N1bWVudChzb3VyY2UpOyANCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJlbW92ZXMgQW5ub3RhdGlvbnMgb2Ygc3BlY2lmaWVkIElKYXZhRWxlbWVudC4NCi0JICogDQotCSAqIEBwYXJhbSBqYXZhRWxlbWVudCAtIElKYXZhRWxlbWVudCB3aGljaCB3aWxsIGJlIHVzZWQgYXMgc3RhcnRpbmcgcG9pbiBmb3IgcmVtb3ZpbmcgdGhlIGFubm90YXRpb25zLg0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbnMgLSBTZXQgd2hpY2ggY29udGFpbnMgU3RyaW5nIHZhbHVlcyBmb3IgdGhlIGFubm90YXRpb25zIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZC4gSWYgdGhpcyBTZXQgaXMgZW1wdHkgYWxsIEFubm90YXRpb25zIHdpbGwgYmUgcmVtb3ZlZC4NCi0JICogQHBhcmFtIGRlZXBSZW1vdmUgLSBCb29sZWFuIHZhbHVlLCByZXByZXNlbnRpbmcgd2hldGhlciBBbm5vdGF0aW9ucyBmcm9tIGphdmFFbGVtZXQgY2hpbGRzIHdpbGwgYmUgcmVtb3ZlZC4gDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiANCi0JICogDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB0aG93biBpZiBBU1QgVHlwZURlY2xhcmF0aW9uIGNhbm5vdCBiZSBmb3VuZCBmb3IgPGNvZGU+dHlwZTwvY29kZT4gYW5kIGFsc28gaXMgdXNlZCBhcyB3cmFwcGVyIGluIGNhc2Uge0BsaW5rIENvcmVFeGNlcHRpb259IG9yDQotCSAqICAgICAgICAgICAgIHtAbGluayBCYWRMb2NhdGlvbkV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoaWxlIHByb2Nlc3NpbmcuDQotCSAqIEB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiANCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb25zKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgU2V0PFN0cmluZz4gYW5ub3RhdGlvbnMsIGJvb2xlYW4gZGVlcFJlbW92ZSkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24sIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24NCi0Jew0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkNCi0JCXsNCi0JCQlJVHlwZSB0eXBlID0gKElUeXBlKWphdmFFbGVtZW50Ow0KLQkJCUlDb21waWxhdGlvblVuaXQgY1VuaXQgPSB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJCVN0cmluZyBjbGFzc05hbWUgPSB0eXBlLmdldEVsZW1lbnROYW1lKCk7DQotCQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChjVW5pdCwgbnVsbCk7DQotDQotCQkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oY2xhc3NOYW1lLCB1bml0KTsNCi0JCQlpZiAodHlwZURlY2xhcmF0aW9uID09IG51bGwpDQotCQkJew0KLQkJCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbigidHlwZURlY2xhcmF0aW9uIHNob3VsZCBub3QgYmUgbnVsbCIsLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKYXhXc1V0aWxNZXNzYWdlcy5Bbm5vdGF0aW9uVXRpbHNfUGFyYW1TaG91bGROb3RCZU51bGxNc2csICJ0eXBlRGVjbGFyYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQl9DQotCQkJDQotCQkJcmVtb3ZlVHlwZUFubm90YXRpb25zKHR5cGUsIHR5cGVEZWNsYXJhdGlvbiwgdW5pdCwgY1VuaXQsIGFubm90YXRpb25zKTsNCi0NCi0JCQlpZighZGVlcFJlbW92ZSkNCi0JCQl7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQkJDQotCQkJSUZpZWxkW10gdG1wRmllbGRzID0gdHlwZS5nZXRGaWVsZHMoKTsNCi0JCQlpZiAodG1wRmllbGRzICE9IG51bGwgJiYgdG1wRmllbGRzLmxlbmd0aCA+IDApDQotCQkJew0KLQkJCQlmb3IgKElGaWVsZCB0bXBGaWVsZCA6IHRtcEZpZWxkcykNCi0JCQkJew0KLQkJCQkJcmVtb3ZlRmllbGRBbm5vdGF0aW9ucyh0bXBGaWVsZCwgdHlwZSwgY1VuaXQsIGFubm90YXRpb25zKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQkNCi0JCQlJTWV0aG9kW10gdG1wTWV0aG9kcyA9IHR5cGUuZ2V0TWV0aG9kcygpOw0KLQkJCWlmICh0bXBNZXRob2RzICE9IG51bGwgJiYgdG1wTWV0aG9kcy5sZW5ndGggPiAwKQ0KLQkJCXsNCi0JCQkJZm9yIChJTWV0aG9kIHRtcE1ldGhvZCA6IHRtcE1ldGhvZHMpDQotCQkJCXsNCi0JCQkJCXJlbW92ZU1ldGhvZEFubm90YXRpb25zKHRtcE1ldGhvZCwgdHlwZSwgY1VuaXQsIGFubm90YXRpb25zKTsNCi0NCi0JCQkJCS8vUmVtb3ZlIHBhcmFtcyBhbm5vdGF0aW9ucw0KLQkJCQkJZm9yIChTdHJpbmcgcGFyYW1OYW1lIDogdG1wTWV0aG9kLmdldFBhcmFtZXRlck5hbWVzKCkpDQotCQkJCQl7DQotCQkJCQkJSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IHRtcE1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKHBhcmFtTmFtZSk7DQotCQkJCQkJcmVtb3ZlUGFyYW1Bbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLCB0eXBlLCBjVW5pdCwgYW5ub3RhdGlvbnMsIHBhcmFtTmFtZSk7CQkJDQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQkNCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUZpZWxkKQ0KLQkJew0KLQkJCUlGaWVsZCBmaWVsZCA9IChJRmllbGQpamF2YUVsZW1lbnQ7DQotCQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IGZpZWxkLmdldERlY2xhcmluZ1R5cGUoKTsNCi0JCQlJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCA9IGRlY2xhcmluZ1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQkJDQotCQkJcmVtb3ZlRmllbGRBbm5vdGF0aW9ucyhmaWVsZCwgZGVjbGFyaW5nVHlwZSwgZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBhbm5vdGF0aW9ucyk7DQotCQl9DQotCQkNCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkNCi0JCXsNCi0JCQlJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKWphdmFFbGVtZW50Ow0KLQkJCUlUeXBlIGRlY2xhcmluZ1R5cGUgPSBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpOw0KLQkJCUlDb21waWxhdGlvblVuaXQgZGVjbGFyaW5nVHlwZUNvbXBVbml0ID0gZGVjbGFyaW5nVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkNCi0JCQlyZW1vdmVNZXRob2RBbm5vdGF0aW9ucyhtZXRob2QsIGRlY2xhcmluZ1R5cGUsIGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgYW5ub3RhdGlvbnMpOw0KLQkJCWlmKCFkZWVwUmVtb3ZlKQ0KLQkJCXsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0NCi0JCQkvL1JlbW92ZSBwYXJhbXMgYW5ub3RhdGlvbnMNCi0JCQlmb3IgKFN0cmluZyBwYXJhbU5hbWU6IG1ldGhvZC5nZXRQYXJhbWV0ZXJOYW1lcygpKQ0KLQkJCXsNCi0JCQkgIElUeXBlUGFyYW1ldGVyIHBhcmFtID0gbWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIocGFyYW1OYW1lKTsNCi0JCQkgIHJlbW92ZVBhcmFtQW5ub3RhdGlvbnMocGFyYW0sIGRlY2xhcmluZ1R5cGUsIGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgYW5ub3RhdGlvbnMsIHBhcmFtTmFtZSk7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlUGFyYW1ldGVyKQ0KLQkJew0KLQkJCUlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSAoSVR5cGVQYXJhbWV0ZXIpamF2YUVsZW1lbnQ7DQotCQkJSU1ldGhvZCB0bXBNZXRob2QgPSAoSU1ldGhvZCkgdHlwZVBhcmFtZXRlci5nZXREZWNsYXJpbmdNZW1iZXIoKTsNCi0JCQkvL1RPRE8gY2hlY2sgdGhpcw0KLQkJCS8vcGFyYW0uZ2V0UGFyZW50KCk7DQotCQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IHRtcE1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCk7DQotCQkJSUNvbXBpbGF0aW9uVW5pdCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQgPSBkZWNsYXJpbmdUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJCS8vVE9ETyBGSVggVEhJUw0KLQkJCXJlbW92ZVBhcmFtQW5ub3RhdGlvbnModHlwZVBhcmFtZXRlciwgZGVjbGFyaW5nVHlwZSwgZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBhbm5vdGF0aW9ucywgbnVsbCk7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCByZW1vdmVUeXBlQW5ub3RhdGlvbnMoSVR5cGUgdHlwZSwgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBDb21waWxhdGlvblVuaXQgdW5pdCwgSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCwgU2V0PFN0cmluZz4gYW5ub3RhdGlvbnNTZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCXVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJaWYgKHJlbW92ZUFubm90YXRpb25zKHR5cGVEZWNsYXJhdGlvbi5tb2RpZmllcnMoKSwgYW5ub3RhdGlvbnNTZXQpKQ0KLQkJew0KLQkJCUlEb2N1bWVudCBkb2MgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXREb2N1bWVudChjVW5pdCk7DQotCQkJVGV4dEVkaXQgZWRpdCA9IHVuaXQucmV3cml0ZShkb2MsIG51bGwpOw0KLQkJCWVkaXQuYXBwbHkoZG9jKTsNCi0NCi0JCQlzYXZlQ29udGVudChjVW5pdCwgZG9jKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRmllbGRBbm5vdGF0aW9ucyhJRmllbGQgZmllbGQsIElUeXBlIGRlY2xhcmluZ1R5cGUsIElDb21waWxhdGlvblVuaXQgZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBTZXQ8U3RyaW5nPiBhbm5vdGF0aW9uc1NldCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJSUNvbXBpbGF0aW9uVW5pdCBmY1VuaXQgPSBmaWVsZC5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCVN0cmluZyBjbGFzc05hbWUgPSBkZWNsYXJpbmdUeXBlLmdldEVsZW1lbnROYW1lKCk7DQotCQlDb21waWxhdGlvblVuaXQgZlVuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChmY1VuaXQsIG51bGwpOw0KLQ0KLQkJQm9keURlY2xhcmF0aW9uIGZCb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIGZVbml0KTsNCi0JCWZCb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldEZpZWxkRGVjbGFyYXRpb24oZmllbGQsIChUeXBlRGVjbGFyYXRpb24pIGZCb2R5RGVjbGFyYXRpb24pOw0KLQ0KLQkJZlVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJaWYgKHJlbW92ZUFubm90YXRpb25zKGZCb2R5RGVjbGFyYXRpb24ubW9kaWZpZXJzKCksIGFubm90YXRpb25zU2V0KSkNCi0JCXsNCi0JCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0KTsNCi0JCQlUZXh0RWRpdCBlZGl0ID0gZlVuaXQucmV3cml0ZShkb2MsIG51bGwpOw0KLQkJCWVkaXQuYXBwbHkoZG9jKTsNCi0NCi0JCQlzYXZlQ29udGVudChkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIGRvYyk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU1ldGhvZEFubm90YXRpb25zKElNZXRob2QgbWV0aG9kLCBJVHlwZSBkZWNsYXJpbmdUeXBlLCBJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgU2V0PFN0cmluZz4gYW5ub3RhdGlvbnNTZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUlDb21waWxhdGlvblVuaXQgbWNVbml0ID0gbWV0aG9kLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGRlY2xhcmluZ1R5cGUuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCUNvbXBpbGF0aW9uVW5pdCBtVW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KG1jVW5pdCwgbnVsbCk7DQotDQotCQlCb2R5RGVjbGFyYXRpb24gbUJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKGNsYXNzTmFtZSwgbVVuaXQpOw0KLQkJbUJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24obWV0aG9kLCAoVHlwZURlY2xhcmF0aW9uKSBtQm9keURlY2xhcmF0aW9uKTsNCi0JCW1Vbml0LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsNCi0JCWlmIChyZW1vdmVBbm5vdGF0aW9ucyhtQm9keURlY2xhcmF0aW9uLm1vZGlmaWVycygpLCBhbm5vdGF0aW9uc1NldCkpDQotCQl7DQotCQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KGRlY2xhcmluZ1R5cGVDb21wVW5pdCk7DQotCQkJVGV4dEVkaXQgZWRpdCA9IG1Vbml0LnJld3JpdGUoZG9jLCBudWxsKTsNCi0JCQllZGl0LmFwcGx5KGRvYyk7DQotDQotCQkJc2F2ZUNvbnRlbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBkb2MpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCByZW1vdmVQYXJhbUFubm90YXRpb25zKElUeXBlUGFyYW1ldGVyIHBhcmFtLCBJVHlwZSBkZWNsYXJpbmdUeXBlLCBJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgU2V0PFN0cmluZz4gYW5ub3RhdGlvbnNTZXQsIFN0cmluZyBwYXJhbU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUlNZXRob2QgdG1wTWV0aG9kID0gKElNZXRob2QpcGFyYW0uZ2V0RGVjbGFyaW5nTWVtYmVyKCk7DQotCQkvL1RPRE8gY2hlY2sgdGhpcw0KLQkJLy9wYXJhbS5nZXRQYXJlbnQoKTsNCi0JCVN0cmluZyBjbGFzc05hbWUgPSBkZWNsYXJpbmdUeXBlLmdldEVsZW1lbnROYW1lKCk7DQotCQlJQ29tcGlsYXRpb25Vbml0IG1jVW5pdCA9IHRtcE1ldGhvZC5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCUNvbXBpbGF0aW9uVW5pdCBtVW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KG1jVW5pdCwgbnVsbCk7DQotDQotCQlCb2R5RGVjbGFyYXRpb24gbUJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKGNsYXNzTmFtZSwgbVVuaXQpOw0KLQkJbUJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24odG1wTWV0aG9kLCAoVHlwZURlY2xhcmF0aW9uKSBtQm9keURlY2xhcmF0aW9uKTsNCi0JCW1Vbml0LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsNCi0NCi0JCWZvciAoT2JqZWN0IG9iamVjdCA6ICgoTWV0aG9kRGVjbGFyYXRpb24pIG1Cb2R5RGVjbGFyYXRpb24pLnBhcmFtZXRlcnMoKSkNCi0JCXsNCi0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikNCi0JCQl7DQotCQkJICBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHN2ZCA9IChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBvYmplY3Q7DQotCQkJCWlmICgocGFyYW1OYW1lID09IG51bGwgfHwgc3ZkLmdldE5hbWUoKS50b1N0cmluZygpLmVxdWFscyhwYXJhbU5hbWUpKSAmJg0KLQkJCQkgICAgICAgIHJlbW92ZUFubm90YXRpb25zKHN2ZC5tb2RpZmllcnMoKSwgYW5ub3RhdGlvbnNTZXQpKQ0KLQkJCQl7DQotCQkJCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0KTsNCi0JCQkJCVRleHRFZGl0IGVkaXQgPSBtVW5pdC5yZXdyaXRlKGRvYywgbnVsbCk7DQotCQkJCQllZGl0LmFwcGx5KGRvYyk7DQotCQkJCQkNCi0JCQkJCXNhdmVDb250ZW50KGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgZG9jKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIHNhdmVDb250ZW50KElDb21waWxhdGlvblVuaXQgY1VuaXQsIElEb2N1bWVudCBkb2MpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlJU3RhdHVzIHN0YXR1cyA9IChuZXcgRWRpdFJlc291cmNlc01hbmFnZXIoKSkuc2V0RmlsZUVkaXRhYmxlKChJRmlsZSkgY1VuaXQuZ2V0UmVzb3VyY2UoKSk7DQotCQlpZihzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LICkNCi0JCXsNCi0JCQlmaWxlVXRpbHMuc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudEFuZFNhdmVEaXJ0eUVkaXRvcnMoY1VuaXQsIGRvYy5nZXQoKSwgdHJ1ZSwgbnVsbCk7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oIkFubm90YXR0aW9uIGNvdWxkIG5vdCBiZSBzdG9yZWQsIHRoZSBmaWxlIGlzIG5vdCB3cml0YWJsZSIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJCUpheFdzVXRpbE1lc3NhZ2VzLkFubm90YXRpb25DYW5ub3RCZVN0b3JlZE1zZyk7DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZW1vdmVzIHNwZWNpZmljIEFubm90YXRpb24gb2Ygc3BlY2lmaWVkIElKYXZhRWxlbWVudC4NCi0JICogDQotCSAqIEBwYXJhbSBqYXZhRWxlbWVudCAtIElKYXZhRWxlbWVudCB3aGljaCB3aWxsIGJlIHVzZWQgYXMgc3RhcnRpbmcgcG9pbiBmb3IgcmVtb3ZpbmcgdGhlIEFubm90YXRpb24uDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uTmFtZSAtIFN0cmluZyB3aGljaCBpcyB0aGUgcmVwcmVzZW50YXRpb24gTmFtZSBvZiB0aGUgQW5ub3RhdGlvbiwgd2hpY2ggd2lsbCBiZSByZW1vdmVkLg0KLQkgKiANCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgdGhvd24gaWYgQVNUIFR5cGVEZWNsYXJhdGlvbiBjYW5ub3QgYmUgZm91bmQgZm9yIDxjb2RlPnR5cGU8L2NvZGU+IGFuZCBhbHNvIGlzIHVzZWQgYXMgd3JhcHBlciBpbiBjYXNlIHtAbGluayBDb3JlRXhjZXB0aW9ufSBvcg0KLQkgKiAgICAgICAgICAgICB7QGxpbmsgQmFkTG9jYXRpb25FeGNlcHRpb259IGlzIHRocm93biB3aGlsZSBwcm9jZXNzaW5nLg0KLQkgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbg0KLQl7DQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKQ0KLQkJew0KLQkJCUlUeXBlIHR5cGUgPSAoSVR5cGUpamF2YUVsZW1lbnQ7DQotCQkJSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCA9IHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGNVbml0LCBudWxsKTsNCi0NCi0JCQlBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIHVuaXQpOw0KLQkJCWlmICh0eXBlRGVjbGFyYXRpb24gPT0gbnVsbCkNCi0JCQl7DQotCQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKCJ0eXBlRGVjbGFyYXRpb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzVXRpbE1lc3NhZ2VzLkFubm90YXRpb25VdGlsc19QYXJhbVNob3VsZE5vdEJlTnVsbE1zZywgInR5cGVEZWNsYXJhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCQkNCi0JCQlyZW1vdmVUeXBlQW5ub3RhdGlvbih0eXBlLCB0eXBlRGVjbGFyYXRpb24sIHVuaXQsIGNVbml0LCBhbm5vdGF0aW9uTmFtZSk7DQotDQotCQl9DQotCQkNCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUZpZWxkKQ0KLQkJew0KLQkJCUlGaWVsZCBmaWVsZCA9IChJRmllbGQpamF2YUVsZW1lbnQ7DQotCQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IGZpZWxkLmdldERlY2xhcmluZ1R5cGUoKTsNCi0JCQlJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCA9IGRlY2xhcmluZ1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQkJDQotCQkJcmVtb3ZlRmllbGRBbm5vdGF0aW9uKGZpZWxkLCBkZWNsYXJpbmdUeXBlLCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIGFubm90YXRpb25OYW1lKTsNCi0JCX0NCi0JCQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJTWV0aG9kKQ0KLQkJew0KLQkJCUlNZXRob2QgbWV0aG9kID0gKElNZXRob2QpamF2YUVsZW1lbnQ7DQotCQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCk7DQotCQkJSUNvbXBpbGF0aW9uVW5pdCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQgPSBkZWNsYXJpbmdUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJCQ0KLQkJCXJlbW92ZU1ldGhvZEFubm90YXRpb24obWV0aG9kLCBkZWNsYXJpbmdUeXBlLCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIGFubm90YXRpb25OYW1lKTsNCi0JCX0NCi0JCQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZVBhcmFtZXRlcikNCi0JCXsNCi0JCQlJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gKElUeXBlUGFyYW1ldGVyKWphdmFFbGVtZW50Ow0KLQkJCUlNZXRob2QgdG1wTWV0aG9kID0gKElNZXRob2QpIHR5cGVQYXJhbWV0ZXIuZ2V0RGVjbGFyaW5nTWVtYmVyKCk7DQotCQkJLy9UT0RPIGNoZWNrIHRoaXMNCi0JCQkvL3BhcmFtLmdldFBhcmVudCgpOw0KLQkJCUlUeXBlIGRlY2xhcmluZ1R5cGUgPSB0bXBNZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpOw0KLQkJCUlDb21waWxhdGlvblVuaXQgZGVjbGFyaW5nVHlwZUNvbXBVbml0ID0gZGVjbGFyaW5nVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0NCi0JCQlyZW1vdmVQYXJhbUFubm90YXRpb24odHlwZVBhcmFtZXRlciwgZGVjbGFyaW5nVHlwZSwgZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBhbm5vdGF0aW9uTmFtZSk7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCByZW1vdmVUeXBlQW5ub3RhdGlvbihJVHlwZSB0eXBlLCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIENvbXBpbGF0aW9uVW5pdCB1bml0LCBJQ29tcGlsYXRpb25Vbml0IGNVbml0LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCXVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJaWYgKHJlbW92ZUFubm90YXRpb24odHlwZURlY2xhcmF0aW9uLm1vZGlmaWVycygpLCBhbm5vdGF0aW9uTmFtZSkpDQotCQl7DQotCQkJSURvY3VtZW50IGRvYyA9IEFubm90YXRpb25VdGlscy5nZXRJbnN0YW5jZSgpLmdldERvY3VtZW50KGNVbml0KTsNCi0JCQlUZXh0RWRpdCBlZGl0ID0gdW5pdC5yZXdyaXRlKGRvYywgbnVsbCk7DQotCQkJZWRpdC5hcHBseShkb2MpOw0KLQ0KLQkJCXNhdmVDb250ZW50KGNVbml0LCBkb2MpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCByZW1vdmVGaWVsZEFubm90YXRpb24oSUZpZWxkIGZpZWxkLCBJVHlwZSBkZWNsYXJpbmdUeXBlLCBJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlJQ29tcGlsYXRpb25Vbml0IGZjVW5pdCA9IGZpZWxkLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGRlY2xhcmluZ1R5cGUuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCUNvbXBpbGF0aW9uVW5pdCBmVW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGZjVW5pdCwgbnVsbCk7DQotDQotCQlCb2R5RGVjbGFyYXRpb24gZkJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKGNsYXNzTmFtZSwgZlVuaXQpOw0KLQkJZkJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0RmllbGREZWNsYXJhdGlvbihmaWVsZCwgKFR5cGVEZWNsYXJhdGlvbikgZkJvZHlEZWNsYXJhdGlvbik7DQotDQotCQlmVW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQlpZiAocmVtb3ZlQW5ub3RhdGlvbihmQm9keURlY2xhcmF0aW9uLm1vZGlmaWVycygpLCBhbm5vdGF0aW9uTmFtZSkpDQotCQl7DQotCQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KGRlY2xhcmluZ1R5cGVDb21wVW5pdCk7DQotCQkJVGV4dEVkaXQgZWRpdCA9IGZVbml0LnJld3JpdGUoZG9jLCBudWxsKTsNCi0JCQllZGl0LmFwcGx5KGRvYyk7DQotDQotCQkJc2F2ZUNvbnRlbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBkb2MpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCByZW1vdmVNZXRob2RBbm5vdGF0aW9uKElNZXRob2QgbWV0aG9kLCBJVHlwZSBkZWNsYXJpbmdUeXBlLCBJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlJQ29tcGlsYXRpb25Vbml0IG1jVW5pdCA9IG1ldGhvZC5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCVN0cmluZyBjbGFzc05hbWUgPSBkZWNsYXJpbmdUeXBlLmdldEVsZW1lbnROYW1lKCk7DQotCQlDb21waWxhdGlvblVuaXQgbVVuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChtY1VuaXQsIG51bGwpOw0KLQ0KLQkJQm9keURlY2xhcmF0aW9uIG1Cb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIG1Vbml0KTsNCi0JCW1Cb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZERlY2xhcmF0aW9uKG1ldGhvZCwgKFR5cGVEZWNsYXJhdGlvbikgbUJvZHlEZWNsYXJhdGlvbik7DQotCQltVW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQlpZihyZW1vdmVBbm5vdGF0aW9uKG1Cb2R5RGVjbGFyYXRpb24ubW9kaWZpZXJzKCksIGFubm90YXRpb25OYW1lKSkNCi0JCXsNCi0JCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0KTsNCi0JCQlUZXh0RWRpdCBlZGl0ID0gbVVuaXQucmV3cml0ZShkb2MsIG51bGwpOw0KLQkJCWVkaXQuYXBwbHkoZG9jKTsNCi0NCi0JCQlzYXZlQ29udGVudChkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIGRvYyk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVBhcmFtQW5ub3RhdGlvbihJVHlwZVBhcmFtZXRlciBwYXJhbSwgSVR5cGUgZGVjbGFyaW5nVHlwZSwgSUNvbXBpbGF0aW9uVW5pdCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJSU1ldGhvZCB0bXBNZXRob2QgPSAoSU1ldGhvZClwYXJhbS5nZXREZWNsYXJpbmdNZW1iZXIoKTsNCi0JCS8vVE9ETyBjaGVjayB0aGlzDQotCQkvL3BhcmFtLmdldFBhcmVudCgpOw0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGRlY2xhcmluZ1R5cGUuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCUlDb21waWxhdGlvblVuaXQgbWNVbml0ID0gdG1wTWV0aG9kLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJY2xhc3NOYW1lID0gdG1wTWV0aG9kLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCk7DQotCQlDb21waWxhdGlvblVuaXQgbVVuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChtY1VuaXQsIG51bGwpOw0KLQ0KLQkJQm9keURlY2xhcmF0aW9uIG1Cb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIG1Vbml0KTsNCi0JCW1Cb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZERlY2xhcmF0aW9uKHRtcE1ldGhvZCwgKFR5cGVEZWNsYXJhdGlvbikgbUJvZHlEZWNsYXJhdGlvbik7DQotDQotCQltVW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQlmb3IgKE9iamVjdCBvYmplY3QgOiAoKE1ldGhvZERlY2xhcmF0aW9uKSBtQm9keURlY2xhcmF0aW9uKS5wYXJhbWV0ZXJzKCkpDQotCQl7DQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pDQotCQkJew0KLQkJCQlpZiAocmVtb3ZlQW5ub3RhdGlvbigoKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIG9iamVjdCkubW9kaWZpZXJzKCksIGFubm90YXRpb25OYW1lKSkNCi0JCQkJew0KLQkJCQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KGRlY2xhcmluZ1R5cGVDb21wVW5pdCk7DQotCQkJCQlUZXh0RWRpdCBlZGl0ID0gbVVuaXQucmV3cml0ZShkb2MsIG51bGwpOw0KLQkJCQkJZWRpdC5hcHBseShkb2MpOw0KLQ0KLQkJCQkJc2F2ZUNvbnRlbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBkb2MpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBSZW1vdmVzIHNwZWNpZmljIGFubm90YXRpb24gZnJvbSB0aGUgbGlzdCBvZiBtb2RpZmllcnMuDQotCSAqIA0KLQkgKiBAcGFyYW0gbW9kaWZpZXJzDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uTmFtZQ0KLQkgKiANCi0JICogQHJldHVybiBib29sZWFuIHZhbHVlLCB3aGljaCByZXByZXNlbnRzIHdoZXRlciB0aGUgYW5ub3RhdGlvbiBpcyByZW1vdmVkIG9yIG5vdC4NCi0JICovDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIGJvb2xlYW4gcmVtb3ZlQW5ub3RhdGlvbihMaXN0IG1vZGlmaWVycywgU3RyaW5nIGFubm90YXRpb25OYW1lKQ0KLQl7DQotCQlBbm5vdGF0aW9uW10gbUFubm90YXRpb25zID0gZXh0cmFjdEFubm90YXRpb25zKG1vZGlmaWVycyk7DQotCQlmb3IgKEFubm90YXRpb24gbUFubm90YXRpb24gOiBtQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJaWYodmFsaWRhdGVBbm5vdGF0YXRpb24obUFubm90YXRpb24sIGFubm90YXRpb25OYW1lKSkNCi0JCQl7DQotCQkJCW1vZGlmaWVycy5yZW1vdmUobUFubm90YXRpb24pOw0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSBib29sZWFuIHJlbW92ZUFubm90YXRpb25zKExpc3QgbW9kaWZpZXJzLCBTZXQ8U3RyaW5nPiBhbm5vdGF0aW9uc1NldCkNCi0Jew0KLQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7DQotCQlBbm5vdGF0aW9uW10gbUFubm90YXRpb25zID0gZXh0cmFjdEFubm90YXRpb25zKG1vZGlmaWVycyk7DQotCQlmb3IgKGludCBtYWkgPSAwOyBtYWkgPCBtQW5ub3RhdGlvbnMubGVuZ3RoOyBtYWkrKykNCi0JCXsNCi0JCQlpZiAoYW5ub3RhdGlvbnNTZXQgIT0gbnVsbCkNCi0JCQl7DQotCQkJCWlmIChhbm5vdGF0aW9uc1NldC5jb250YWlucyhtQW5ub3RhdGlvbnNbbWFpXS5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSkNCi0JCQkJew0KLQkJCQkJbW9kaWZpZXJzLnJlbW92ZShtQW5ub3RhdGlvbnNbbWFpXSk7DQotCQkJCQljaGFuZ2VkID0gdHJ1ZTsNCi0JCQkJfQ0KLQkJCX0gZWxzZQ0KLQkJCXsNCi0JCQkJbW9kaWZpZXJzLnJlbW92ZShtQW5ub3RhdGlvbnNbbWFpXSk7DQotCQkJCWNoYW5nZWQgPSB0cnVlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBjaGFuZ2VkOw0KLQl9DQotDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIEFubm90YXRpb25bXSBleHRyYWN0QW5ub3RhdGlvbnMoTGlzdCBtb2RpZmllcnMpDQotCXsNCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kaWZpZXJzLml0ZXJhdG9yKCk7DQotCQlTZXQ8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnNTZXQgPSBuZXcgSGFzaFNldDxBbm5vdGF0aW9uPigpOw0KLQ0KLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkNCi0JCXsNCi0JCQlJRXh0ZW5kZWRNb2RpZmllciBtb2RpZiA9IChJRXh0ZW5kZWRNb2RpZmllcikgaXRlcmF0b3IubmV4dCgpOw0KLQkJCWlmIChtb2RpZi5pc0Fubm90YXRpb24oKSkNCi0JCQl7DQotCQkJCWFubm90YXRpb25zU2V0LmFkZCgoQW5ub3RhdGlvbikgbW9kaWYpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBhbm5vdGF0aW9uc1NldC50b0FycmF5KG5ldyBBbm5vdGF0aW9uW2Fubm90YXRpb25zU2V0LnNpemUoKV0pOw0KLQl9DQotDQotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZUFubm90YXRhdGlvbihBbm5vdGF0aW9uIG1Bbm5vdGF0aW9uLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpDQotCXsNCi0JCVN0cmluZyBtQW5ub3RhdGlvblN0cmluZyA9IG1Bbm5vdGF0aW9uLnRvU3RyaW5nKCk7DQotCQlpbnQgaW5kZXggPSBtQW5ub3RhdGlvblN0cmluZy5pbmRleE9mKCIoIik7IC8vJE5PTi1OTFMtMSQNCi0JCWlmKGluZGV4ID09IC0xKQ0KLQkJew0KLQkJCW1Bbm5vdGF0aW9uU3RyaW5nID0gbUFubm90YXRpb25TdHJpbmcudHJpbSgpOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCW1Bbm5vdGF0aW9uU3RyaW5nID0gbUFubm90YXRpb25TdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KS50cmltKCk7DQotCQl9DQotCQkNCi0JCWlmKG1Bbm5vdGF0aW9uU3RyaW5nLmVuZHNXaXRoKGFubm90YXRpb25OYW1lKSkNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCSANCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQXJyYXlWYWx1ZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9BcnJheVZhbHVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMzE4NjJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9BcnJheVZhbHVlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotLyoqDQotICogSW1wbGVtZW50YXRpb24gZm9yIHtAbGluayBJQXJyYXlWYWx1ZX0NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQXJyYXlWYWx1ZUltcGwgZXh0ZW5kcyBWYWx1ZUltcGwNCi17DQotCXByaXZhdGUgU2V0PElWYWx1ZT4gdmFsdWVzID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0aW9uDQotCSAqIA0KLQkgKiBAcGFyYW0gdmFsdWVzDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgaW4gY2FzZSA8Y29kZT52YWx1ZXM8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKi8NCi0JcHVibGljIEFycmF5VmFsdWVJbXBsKFNldDxJVmFsdWU+IHZhbHVlcykNCi0Jew0KLQkJaWYgKHZhbHVlcyA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidmFsdWVzIHNob3VsZCBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQl0aGlzLnZhbHVlcyA9IHZhbHVlczsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpDQotCXsNCi0JCVN0cmluZyByZXN1bHQgPSAiWyI7IC8vJE5PTi1OTFMtMSQNCi0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOw0KLQkJZm9yIChJVmFsdWUgdmFsdWUgOiB2YWx1ZXMpDQotCQl7DQotCQkJaWYoZmlyc3QpDQotCQkJew0KLQkJCQlyZXN1bHQgPSByZXN1bHQgKyB2YWx1ZS50b1N0cmluZygpOw0KLQkJCQlmaXJzdCA9IGZhbHNlOw0KLQkJCX0NCi0JCQllbHNlDQotCQkJew0KLQkJCQlyZXN1bHQgPSByZXN1bHQgKyAiLCAiICsgdmFsdWUudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCX0NCi0JCXJlc3VsdCA9IHJlc3VsdCArICJdIjsgLy8kTk9OLU5MUy0xJA0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKENvbXBpbGF0aW9uVW5pdCB1bml0LCBBU1QgYXN0KQ0KLQl7DQotCQkvL1RPRE8gY2hlY2sgdGhpcyBtZXRob2QNCi0JCUFycmF5SW5pdGlhbGl6ZXIgYXJyID0gYXN0Lm5ld0FycmF5SW5pdGlhbGl6ZXIoKTsNCi0JCWZvciAoSVZhbHVlIHZhbHVlIDogdmFsdWVzKQ0KLQkJew0KLQkJCWFyci5leHByZXNzaW9ucygpLmFkZCgoKFZhbHVlSW1wbCkgdmFsdWUpLmdldEV4cHJlc3Npb24odW5pdCwgYXN0KSk7DQotCQl9DQotDQotCQlyZXR1cm4gYXJyOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0Jew0KLQkJcmV0dXJuIEFycmF5cy5oYXNoQ29kZSh2YWx1ZXMudG9BcnJheShuZXcgSVZhbHVlW3ZhbHVlcy5zaXplKCldKSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KLQl7DQotCQlpZiAodGhpcyA9PSBvYmopDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlpZiAob2JqID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJZmluYWwgQXJyYXlWYWx1ZUltcGwgb3RoZXIgPSAoQXJyYXlWYWx1ZUltcGwpIG9iajsNCi0JCXJldHVybiBBcnJheXMuZXF1YWxzKHZhbHVlcy50b0FycmF5KG5ldyBJVmFsdWVbdmFsdWVzLnNpemUoKV0pLCBvdGhlci52YWx1ZXMudG9BcnJheShuZXcgSVZhbHVlW3ZhbHVlcy5zaXplKCldKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0F0dHJpYnV0ZVR5cGVFbnVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQXR0cmlidXRlVHlwZUVudW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTBiYTYwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQXR0cmlidXRlVHlwZUVudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotcHVibGljIGVudW0gQXR0cmlidXRlVHlwZUVudW0gDQotew0KLQlCT09MRUFOKCJCb29sZWFuIiksIC8vJE5PTi1OTFMtMSQNCi0JQ0xBU1MoIkNsYXNzIiksIC8vJE5PTi1OTFMtMSQNCi0JSU5URUdFUigiSW50ZWdlciIpLCAvLyROT04tTkxTLTEkDQotCVFVQUxJRklFRF9OQU1FKCJRdWFsaWZpZWQgTmFtZSIpLCAvLyROT04tTkxTLTEkDQotCVNUUklORygiU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQNCi0JDQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOw0KLSAgICANCi0gICAgQXR0cmlidXRlVHlwZUVudW0oZmluYWwgU3RyaW5nIHZhbHVlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgZmluYWwgU3RyaW5nIGdldFZhbHVlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Jvb2xlYW5WYWx1ZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Cb29sZWFuVmFsdWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1ZmUxZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Jvb2xlYW5WYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLQ0KLS8qKg0KLSAqIEltcGxlbWVudGF0aW9uIGZvciB7QGxpbmsgSUJvb2xlYW5WYWx1ZX0NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQm9vbGVhblZhbHVlSW1wbCBleHRlbmRzIFZhbHVlSW1wbA0KLXsgLy8kSkwtRVFVQUxTJA0KLQlwcml2YXRlIGJvb2xlYW4gdmFsdWU7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiANCi0JICogQHBhcmFtIHZhbHVlDQotCSAqLw0KLQlwdWJsaWMgQm9vbGVhblZhbHVlSW1wbChib29sZWFuIHZhbHVlKQ0KLQl7DQotCQl0aGlzLnZhbHVlID0gdmFsdWU7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oQ29tcGlsYXRpb25Vbml0IHVuaXQsIEFTVCBhc3QpDQotCXsNCi0JCXJldHVybiBhc3QubmV3Qm9vbGVhbkxpdGVyYWwodmFsdWUpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpDQotCXsNCi0JCXJldHVybiBCb29sZWFuLnRvU3RyaW5nKHZhbHVlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KLQl7DQotCQlpZiAodGhpcyA9PSBvYmopDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlpZiAob2JqID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJZmluYWwgQm9vbGVhblZhbHVlSW1wbCBvdGhlciA9IChCb29sZWFuVmFsdWVJbXBsKSBvYmo7DQotCQlyZXR1cm4gdmFsdWUgPT0gb3RoZXIudmFsdWU7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0NsYXNzVmFsdWVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQ2xhc3NWYWx1ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmRjZWE1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQ2xhc3NWYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbDsNCi0NCi1wdWJsaWMgY2xhc3MgQ2xhc3NWYWx1ZUltcGwgZXh0ZW5kcyBWYWx1ZUltcGwgDQotew0KLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc1FOYW1lOw0KLQ0KLSAgICBwdWJsaWMgQ2xhc3NWYWx1ZUltcGwoU3RyaW5nIGNsYXNzUU5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY2xhc3NRTmFtZSA9IGNsYXNzUU5hbWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihDb21waWxhdGlvblVuaXQgdW5pdCwgQVNUIGFzdCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGNsc05hbWUgPSB0aGlzLmNsYXNzUU5hbWU7DQotICAgICAgICBpZiAoYWRkSW1wb3J0cyhhc3QsIHVuaXQsIGNsc05hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNsc05hbWUgPSBnZXRTaW1wbGVOYW1lKGNsc05hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgTmFtZSBuYW1lID0gYXN0Lm5ld05hbWUoY2xzTmFtZSk7DQotICAgICAgICBTaW1wbGVUeXBlIHNpbXBsZVR5cGUgPSBhc3QubmV3U2ltcGxlVHlwZShuYW1lKTsNCi0gICAgICAgIFR5cGVMaXRlcmFsIGxpdGVyYWwgPSBhc3QubmV3VHlwZUxpdGVyYWwoKTsNCi0gICAgICAgIGxpdGVyYWwuc2V0VHlwZShzaW1wbGVUeXBlKTsNCi0gICAgICAgIHJldHVybiBsaXRlcmFsOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkNCi0Jew0KLQkJcmV0dXJuIHRoaXMuY2xhc3NRTmFtZTsNCi0JfQ0KLSAgICANCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLQl7DQotCQlyZXR1cm4gdGhpcy5jbGFzc1FOYW1lLmhhc2hDb2RlKCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KLQl7DQotCQlpZiAodGhpcyA9PSBvYmopDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlpZiAob2JqID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJZmluYWwgQ2xhc3NWYWx1ZUltcGwgb3RoZXIgPSAoQ2xhc3NWYWx1ZUltcGwpIG9iajsNCi0JCXJldHVybiB0aGlzLmNsYXNzUU5hbWUuZXF1YWxzKG90aGVyLmNsYXNzUU5hbWUpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9JbnRlZ2VyVmFsdWVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvSW50ZWdlclZhbHVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYWZmZTBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9JbnRlZ2VyVmFsdWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bWJlckxpdGVyYWw7DQotDQotLyoqDQotICogSW1wbGVtZW50b3IgZm9yIElJbnRlZ2VyVmFsdWUNCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSW50ZWdlclZhbHVlSW1wbCBleHRlbmRzIFZhbHVlSW1wbA0KLXsNCi0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiANCi0JICogQHBhcmFtIHZhbHVlDQotCSAqLw0KLQlwdWJsaWMgSW50ZWdlclZhbHVlSW1wbChTdHJpbmcgdmFsdWUpDQotCXsNCi0JCXRoaXMudmFsdWUgPSB2YWx1ZTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihDb21waWxhdGlvblVuaXQgdW5pdCwgQVNUIGFzdCkNCi0Jew0KLQkJTnVtYmVyTGl0ZXJhbCBsaXRlcmFsID0gYXN0Lm5ld051bWJlckxpdGVyYWwoKTsNCi0gICAgICAgIGxpdGVyYWwuc2V0VG9rZW4obmV3IEludGVnZXIodmFsdWUpLnRvU3RyaW5nKCkpOw0KLQkJcmV0dXJuIGxpdGVyYWw7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IEludGVnZXIodmFsdWUpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikNCi0Jew0KLQkJaWYgKHRoaXMgPT0gb2JqKQ0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJaWYgKG9iaiA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWZpbmFsIEludGVnZXJWYWx1ZUltcGwgb3RoZXIgPSAoSW50ZWdlclZhbHVlSW1wbCkgb2JqOw0KLQkJcmV0dXJuIHZhbHVlID09IG90aGVyLnZhbHVlOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpDQotCXsNCi0JCXJldHVybiB2YWx1ZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvTG9jYXRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Mb2NhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OWU4NTlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Mb2NhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklMb2NhdG9yOw0KLQ0KLS8qKg0KLSAqIEltcGxlbWVudG9yIG9mIHtAbGluayBJTG9jYXRvcn0gaW50ZXJmYWNlDQotICovDQotcHVibGljIGNsYXNzIExvY2F0b3JJbXBsIGltcGxlbWVudHMgSUxvY2F0b3INCi17DQotCXByaXZhdGUgaW50IGxpbmVOdW1iZXI7DQotCXByaXZhdGUgaW50IHN0YXJ0UG9zaXRpb247DQotCXByaXZhdGUgaW50IGxlbmd0aDsNCi0JDQotCXB1YmxpYyBMb2NhdG9ySW1wbChmaW5hbCBpbnQgbGluZU51bWJlciwgZmluYWwgaW50IHN0YXJ0UG9zaXRpb24sIGZpbmFsIGludCBsZW5ndGgpDQotCXsNCi0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOw0KLQkJdGhpcy5zdGFydFBvc2l0aW9uID0gc3RhcnRQb3NpdGlvbjsNCi0JCXRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7DQotCX0NCi0JDQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkNCi0Jew0KLQkJcmV0dXJuIHRoaXMubGVuZ3RoOw0KLQl9DQotDQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRQb3NpdGlvbigpDQotCXsNCi0JCXJldHVybiB0aGlzLnN0YXJ0UG9zaXRpb247DQotCX0NCi0NCi0JcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgDQotCXsNCi0JCXJldHVybiBsaW5lTnVtYmVyOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9QYXJhbVZhbHVlUGFpckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9QYXJhbVZhbHVlUGFpckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWNlMzFkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvUGFyYW1WYWx1ZVBhaXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotLyoqDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotDQotcHVibGljIGNsYXNzIFBhcmFtVmFsdWVQYWlySW1wbCBpbXBsZW1lbnRzIElQYXJhbVZhbHVlUGFpcg0KLXsNCi0JDQotCXByaXZhdGUgSUxvY2F0b3IgbG9jYXRvciA9IG51bGw7DQotDQotDQotCXByaXZhdGUgU3RyaW5nIHBhcmFtOw0KLQ0KLQlwcml2YXRlIElWYWx1ZSB2YWx1ZTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIA0KLQkgKiBAcGFyYW0gcGFyYW0NCi0JICogQHBhcmFtIHZhbHVlDQotCSAqLw0KLQlwdWJsaWMgUGFyYW1WYWx1ZVBhaXJJbXBsKFN0cmluZyBwYXJhbSwgSVZhbHVlIHZhbHVlKQ0KLQl7DQotCQl0aGlzLnBhcmFtID0gcGFyYW07DQotCQl0aGlzLnZhbHVlID0gdmFsdWU7DQotCX0NCi0NCi0JcHVibGljIFN0cmluZyBnZXRQYXJhbSgpDQotCXsNCi0JCXJldHVybiBwYXJhbTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSVZhbHVlIGdldFZhbHVlKCkNCi0Jew0KLQkJcmV0dXJuIHZhbHVlOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0Jew0KLQkJaWYodmFsdWUgIT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gMzEgKiBwYXJhbS5oYXNoQ29kZSgpICsgdmFsdWUuaGFzaENvZGUoKTsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQlyZXR1cm4gMzEgKiBwYXJhbS5oYXNoQ29kZSgpOw0KLQkJfQ0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikNCi0Jew0KLQkJaWYgKHRoaXMgPT0gb2JqKQ0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJaWYgKG9iaiA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWZpbmFsIFBhcmFtVmFsdWVQYWlySW1wbCBvdGhlciA9IChQYXJhbVZhbHVlUGFpckltcGwpIG9iajsNCi0JCWlmICghcGFyYW0uZXF1YWxzKG90aGVyLnBhcmFtKSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlyZXR1cm4gdmFsdWUuZXF1YWxzKG90aGVyLnZhbHVlKTsNCi0JfQ0KLQkNCi0JcHVibGljIElMb2NhdG9yIGdldExvY2F0b3IoKQ0KLQl7DQotCQlyZXR1cm4gdGhpcy5sb2NhdG9yOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldExvY2F0b3IoZmluYWwgSUxvY2F0b3IgbG9jYXRvcikNCi0Jew0KLQkJdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvUXVhbGlmaWVkTmFtZVZhbHVlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL1F1YWxpZmllZE5hbWVWYWx1ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWJiNjZjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvUXVhbGlmaWVkTmFtZVZhbHVlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247DQotDQotLyoqDQotICogSW1wbGVtZW50b3IgZm9yIHtAbGluayBJUXVhbGlmaWVkTmFtZVZhbHVlfQ0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBRdWFsaWZpZWROYW1lVmFsdWVJbXBsIGV4dGVuZHMgVmFsdWVJbXBsDQotew0KLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIA0KLQkgKiBAcGFyYW0gdmFsdWUNCi0JICovDQotCXB1YmxpYyBRdWFsaWZpZWROYW1lVmFsdWVJbXBsKFN0cmluZyB2YWx1ZSkNCi0Jew0KLQkJdGhpcy52YWx1ZSA9IHZhbHVlOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKENvbXBpbGF0aW9uVW5pdCB1bml0LCBBU1QgYXN0KQ0KLQl7DQotCQkvLyAiamF2YXguZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5SRVFVSVJFRCINCi0JCWludCBpID0gdmFsdWUubGFzdEluZGV4T2YoJy4nKTsNCi0JCWlmIChpICE9IC0xKQ0KLQkJew0KLQkJCVN0cmluZyBjbHNOYW1lID0gdmFsdWUuc3Vic3RyaW5nKDAsIGkpOw0KLQkJCWlmIChhZGRJbXBvcnRzKGFzdCwgdW5pdCwgY2xzTmFtZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gYXN0Lm5ld05hbWUoZ2V0U2ltcGxlTmFtZShjbHNOYW1lKSArIHZhbHVlLnN1YnN0cmluZyhpKSk7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIGFzdC5uZXdOYW1lKHZhbHVlKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGludCBoYXNoQ29kZSgpDQotCXsNCi0JCXJldHVybiB2YWx1ZS5oYXNoQ29kZSgpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikNCi0Jew0KLQkJaWYgKHRoaXMgPT0gb2JqKQ0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJaWYgKG9iaiA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWZpbmFsIFF1YWxpZmllZE5hbWVWYWx1ZUltcGwgb3RoZXIgPSAoUXVhbGlmaWVkTmFtZVZhbHVlSW1wbCkgb2JqOw0KLQkJcmV0dXJuIHZhbHVlLmVxdWFscyhvdGhlci52YWx1ZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkNCi0Jew0KLQkJcmV0dXJuIHZhbHVlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9TdHJpbmdWYWx1ZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9TdHJpbmdWYWx1ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNThiZDFiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvU3RyaW5nVmFsdWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7DQotDQotLyoqDQotICogSW1wbGVtZW50b3IgZm9yIElTdHJpbmdWYWx1ZQ0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTdHJpbmdWYWx1ZUltcGwgZXh0ZW5kcyBWYWx1ZUltcGwNCi17DQotCXByaXZhdGUgU3RyaW5nIHZhbHVlOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogDQotCSAqIEBwYXJhbSB2YWx1ZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZ1ZhbHVlSW1wbChTdHJpbmcgdmFsdWUpDQotCXsNCi0JCXRoaXMudmFsdWUgPSB2YWx1ZTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihDb21waWxhdGlvblVuaXQgdW5pdCwgQVNUIGFzdCkNCi0Jew0KLQkJU3RyaW5nTGl0ZXJhbCBsaXRlcmFsID0gYXN0Lm5ld1N0cmluZ0xpdGVyYWwoKTsNCi0JCWxpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKHZhbHVlKTsNCi0JCXJldHVybiBsaXRlcmFsOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0Jew0KLQkJcmV0dXJuIHZhbHVlLmhhc2hDb2RlKCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KLQl7DQotCQlpZiAodGhpcyA9PSBvYmopDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlpZiAob2JqID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJZmluYWwgU3RyaW5nVmFsdWVJbXBsIG90aGVyID0gKFN0cmluZ1ZhbHVlSW1wbCkgb2JqOw0KLQkJcmV0dXJuIHZhbHVlLmVxdWFscyhvdGhlci52YWx1ZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkNCi0Jew0KLQkJcmV0dXJuIHZhbHVlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9WYWx1ZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9WYWx1ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODhjNTcxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvVmFsdWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JbXBvcnREZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5RdWFsaWZpZWROYW1lOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlTmFtZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklMb2NhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWx1ZUltcGwgaW1wbGVtZW50cyBJVmFsdWUNCi17DQotCXByaXZhdGUgSUxvY2F0b3IgbG9jYXRvciA9IG51bGw7DQotDQotCXByb3RlY3RlZCBhYnN0cmFjdCBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oQ29tcGlsYXRpb25Vbml0IHVuaXQsIEFTVCBhc3QpOw0KLQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByb3RlY3RlZCBib29sZWFuIGFkZEltcG9ydHMoQVNUIGFzdCwgQ29tcGlsYXRpb25Vbml0IHVuaXQsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkNCi0Jew0KLQkJU3RyaW5nIHBhY2thZ2VBbm5vdGF0aW9uTmFtZSA9IGdldFBhY2thZ2VOYW1lKGFubm90YXRpb25OYW1lKTsNCi0JCWlmIChwYWNrYWdlQW5ub3RhdGlvbk5hbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlpZiAocGFja2FnZUFubm90YXRpb25OYW1lLmVxdWFscygiamF2YS5sYW5nIikpIC8vJE5PTi1OTFMtMSQNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWlmICh1bml0ICE9IG51bGwpDQotCQl7DQotCQkJSW1wb3J0RGVjbGFyYXRpb24gaW1wID0gYXN0Lm5ld0ltcG9ydERlY2xhcmF0aW9uKCk7DQotCQkJaW1wLnNldE5hbWUoYXN0Lm5ld05hbWUoYW5ub3RhdGlvbk5hbWUpKTsNCi0JCQlMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzID0gdW5pdC5pbXBvcnRzKCk7DQotCQkJU3RyaW5nIGltcDEgPSBnZXRJbXBvcnQoaW1wb3J0cywgZ2V0U2ltcGxlTmFtZShhbm5vdGF0aW9uTmFtZSkpOw0KLQkJCWlmIChpbXAxID09IG51bGwpDQotCQkJew0KLQkJCQlpZiAoZ2V0T25EZW1hbmRJbXBvcnQoaW1wb3J0cywgcGFja2FnZUFubm90YXRpb25OYW1lKSA9PSBudWxsKQ0KLQkJCQl7DQotCQkJCQlpbXBvcnRzLmFkZChpbXApOw0KLQkJCQl9DQotCQkJfSBlbHNlDQotCQkJew0KLQkJCQlpZiAoIWltcDEuZXF1YWxzKGFubm90YXRpb25OYW1lKSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQl9DQotCQkJfQ0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEltcG9ydChMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzLCBTdHJpbmcgaW1wKQ0KLQl7DQotCQlJdGVyYXRvcjxJbXBvcnREZWNsYXJhdGlvbj4gaXRlciA9IGltcG9ydHMuaXRlcmF0b3IoKTsNCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkNCi0JCXsNCi0JCQlJbXBvcnREZWNsYXJhdGlvbiBuZXh0ID0gaXRlci5uZXh0KCk7DQotCQkJTmFtZSBmcU5hbWUgPSBuZXh0LmdldE5hbWUoKTsNCi0JCQlTaW1wbGVOYW1lIG5hbWU7DQotCQkJaWYgKGZxTmFtZS5pc1F1YWxpZmllZE5hbWUoKSkNCi0JCQl7DQotCQkJCW5hbWUgPSAoKFF1YWxpZmllZE5hbWUpIGZxTmFtZSkuZ2V0TmFtZSgpOw0KLQkJCX0gZWxzZQ0KLQkJCXsNCi0JCQkJbmFtZSA9IChTaW1wbGVOYW1lKSBmcU5hbWU7DQotCQkJfQ0KLQkJCVN0cmluZyBzaW1wbGVOYW1lID0gbmFtZS5nZXRJZGVudGlmaWVyKCk7DQotCQkJaWYgKGltcC5lcXVhbHMoc2ltcGxlTmFtZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gZnFOYW1lLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldE9uRGVtYW5kSW1wb3J0KExpc3Q8SW1wb3J0RGVjbGFyYXRpb24+IGltcG9ydHMsIFN0cmluZyBpbXApDQotCXsNCi0JCUl0ZXJhdG9yPEltcG9ydERlY2xhcmF0aW9uPiBpdGVyID0gaW1wb3J0cy5pdGVyYXRvcigpOw0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCUltcG9ydERlY2xhcmF0aW9uIG5leHQgPSBpdGVyLm5leHQoKTsNCi0JCQlpZiAoIW5leHQuaXNPbkRlbWFuZCgpKQ0KLQkJCXsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCU5hbWUgZnFOYW1lID0gbmV4dC5nZXROYW1lKCk7DQotCQkJU3RyaW5nIG5hbWUgPSBmcU5hbWUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7DQotCQkJaWYgKGltcC5lcXVhbHMobmFtZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gbmFtZTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZShTdHJpbmcgbmFtZSkNCi0Jew0KLQkJaW50IGkgPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7DQotCQlpZiAoaSA9PSAtMSkNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCXJldHVybiBuYW1lLnN1YnN0cmluZygwLCBpKTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRTaW1wbGVOYW1lKFN0cmluZyBuYW1lKQ0KLQl7DQotCQlpbnQgaSA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsNCi0JCWlmIChpID09IC0xKQ0KLQkJCXJldHVybiBuYW1lOw0KLQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGkgKyAxKTsNCi0JfQ0KLQkNCi0JcHVibGljIElMb2NhdG9yIGdldExvY2F0b3IoKQ0KLQl7DQotCQlyZXR1cm4gdGhpcy5sb2NhdG9yOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldExvY2F0b3IoZmluYWwgSUxvY2F0b3IgbG9jYXRvcikNCi0Jew0KLQkJdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL3BsdWdpbi9KYXh3c1V0aWxzUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL3BsdWdpbi9KYXh3c1V0aWxzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0ZDNmYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9wbHVnaW4vSmF4d3NVdGlsc1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwucGx1Z2luOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RhcnR1cDsNCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIEpheHdzVXRpbHNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gaW1wbGVtZW50cyBJU3RhcnR1cA0KLXsNCi0JLy8gVGhlIHBsdWctaW4gSUQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscyI7DQotDQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JcHJpdmF0ZSBzdGF0aWMgSmF4d3NVdGlsc1BsdWdpbiBwbHVnaW47DQotCQ0KLQkvKioNCi0JICogVGhlIGNvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgSmF4d3NVdGlsc1BsdWdpbigpIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbnMjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gew0KLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7DQotCQlwbHVnaW4gPSB0aGlzOw0KLQkJDQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXBsdWdpbiA9IG51bGw7DQotCQlzdXBlci5zdG9wKGNvbnRleHQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JICoNCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEpheHdzVXRpbHNQbHVnaW4gZ2V0RGVmYXVsdCgpIHsNCi0JCXJldHVybiBwbHVnaW47DQotCX0NCi0NCi0JcHVibGljIHZvaWQgZWFybHlTdGFydHVwKCkNCi0Jew0KLQkJLy8gTm90aGluZyB0byBkby4gSG93ZXZlciwgdGhpcyBwdWdpbiBoYXMgdG8gc3RhcnQgYXMgZWFybHkgYXMgcG9zc2libGUgc2luY2UgaXRzIHNlcnZpY2VzIHdpbGwgYmUgdXNlZCBmb3IgY29tbW9uIGxvZ2dpbmcNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL3RleHQvSmF4V3NVdGlsTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvdGV4dC9KYXhXc1V0aWxNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMTM3NmI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvdGV4dC9KYXhXc1V0aWxNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwudGV4dDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsNCi0NCi1wdWJsaWMgY2xhc3MgSmF4V3NVdGlsTWVzc2FnZXMgZXh0ZW5kcyBOTFMNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwudGV4dC5KYXhXc1V0aWxNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQNCi0JDQotCQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYW5ub3RQZXJmb3JtRWRpdE1zZzsNCi0NCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcFVuaXRNaXNzaW5nTXNnOw0KLQ0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkVHJlZVN0YXRlTXNnOw0KLQ0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbm5vdGF0aW9uQ2Fubm90QmVTdG9yZWRNc2c7DQotDQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFubm90YXRpb25VdGlsc19QYXJhbVNob3VsZE5vdEJlTnVsbE1zZzsNCi0NCi0vLw0KLS8vCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZ2luZURhdGFQcm92aWRlcl9VbmFibGVUb0RldGVybWluZVBvcnRPZkRlcGxveVNlcnZlck1zZzsNCi0vLwkNCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmdpbmVEYXRhUHJvdmlkZXJfVW5hYmxlVG9EZXRlcm1pbmVOYW1lT2ZEZXBsb3lTZXJ2ZXJNc2c7DQotLy8NCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmdpbmVEYXRhUHJvdmlkZXJfVW5hYmxlVG9EZXRlcm1pbmVTYXBTeXN0ZW1PZkRlcGxveVNlcnZlck1zZzsNCi0vLw0KLS8vDQotCS8qKiBtZXNzYWdlIGNvbnN0YW50ICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdzZGxOYW1lc1ZhbGlkYXRvcl9FbXB0eVhtbE5hbWU7DQotCQ0KLQkvKiogbWVzc2FnZSBjb25zdGFudCAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXc2RsTmFtZXNWYWxpZGF0b3JfSW52YWxpZE5DTmFtZTsNCi0JDQotCS8qKiBtZXNzYWdlIGNvbnN0YW50ICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdzZGxOYW1lc1ZhbGlkYXRvcl9FbXB0eVhtbE5hbWUyOw0KLQkNCi0JLyoqIG1lc3NhZ2UgY29uc3RhbnQgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV3NkbE5hbWVzVmFsaWRhdG9yX0ludmFsaWROQ05hbWUyOwkNCi0JDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRSZXNvdXJjZXNNYW5hZ2VyX0ZJTEVfQ09OVEVOVFNfQ0hBTkdFX0ZBSUxFRF9NU0c7DQotCQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0TWFuYWdlbWVudFV0aWxzX1Byb2plY3RIYXNOb01ldGFJbmZGb2xkZXJNc2c7DQotCQ0KLQlzdGF0aWMNCi0Jew0KLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSmF4V3NVdGlsTWVzc2FnZXMuY2xhc3MpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvdGV4dC9KYXhXc1V0aWxNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC90ZXh0L0pheFdzVXRpbE1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhlY2EzMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC90ZXh0L0pheFdzVXRpbE1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotQ2Fubm90UGVyZm9ybUVkaXRNc2cJCQkJCQkJCQkJCQk9IEVkaXQgY2Fubm90IGJlIHBlcmZvcm1lZA0KLUNvbXBVbml0TWlzc2luZ01zZwkJCQkJCQkJCQkJCQk9IENvbXBpbGF0aW9uIHVuaXQgZmlsZSBtaXNzaW5nDQotSW52YWxpZFRyZWVTdGF0ZU1zZwkJCQkJCQkJCQkJCQk9IEludmFsaWQgcHJvamVjdCB0cmVlIHN0YXRlDQotQW5ub3RhdGlvbkNhbm5vdEJlU3RvcmVkTXNnCQkJCQkJCQkJCQk9IEFubm90YXRpb24gY291bGQgbm90IGJlIHN0b3JlZCwgdGhlIGZpbGUgaXMgbm90IHdyaXRhYmxlDQotQW5ub3RhdGlvblV0aWxzX1BhcmFtU2hvdWxkTm90QmVOdWxsTXNnCQkJCQkJCQk9IHswfSBzaG91bGQgbm90IGJlIG51bGwNCi0NCi1Xc2RsTmFtZXNWYWxpZGF0b3JfRW1wdHlYbWxOYW1lCQkJCQkJCQkJCT0gRW1wdHkgezB9IG5hbWUgaXMgbm90IGFsbG93ZWQuIFBsZWFzZSBlbnRlciBuYW1lLg0KLVdzZGxOYW1lc1ZhbGlkYXRvcl9JbnZhbGlkTkNOYW1lCQkJCQkJCQkJPSBUaGUgc3ltYm9sIHswfSBzcGVjaWZpZWQgZm9yIHsxfSB3aXRoIG5hbWUgezJ9IGlzIG5vdCBhbGxvd2VkIGZvciBOQ05hbWUuIFBsZWFzZSBjaGFuZ2UgezF9IG5hbWUuDQotV3NkbE5hbWVzVmFsaWRhdG9yX0VtcHR5WG1sTmFtZTIJCQkJCQkJCQk9IFNwZWNpZmllZCB7MH0gc2hvdWxkIG5vdCBiZSBlbXB0eQ0KLVdzZGxOYW1lc1ZhbGlkYXRvcl9JbnZhbGlkTkNOYW1lMgkJCQkJCQkJCT0gVGhlIHN5bWJvbCBcInswfVwiIHVzZWQgaW4gezF9IGlzIG5vdCBhbGxvd2VkIGluIE5DTmFtZQ0KLQ0KLUVkaXRSZXNvdXJjZXNNYW5hZ2VyX0ZJTEVfQ09OVEVOVFNfQ0hBTkdFX0ZBSUxFRF9NU0cJCQkJPSBGaWxlIGNvbnRlbnRzIGNvdWxkIG5vdCBiZSBzZXQNCi1Qcm9qZWN0TWFuYWdlbWVudFV0aWxzX1Byb2plY3RIYXNOb01ldGFJbmZGb2xkZXJNc2cJCQkJCT0gcHJvamVjdCB7MH0gZG9lcyBub3QgaGF2ZSBhIE1FVEEtSU5GIGZvbGRlcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvbG9nZ2luZy9JTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2xvZ2dpbmcvSUxvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlN2Y5MmZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvbG9nZ2luZy9JTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSUxvZ2dlcg0KLXsNCi0JLyoqDQotCSAqIExvZ3MgYSBtZXNzYWdlIHdpdGggc2V2ZXJpdHkgZXJyb3IuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihmaW5hbCBTdHJpbmcgbWVzc2FnZSk7DQotDQotCS8qKg0KLQkgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIHNldmVyaXR5IGVycm9yLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBtZXNzYWdlIHRvIGJlIGxvZ2dlZA0KLQkgKiBAcGFyYW0gY2F1c2UNCi0JICogICAgICAgICAgICBjYXVzaW5nIGV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSBjYXVzZSk7DQotDQotCS8qKg0KLQkgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIHNldmVyaXR5IHdhcm5pbmcuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBsb2dXYXJuKGZpbmFsIFN0cmluZyBtZXNzYWdlKTsNCi0NCi0JLyoqDQotCSAqIExvZ3MgYSBtZXNzYWdlIHdpdGggc2V2ZXJpdHkgd2FybmluZy4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgbWVzc2FnZSB0byBiZSBsb2dnZWQNCi0JICogQHBhcmFtIGNhdXNlDQotCSAqICAgICAgICAgICAgY2F1c2luZyBleGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIGxvZ1dhcm4oZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSBjYXVzZSk7DQotDQotCS8qKg0KLQkgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIHNldmVyaXR5IGRlYnVnLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBtZXNzYWdlIHRvIGJlIGxvZ2dlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgbG9nRGVidWcoZmluYWwgU3RyaW5nIG1lc3NhZ2UpOw0KLQ0KLQkvKioNCi0JICogTG9ncyBhIG1lc3NhZ2Ugd2l0aCBzZXZlcml0eSBkZWJ1Zy4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgbWVzc2FnZSB0byBiZSBsb2dnZWQNCi0JICogQHBhcmFtIGNhdXNlDQotCSAqICAgICAgICAgICAgY2F1c2luZyBleGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIGxvZ0RlYnVnKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpOw0KLQ0KLQkNCi0JcHVibGljIGJvb2xlYW4gaXNEZWJ1ZygpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2xvZ2dpbmcvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2xvZ2dpbmcvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmYWQzMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9sb2dnaW5nL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklMb2c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5TdGF0dXNVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLnBsdWdpbi5KYXh3c1V0aWxzUGx1Z2luOw0KLQ0KLXB1YmxpYyBjbGFzcyBMb2dnZXIgaW1wbGVtZW50cyBJTG9nZ2VyDQotew0KLQlwdWJsaWMgdm9pZCBsb2dEZWJ1ZyhTdHJpbmcgbWVzc2FnZSkNCi0Jew0KLS8vCQlsb2coKS5sb2coU3RhdHVzVXRpbHMuc3RhdHVzSW5mbyhtZXNzYWdlKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgbG9nRGVidWcoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkNCi0Jew0KLS8vCQlsb2coKS5sb2coU3RhdHVzVXRpbHMuc3RhdHVzSW5mbyhtZXNzYWdlLCBjYXVzZSkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlKQ0KLQl7DQotCQlsb2coKS5sb2coU3RhdHVzVXRpbHMuc3RhdHVzRXJyb3IobWVzc2FnZSkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpDQotCXsNCi0JCWxvZygpLmxvZyhTdGF0dXNVdGlscy5zdGF0dXNFcnJvcihtZXNzYWdlLCBjYXVzZSkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGxvZ1dhcm4oU3RyaW5nIG1lc3NhZ2UpDQotCXsNCi0JCWxvZygpLmxvZyhTdGF0dXNVdGlscy5zdGF0dXNXYXJuaW5nKG1lc3NhZ2UpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBsb2dXYXJuKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpDQotCXsNCi0JCWxvZygpLmxvZyhTdGF0dXNVdGlscy5zdGF0dXNXYXJuaW5nKG1lc3NhZ2UsIGNhdXNlKSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBJTG9nIGxvZygpDQotCXsNCi0JCXJldHVybiBKYXh3c1V0aWxzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlYnVnKCkNCi0Jew0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL0VkaXRSZXNvdXJjZXNNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9FZGl0UmVzb3VyY2VzTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNjM5OGE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL0VkaXRSZXNvdXJjZXNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLlN0YXR1c1V0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwudGV4dC5KYXhXc1V0aWxNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIFRoaXMgaXMgYW4gdXRpbGl0eSBjbGFzcyB3aGljaCBpcyBtZWFudCB0byBwcm92aWRlIGNvbW1vbiBmdW5jdGlvbmFsaXR5IHRvIHNhdmUgYW5kIG1vZGlmeSByZXNvdXJjZXMuIEl0IGlzIGEgd3JhcHBlciBvZiB0aGUgZWNsaXBzZSBBUEkgYW5kDQotICogd29ya2Fyb3VuZHMgc29tZSBEVFIgaXNzdWVzLiBVbnRpbCBEVFIgY29sbGVhZ3VlcyBmaXggdGhlaXIgY29kaW5nLCB0aGlzIG1hbmFnZXIgbXVzdCBiZSB1c2VkIG9uIGVhY2ggZmlsZSBtb2RpZmljYXRpb24gb2NjYXNpb24NCi0gKiANCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFZGl0UmVzb3VyY2VzTWFuYWdlcg0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUxvZ2dlciBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7DQotCQ0KLQkvKioNCi0JICogU2V0cyBlZGl0YWJpbGl0eSBvZiBhIGZpbGUuIEluIGNhc2UgdGhlIGZpbGUgc3BlY2lmaWVkIGlzIGFscmVhZHkgd3JpdGFibGUsIDxjb2RlPlN0YXR1cy5PS19TVEFUVVM8L2NvZGU+IGlzIHJldHVybmVkDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZQ0KLQkgKiAgICAgICAgICAgIFRoZSBmaWxlIHRvIGJlIHNldCBlZGl0YWJsZQ0KLQkgKiBAcGFyYW0gY29udGV4dA0KLQkgKiAgICAgICAgICAgIGVpdGhlciB7QGxpbmsgSVdvcmtzcGFjZSNWQUxJREFURV9QUk9NUFR9LCBvciB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw8L2NvZGU+IHRoYXQgaXMgdG8gYmUgdXNlZCB0byBwYXJlbnQgYW55DQotCSAqICAgICAgICAgICAgZGlhbG9ncyB3aXRoIHRoZSB1c2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBVSSBjb250ZXh0IChkZWNsYXJlZCBhcyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+IHRvIGF2b2lkIGFueSBkaXJlY3QNCi0JICogICAgICAgICAgICByZWZlcmVuY2VzIG9uIHRoZSBTV1QgY29tcG9uZW50KQ0KLQkgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGZpbGUgc3BlY2lmaWVkIGlzIG51bGwNCi0JICogQHNlZSBJV29ya3NwYWNlI1ZBTElEQVRFX1BST01QVA0KLQkgKi8NCi0JcHVibGljIElTdGF0dXMgc2V0RmlsZUVkaXRhYmxlKElGaWxlIGZpbGUsIE9iamVjdCBjb250ZXh0KQ0KLQl7DQotCQlpZiAoZmlsZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZmlsZSIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZighZmlsZS5pc1JlYWRPbmx5KCkpDQotCQl7DQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCQl9DQotCQkNCi0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gZmlsZS5nZXRXb3Jrc3BhY2UoKTsNCi0JCXJldHVybiB3b3Jrc3BhY2UudmFsaWRhdGVFZGl0KG5ldyBJRmlsZVtdIHsgZmlsZSB9LCBjb250ZXh0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyBlZGl0YWJsaWxpdHkgb2YgYSBmaWxlLiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIGVxdWl2YWxlbnQgdG8gaW52b2tpbmcNCi0JICogPGNvZGU+c2V0RmlsZUVkaXRhYmxlKGZpbGUsIElXb3Jrc3BhY2UuVkFMSURBVEVfUFJPTVBUKTwvY29kZT4NCi0JICogDQotCSAqIEBwYXJhbSBmaWxlDQotCSAqICAgICAgICAgICAgVGhlIGZpbGUgdG8gYmUgc2V0IGVkaXRhYmxlDQotCSAqIEByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgZmlsZSBzcGVjaWZpZWQgaXMgbnVsbA0KLQkgKiBAc2VlIEVkaXRSZXNvdXJjZXNNYW5hZ2VyI3NldEZpbGVFZGl0YWJsZShJRmlsZSwgT2JqZWN0KQ0KLQkgKiBAc2VlIElXb3Jrc3BhY2UjVkFMSURBVEVfUFJPTVBUDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIElTdGF0dXMgc2V0RmlsZUVkaXRhYmxlKElGaWxlIGZpbGUpDQotCXsNCi0JCXJldHVybiBzZXRGaWxlRWRpdGFibGUoZmlsZSwgSVdvcmtzcGFjZS5WQUxJREFURV9QUk9NUFQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIGVkaXRhYmxpbGl0eSBvZiBhbiBhcnJheSBvZiBmaWxlcy4gSW4gY2FzZSBhbGwgZmlsZXMgc3BlY2lmaWVkIGFyZSBhbHJlYWR5IHdyaXRhYmxlLCA8Y29kZT5TdGF0dXMuT0tfU1RBVFVTPC9jb2RlPiBpcyByZXR1cm5lZA0KLQkgKiANCi0JICogQHBhcmFtIGZpbGVzDQotCSAqICAgICAgICAgICAgVGhlIGFycmF5IG9mIGZpbGVzIHRvIGJlIHNldCBlZGl0YWJsZQ0KLQkgKiBAcGFyYW0gY29udGV4dA0KLQkgKiAgICAgICAgICAgIGVpdGhlciB7QGxpbmsgSVdvcmtzcGFjZSNWQUxJREFURV9QUk9NUFR9LCBvciB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw8L2NvZGU+IHRoYXQgaXMgdG8gYmUgdXNlZCB0byBwYXJlbnQgYW55DQotCSAqICAgICAgICAgICAgZGlhbG9ncyB3aXRoIHRoZSB1c2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBVSSBjb250ZXh0IChkZWNsYXJlZCBhcyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+IHRvIGF2b2lkIGFueSBkaXJlY3QNCi0JICogICAgICAgICAgICByZWZlcmVuY2VzIG9uIHRoZSBTV1QgY29tcG9uZW50KQ0KLQkgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBhcnJheSBpcyBlbXB0eSBvciBudWxsDQotCSAqLw0KLQlwdWJsaWMgSVN0YXR1cyBzZXRGaWxlc0VkaXRhYmxlKElGaWxlW10gZmlsZXMsIE9iamVjdCBjb250ZXh0KQ0KLQl7DQotCQlpZiAoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5sZW5ndGggPT0gMCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBcnJheSBtdXN0IG5vdCBiZSBlbXB0eSBub3IgbnVsbCIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlMaXN0PElGaWxlPiByb0ZpbGVzID0gbmV3IEFycmF5TGlzdDxJRmlsZT4oKTsNCi0JCWZvcihJRmlsZSBmIDogZmlsZXMpDQotCQl7DQotCQkJaWYoZi5pc1JlYWRPbmx5KCkpDQotCQkJew0KLQkJCQlyb0ZpbGVzLmFkZChmKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWlmKHJvRmlsZXMuc2l6ZSgpID09IDApDQotCQl7DQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCQl9DQotDQotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IHJvRmlsZXMuZ2V0KDApLmdldFdvcmtzcGFjZSgpOw0KLQkJcmV0dXJuIHdvcmtzcGFjZS52YWxpZGF0ZUVkaXQocm9GaWxlcy50b0FycmF5KG5ldyBJRmlsZVtyb0ZpbGVzLnNpemUoKV0pLCBjb250ZXh0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyBlZGl0YWJsaWxpdHkgb2YgYW4gYXJyYXkgb2YgZmlsZXMuIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZXF1aXZhbGVudCB0byBpbnZva2luZw0KLQkgKiA8Y29kZT5zZXRGaWxlc0VkaXRhYmxlKGZpbGVzLCBJV29ya3NwYWNlLlZBTElEQVRFX1BST01QVCk8L2NvZGU+IA0KLQkgKiANCi0JICogQHBhcmFtIGZpbGVzDQotCSAqICAgICAgICAgICAgVGhlIGFycmF5IG9mIGZpbGVzIHRvIGJlIHNldCBlZGl0YWJsZQ0KLQkgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBhcnJheSBpcyBlbXB0eSBvciBudWxsDQotCSAqIEBzZWUgRWRpdFJlc291cmNlc01hbmFnZXIjc2V0RmlsZXNFZGl0YWJsZShJRmlsZVtdLCBPYmplY3QpDQotCSAqLw0KLQlwdWJsaWMgSVN0YXR1cyBzZXRGaWxlc0VkaXRhYmxlKElGaWxlW10gZmlsZXMpDQotCXsNCi0JCXJldHVybiBzZXRGaWxlc0VkaXRhYmxlKGZpbGVzLCBJV29ya3NwYWNlLlZBTElEQVRFX1BST01QVCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGNvbnRlbnQgb2YgYSBmaWxlDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZQ0KLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIGJlIHNldA0KLQkgKiBAcGFyYW0gY29udGVudA0KLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IHRvIGJlIHNldA0KLQkgKiBAcGFyYW0gdXBkYXRlRmxhZ3MNCi0JICogICAgICAgICAgICB1cGRhdGUgZmxhZ3MuDQotCSAqIEBzZWUgSUZpbGUjc2V0Q29udGVudHMoamF2YS5pby5JbnB1dFN0cmVhbSwgaW50LCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yDQotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcyByZXBvcnRpbmcgaXMgbm90IGRlc2lyZWQNCi0JICogQHJldHVybiBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gPGNvZGU+ZmlsZTwvY29kZT4gb3IgPGNvZGU+Y29udGVudDwvY29kZT4gaXMgbnVsbA0KLQkgKi8NCi0JcHVibGljIElTdGF0dXMgc2V0RmlsZUNvbnRlbnRzKElGaWxlIGZpbGUsIFN0cmluZyBjb250ZW50LCBpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKQ0KLQl7DQotCQlpZiAoZmlsZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZmlsZSIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlpZiAoY29udGVudCA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiY29udGVudCIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlJU3RhdHVzIGVkaXRTdGF0dXMgPSBzZXRGaWxlRWRpdGFibGUoZmlsZSk7DQotCQlpZiAoZWRpdFN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuT0spDQotCQl7DQotCQkJLy8gc29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB0aGUgdmFsaWRhdGVFZGl0IG9wZXJhdGlvbg0KLQkJCXJldHVybiBlZGl0U3RhdHVzOw0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJZmlsZS5zZXRDb250ZW50cyhuZXcgU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyKGNvbnRlbnQpLCB1cGRhdGVGbGFncywgcHJvZ3Jlc3NNb25pdG9yKTsNCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlsb2dnZXIubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCXJldHVybiBTdGF0dXNVdGlscy5zdGF0dXNFcnJvcihKYXhXc1V0aWxNZXNzYWdlcy5FZGl0UmVzb3VyY2VzTWFuYWdlcl9GSUxFX0NPTlRFTlRTX0NIQU5HRV9GQUlMRURfTVNHLCBlKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgY29udGVudCBvZiBhIGZpbGUuIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgb2YgaW52b2tpbmcNCi0JICogPGNvZGU+c2V0RmlsZUNvbnRlbnMoSUZpbGUgZmlsZSwgU3RyaW5nIGNvbnRlbnQsIChrZWVwSGlzdG9yeSA/IElGaWxlLktFRVBfSElTVE9SWSA6IElSZXNvdXJjZS5OT05FKSB8IChmb3JjZSA/IElGaWxlLkZPUkNFIDogSVJlc291cmNlLk5PTkUpLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpPC9jb2RlPg0KLQkgKiANCi0JICogQHBhcmFtIGZpbGUNCi0JICogICAgICAgICAgICB0aGUgZmlsZSB0byBiZSBzZXQNCi0JICogQHBhcmFtIGNvbnRlbnQNCi0JICogICAgICAgICAgICB0aGUgY29udGVudCB0byBiZSBzZXQNCi0JICogQHBhcmFtIGZvcmNlDQotCSAqICAgICAgICAgICAgYSBmbGFnIGNvbnRyb2xsaW5nIGhvdyB0byBkZWFsIHdpdGggcmVzb3VyY2VzIHRoYXQgYXJlIG5vdCBpbiBzeW5jIHdpdGggdGhlIGxvY2FsIGZpbGUgc3lzdGVtDQotCSAqIEBwYXJhbSBrZWVwSGlzdG9yeQ0KLQkgKiAgICAgICAgICAgIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHN0b3JlIHRoZSBjdXJyZW50IGNvbnRlbnRzIGluIHRoZSBsb2NhbCBoaXN0b3J5DQotCSAqIEBwYXJhbSBtb25pdG9yDQotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcyByZXBvcnRpbmcgaXMgbm90IGRlc2lyZWQNCi0JICogQHJldHVybiBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gPGNvZGU+ZmlsZTwvY29kZT4gb3IgPGNvZGU+Y29udGVudDwvY29kZT4gaXMgbnVsbA0KLQkgKiBAc2VlIEVkaXRSZXNvdXJjZXNNYW5hZ2VyI3NldEZpbGVDb250ZW50cyhJRmlsZSwgU3RyaW5nLCBpbnQsIElQcm9ncmVzc01vbml0b3IpDQotCSAqLw0KLQlwdWJsaWMgSVN0YXR1cyBzZXRGaWxlQ29udGVudHMoSUZpbGUgZmlsZSwgU3RyaW5nIGNvbnRlbnQsIGJvb2xlYW4gZm9yY2UsIGJvb2xlYW4ga2VlcEhpc3RvcnksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0Jew0KLQkJcmV0dXJuIHNldEZpbGVDb250ZW50cyhmaWxlLCBjb250ZW50LCAoKGtlZXBIaXN0b3J5ID8gSUZpbGUuS0VFUF9ISVNUT1JZIDogSVJlc291cmNlLk5PTkUpIHwgKGZvcmNlID8gSUZpbGUuRk9SQ0UgOiBJUmVzb3VyY2UuTk9ORSkpLCBtb25pdG9yKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9GaWxlVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL0ZpbGVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZGRiM2ExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL0ZpbGVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlczsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWdpc3RyeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQotDQotLyoqDQotICogSW1wbGVtZW50YXRpb24gZm9yIGZpbGUgdXRpbGl0aWVzIGludGVyZmFjZQ0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICogDQotICovDQotcHVibGljIGNsYXNzIEZpbGVVdGlscyBpbXBsZW1lbnRzIElGaWxlVXRpbHMgew0KLQlwcml2YXRlIHN0YXRpYyBJRmlsZVV0aWxzIHV0aWxzID0gbnVsbDsNCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4ID0gMDsNCi0NCi0JcHVibGljIEZpbGVVdGlscygpIHsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhlIGZhY3RvcnkgbWV0aG9kDQotCSAqIA0KLQkgKiBAcmV0dXJuIGEgRmlsZVV0aWxzIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElGaWxlVXRpbHMgZ2V0SW5zdGFuY2UoKSB7DQotCQlpZiAodXRpbHMgPT0gbnVsbCkgew0KLQkJCXV0aWxzID0gbmV3IEZpbGVVdGlscygpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHV0aWxzOw0KLQl9DQotDQotCXB1YmxpYyBmaW5hbCBMaXN0PElFZGl0b3JQYXJ0PiBnZXRFZGl0b3JzQnlGaWxlTG9jYXRpb24oDQotCQkJZmluYWwgU3RyaW5nIGZpbGVMb2NhdGlvbikgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7DQotCQlMaXN0PElDb21waWxhdGlvblVuaXQ+IHVuaXRzID0gZ2V0Q29tcGlsYXRpb25Vbml0cyhmaWxlTG9jYXRpb24pOw0KLQkJU2V0PElFZGl0b3JQYXJ0PiBlZGl0b3JzID0gbmV3IEhhc2hTZXQ8SUVkaXRvclBhcnQ+KCk7DQotCQlmb3IgKElDb21waWxhdGlvblVuaXQgY3UgOiB1bml0cykgew0KLQkJCWZpbmFsIElFZGl0b3JEZXNjcmlwdG9yIGVkaXRvckRlc2NyID0gZ2V0RWRpdG9yRGVzY3JpcHRvcihjdQ0KLQkJCQkJLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJCWVkaXRvcnMuYWRkQWxsKGdldEVkaXRvcnNCeUNvbXBpbGF0aW9uVW5pdChlZGl0b3JEZXNjciwNCi0JCQkJCWdldEFjdGl2ZVdvcmtiZW5jaFBhZ2UoKSwgY3UpKTsNCi0NCi0JCX0NCi0NCi0JCXJldHVybiBBcnJheXMuYXNMaXN0KGVkaXRvcnMudG9BcnJheShuZXcgSUVkaXRvclBhcnRbZWRpdG9ycy5zaXplKCldKSk7DQotCX0NCi0NCi0JcHVibGljIGZpbmFsIExpc3Q8SUNvbXBpbGF0aW9uVW5pdD4gZ2V0Q29tcGlsYXRpb25Vbml0cygNCi0JCQlmaW5hbCBTdHJpbmcgZmlsZUxvY2F0aW9uKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsNCi0JCWlmIChmaWxlTG9jYXRpb24gPT0gbnVsbCkgew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZmlsZUxvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCUlGaWxlW10gZmlsZXNGb3VuZCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkNCi0JCQkJLmZpbmRGaWxlc0ZvckxvY2F0aW9uVVJJKG5ldyBGaWxlKGZpbGVMb2NhdGlvbikudG9VUkkoKSk7DQotCQlpZiAoZmlsZXNGb3VuZCA9PSBudWxsIHx8IGZpbGVzRm91bmQubGVuZ3RoID09IDApIHsNCi0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJGaWxlOiAiICsgZmlsZUxvY2F0aW9uICsgIiBkb2VzIG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCX0NCi0NCi0JCUxpc3Q8SUNvbXBpbGF0aW9uVW5pdD4gdW5pdHMgPSBuZXcgQXJyYXlMaXN0PElDb21waWxhdGlvblVuaXQ+KCk7DQotDQotCQlmb3IgKElGaWxlIGZpbGUgOiBmaWxlc0ZvdW5kKSB7DQotCQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gSmF2YUNvcmUuY3JlYXRlKGZpbGUpOw0KLQkJCWlmICghKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkpIHsNCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRmlsZTogIiArIGZpbGVMb2NhdGlvbiArICIgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQl9DQotDQotCQkJdW5pdHMuYWRkKChJQ29tcGlsYXRpb25Vbml0KSBqYXZhRWxlbWVudCk7DQotCQl9DQotDQotCQlyZXR1cm4gdW5pdHM7DQotCX0NCi0JCQkNCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3RVbml0KFN0cmluZyBmaWxlTG9jYXRpb24pDQotCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7DQotCQkNCi0JCWlmIChmaWxlTG9jYXRpb24gPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZpbGVMb2NhdGlvbiIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKGZpbGVMb2NhdGlvbikpOw0KLQkJaWYgKGZpbGUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJGaWxlOiAiICsgZmlsZUxvY2F0aW9uICsgIiBkb2VzIG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCX0NCi0NCi0JCXJldHVybiBmaWxlLmdldFByb2plY3QoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0ZpbGVEaXNwbGF5ZWRJbkRpcnR5RWRpdG9yKGZpbmFsIFN0cmluZyBmaWxlTG9jYXRpb24pDQotCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gaXNGaWxlRGlzcGxheWVkSW5EaXJ0eUVkaXRvcihnZXRFZGl0b3JzQnlGaWxlTG9jYXRpb24oZmlsZUxvY2F0aW9uKSk7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gaXNDb21waWxhdGlvblVuaXREaXNwbGF5ZWRJbkRpcnR5RWRpdG9yKA0KLQkJCWZpbmFsIElDb21waWxhdGlvblVuaXQgdW5pdCkgew0KLQkJcmV0dXJuIGlzRmlsZURpc3BsYXllZEluRGlydHlFZGl0b3IoZ2V0RWRpdG9yc0J5Q29tcGlsYXRpb25Vbml0KHVuaXQpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBzYXZlRWRpdG9yKFN0cmluZyBmaWxlTG9jYXRpb24pDQotCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7DQotCQlzYXZlRWRpdG9yKGZpbGVMb2NhdGlvbiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2F2ZUVkaXRvcihmaW5hbCBTdHJpbmcgZmlsZUxvY2F0aW9uLA0KLQkJCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7DQotCQlMaXN0PElFZGl0b3JQYXJ0PiBlZGl0b3JzID0gZ2V0RWRpdG9yc0J5RmlsZUxvY2F0aW9uKGZpbGVMb2NhdGlvbik7DQotCQlpZiAoZWRpdG9ycy5zaXplKCkgPT0gMCkgew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBmaWxlIGlzIG5vdCBkaXNwbGF5ZWQgYnkgYW4gZWRpdG9yIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXNhdmVFZGl0b3JzKGVkaXRvcnMsIG1vbml0b3IpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNhdmVFZGl0b3IoZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSwNCi0JCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCi0JCUxpc3Q8SUVkaXRvclBhcnQ+IGVkaXRvcnMgPSBnZXRFZGl0b3JzQnlDb21waWxhdGlvblVuaXQoY3UpOw0KLQkJaWYgKGVkaXRvcnMuc2l6ZSgpID09IDApIHsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgZmlsZSBpcyBub3QgZGlzcGxheWVkIGJ5IGFuIGVkaXRvciIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlzYXZlRWRpdG9ycyhlZGl0b3JzLCBtb25pdG9yKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzYXZlRWRpdG9yKGZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpIHsNCi0JCUxpc3Q8SUVkaXRvclBhcnQ+IGVkaXRvcnMgPSBnZXRFZGl0b3JzQnlDb21waWxhdGlvblVuaXQoY3UpOw0KLQkJaWYgKGVkaXRvcnMuc2l6ZSgpID09IDApIHsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgZmlsZSBpcyBub3QgZGlzcGxheWVkIGJ5IGFuIGVkaXRvciIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlzYXZlRWRpdG9ycyhlZGl0b3JzLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgc2F2ZUVkaXRvcnMoZmluYWwgTGlzdDxJRWRpdG9yUGFydD4gZWRpdG9ycywNCi0JCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCi0JCWZvciAoSUVkaXRvclBhcnQgZSA6IGVkaXRvcnMpIHsNCi0JCQlpZiAoZS5pc0RpcnR5KCkpIHsNCi0JCQkJZS5kb1NhdmUobW9uaXRvcik7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyBDb2xsZWN0aW9uPElFZGl0b3JQYXJ0PiBnZXREaXJ0eUVkaXRvcnMoKSB7DQotCQlmaW5hbCBTZXQ8SUVkaXRvcklucHV0PiBpbnB1dHMgPSBuZXcgSGFzaFNldDxJRWRpdG9ySW5wdXQ+KCk7DQotCQlmaW5hbCBDb2xsZWN0aW9uPElFZGl0b3JQYXJ0PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PElFZGl0b3JQYXJ0PigpOw0KLQkJZmluYWwgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOw0KLQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3MgPSB3b3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dzLmxlbmd0aDsgaSsrKSB7DQotCQkJZmluYWwgSVdvcmtiZW5jaFBhZ2VbXSBwYWdlcyA9IHdpbmRvd3NbaV0uZ2V0UGFnZXMoKTsNCi0JCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhZ2VzLmxlbmd0aDsgeCsrKSB7DQotCQkJCWZpbmFsIElFZGl0b3JQYXJ0W10gZWRpdG9ycyA9IHBhZ2VzW3hdLmdldERpcnR5RWRpdG9ycygpOw0KLQkJCQlmb3IgKGludCB6ID0gMDsgeiA8IGVkaXRvcnMubGVuZ3RoOyB6KyspIHsNCi0JCQkJCWZpbmFsIElFZGl0b3JQYXJ0IGVwID0gZWRpdG9yc1t6XTsNCi0JCQkJCWZpbmFsIElFZGl0b3JJbnB1dCBpbnB1dCA9IGVwLmdldEVkaXRvcklucHV0KCk7DQotCQkJCQlpZiAoIWlucHV0cy5jb250YWlucyhpbnB1dCkpIHsNCi0JCQkJCQlpbnB1dHMuYWRkKGlucHV0KTsNCi0JCQkJCQlyZXN1bHQuYWRkKGVwKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JcHJpdmF0ZSBJRWRpdG9yRGVzY3JpcHRvciBnZXRFZGl0b3JEZXNjcmlwdG9yKFN0cmluZyBmaWxlTmFtZSkgew0KLQkJSUVkaXRvclJlZ2lzdHJ5IGVkaXRvclJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQ0KLQkJCQkuZ2V0RWRpdG9yUmVnaXN0cnkoKTsNCi0JCXJldHVybiBlZGl0b3JSZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKGZpbGVOYW1lKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29udmVydHMgYSBTdHJpbmcgdG8gYSBVUkwsIGFzc3VtaW5nICdmaWxlOicgYXMgYSBkZWZhdWx0IHNjaGVtZS4NCi0JICogDQotCSAqIEBwYXJhbSBiYXNlDQotCSAqIEBwYXJhbSBwYXRoDQotCSAqIA0KLQkgKiBAcmV0dXJuDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uLA0KLQkgKiAgICAgICAgICAgICBpZiB0aGUgU3RyaW5nIGlzIG5laXRoZXIgYSB2YWxpZCBVUkwsIG5vciBhIHZhbGlkIGZpbGVuYW1lLg0KLQkgKiANCi0JICovDQotCXB1YmxpYyBmaW5hbCBVUkwgZmlsZU9yVVJMVG9VUkwoZmluYWwgVVJMIGJhc2UsIGZpbmFsIFN0cmluZyBwYXRoKQ0KLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlpZiAocGF0aCA9PSBudWxsKSB7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwYXRoIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCVN0cmluZyBsb2NhbFBhdGggPSBwYXRoOw0KLQkJVVJMIGxvY2FsQmFzZSA9IGJhc2U7DQotDQotCQlpZiAobG9jYWxCYXNlID09IG51bGwpIHsNCi0JCQlsb2NhbEJhc2UgPSBuZXcgVVJMKCJmaWxlOiIpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCWxvY2FsUGF0aCA9IGxvY2FsUGF0aC5yZXBsYWNlKCdcXCcsICcvJyk7DQotCQl0cnkgew0KLQkJCVN0cmluZyBwcm90b2NvbCA9IGxvY2FsQmFzZS5nZXRQcm90b2NvbCgpOw0KLQkJCWlmICghImh0dHAiLmVxdWFscyhwcm90b2NvbCkgLy8kTk9OLU5MUy0xJA0KLQkJCQkJJiYgISJodHRwcyIuZXF1YWxzKHByb3RvY29sKSAvLyROT04tTkxTLTEkDQotCQkJCQkmJiAobG9jYWxQYXRoLmNoYXJBdCgxKSA9PSAnOicNCi0JCQkJCQkJfHwgbG9jYWxQYXRoLmNoYXJBdCgwKSA9PSAnLycgfHwgbG9jYWxQYXRoDQotCQkJCQkJCS5jaGFyQXQoMCkgPT0gJ1xcJykpIHsNCi0JCQkJbG9jYWxQYXRoID0gKG5ldyBGaWxlKGxvY2FsUGF0aCkpLnRvVVJJKCkudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJCX0NCi0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgew0KLQkJCS8vICRKTC1FWEMkDQotCQl9DQotDQotCQlpZiAobG9jYWxQYXRoLnN0YXJ0c1dpdGgoImZpbGU6IikgJiYgbG9jYWxQYXRoLmxlbmd0aCgpID4gNSAvLyROT04tTkxTLTEkDQotCQkJCSYmIGxvY2FsUGF0aC5jaGFyQXQoNSkgIT0gJy8nKSB7DQotCQkJbG9jYWxQYXRoID0gImZpbGU6LyIuY29uY2F0KGxvY2FsUGF0aC5zdWJzdHJpbmcoNSkpOyAvLyROT04tTkxTLTEkDQotCQl9IGVsc2Ugew0KLQkJCWlmIChsb2NhbFBhdGguc3RhcnRzV2l0aCgiZmlsZTovLyIpIC8vJE5PTi1OTFMtMSQNCi0JCQkJCSYmICFsb2NhbFBhdGguc3RhcnRzV2l0aCgiZmlsZTovLy8vIikgLy8kTk9OLU5MUy0xJA0KLQkJCQkJJiYgIWxvY2FsUGF0aC5zdGFydHNXaXRoKCJmaWxlOi8vbG9jYWxob3N0LyIpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQkJbG9jYWxQYXRoID0gImZpbGU6Ly8vLyIuY29uY2F0KGxvY2FsUGF0aC5zdWJzdHJpbmcoImZpbGU6Ly8iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCQkJCS5sZW5ndGgoKSkpOw0KLQkJCX0NCi0JCX0NCi0JCVVSTCB1cmwgPSBuZXcgVVJMKGxvY2FsQmFzZSwgbG9jYWxQYXRoKTsNCi0JCXJldHVybiB1cmw7DQotCX0NCi0NCi0JcHVibGljIEZpbGUgY3JlYXRlVGVtcERpcmVjdG9yeSgpIHsNCi0JCVN0cmluZyB0ZW1wRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOyAvLyROT04tTkxTLTEkDQotCQlpbmRleCsrOw0KLQkJRmlsZSB0ZW1wMSA9IG5ldyBGaWxlKHRlbXBEaXIsIEludGVnZXIudG9TdHJpbmcodGhpcy5oYXNoQ29kZSgpKSArICJfIiAvLyROT04tTkxTLTEkDQotCQkJCSsgaW5kZXgpOw0KLQkJdGVtcDEubWtkaXIoKTsNCi0JCXJldHVybiB0ZW1wMTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBkZWxldGVEaXJlY3RvcnkoZmluYWwgRmlsZSBkaXJlY3RvcnkpIHsNCi0JCWlmIChkaXJlY3RvcnkgPT0gbnVsbCkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCWlmICghZGlyZWN0b3J5LmV4aXN0cygpKSB7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJZm9yIChGaWxlIGYgOiBkaXJlY3RvcnkubGlzdEZpbGVzKCkpIHsNCi0JCQlmLmRlbGV0ZSgpOw0KLQkJfQ0KLQkJZGlyZWN0b3J5LmRlbGV0ZSgpOw0KLQl9DQotDQotCXB1YmxpYyBJRmlsZVtdIGdldEZpbGVzQnlFeHRlbnNpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGV4dGVuc2lvbikNCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZXh0ZW5zaW9uLCAiZXh0ZW5zaW9uIik7IC8vJE5PTi1OTFMtMSQNCi0JCUFycmF5TGlzdDxJRmlsZT4gZm91bmRGaWxlcyA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7DQotDQotCQlnZXRGaWxlc0J5RXh0ZW5zaW9uKGZvdW5kRmlsZXMsIHByb2plY3QubWVtYmVycygpLCBleHRlbnNpb24pOw0KLQ0KLQkJcmV0dXJuIGZvdW5kRmlsZXMudG9BcnJheShuZXcgSUZpbGVbZm91bmRGaWxlcy5zaXplKCldKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgZ2V0RmlsZXNCeUV4dGVuc2lvbihBcnJheUxpc3Q8SUZpbGU+IGZvdW5kRmlsZXMsDQotCQkJSVJlc291cmNlW10gY3VycmVudFJlc291cmNlcywgU3RyaW5nIGV4dGVuc2lvbikNCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgY3VycmVudFJlc291cmNlcy5sZW5ndGg7IGlpKyspIHsNCi0JCQlpZiAoY3VycmVudFJlc291cmNlc1tpaV0uZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsNCi0JCQkJZ2V0RmlsZXNCeUV4dGVuc2lvbihmb3VuZEZpbGVzLA0KLQkJCQkJCSgoSUZvbGRlcikgY3VycmVudFJlc291cmNlc1tpaV0pLm1lbWJlcnMoKSwgZXh0ZW5zaW9uKTsNCi0JCQl9IGVsc2UgaWYgKGN1cnJlbnRSZXNvdXJjZXNbaWldLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRQ0KLQkJCQkJJiYgZXh0ZW5zaW9uDQotCQkJCQkJCS5lcXVhbHMoY3VycmVudFJlc291cmNlc1tpaV0uZ2V0RmlsZUV4dGVuc2lvbigpKSkgew0KLQkJCQlmb3VuZEZpbGVzLmFkZCgoSUZpbGUpIGN1cnJlbnRSZXNvdXJjZXNbaWldKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHVibGljIElGaWxlIGdldEZpbGVGb3JMb2NhdGlvbihJUGF0aCBsb2NhdGlvbikgew0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKA0KLQkJCQlsb2NhdGlvbik7DQotCX0NCi0NCi0JcHJpdmF0ZSBJV29ya2JlbmNoUGFnZSBnZXRBY3RpdmVXb3JrYmVuY2hQYWdlKCkgew0KLQkJaWYgKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkgPT0gbnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkNCi0JCQkJLmdldEFjdGl2ZVBhZ2UoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgTGlzdDxJRWRpdG9yUGFydD4gZ2V0RWRpdG9yc0J5Q29tcGlsYXRpb25Vbml0KA0KLQkJCWZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpIHsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShjdSwgImN1Iik7IC8vJE5PTi1OTFMtMSQNCi0JCWZpbmFsIElFZGl0b3JEZXNjcmlwdG9yIGVkaXRvckRlc2NyID0gZ2V0RWRpdG9yRGVzY3JpcHRvcihjdQ0KLQkJCQkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQlmaW5hbCBJV29ya2JlbmNoUGFnZSB3YlBhZ2UgPSBnZXRBY3RpdmVXb3JrYmVuY2hQYWdlKCk7DQotCQlpZiAod2JQYWdlID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxJRWRpdG9yUGFydD4oMCk7DQotCQl9DQotDQotCQlyZXR1cm4gZ2V0RWRpdG9yc0J5Q29tcGlsYXRpb25Vbml0KGVkaXRvckRlc2NyLCB3YlBhZ2UsIGN1KTsNCi0JfQ0KLQ0KLQlwcml2YXRlIExpc3Q8SUVkaXRvclBhcnQ+IGdldEVkaXRvcnNCeUNvbXBpbGF0aW9uVW5pdCgNCi0JCQlmaW5hbCBJRWRpdG9yRGVzY3JpcHRvciBlZGl0b3JEZXNjcmlwdG9yLA0KLQkJCWZpbmFsIElXb3JrYmVuY2hQYWdlIHBhZ2UsIGZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpIHsNCi0JCUxpc3Q8SUVkaXRvclBhcnQ+IGVkaXRvclBhcnRSZXR1cm5lZCA9IG5ldyBBcnJheUxpc3Q8SUVkaXRvclBhcnQ+KCk7DQotDQotCQlpZiAoZWRpdG9yRGVzY3JpcHRvciAhPSBudWxsICYmIHBhZ2UgIT0gbnVsbCkgew0KLQkJCWZvciAoSUVkaXRvclJlZmVyZW5jZSBlZGl0b3JSZWZlcmVjZSA6IHBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpKSB7DQotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBlZGl0b3JSZWZlcmVjZS5nZXRFZGl0b3IodHJ1ZSk7DQotCQkJCWlmIChpc0VkaXRvckFwcGxpY2FibGVGb3JDdShlZGl0b3JQYXJ0LCBjdSkpIHsNCi0JCQkJCWVkaXRvclBhcnRSZXR1cm5lZC5hZGQoZWRpdG9yUGFydCk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gZWRpdG9yUGFydFJldHVybmVkOw0KLQl9DQotDQotCXByaXZhdGUgYm9vbGVhbiBpc0VkaXRvckFwcGxpY2FibGVGb3JDdShmaW5hbCBJRWRpdG9yUGFydCBlZGl0b3IsDQotCQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgew0KLQkJaWYgKGVkaXRvciA9PSBudWxsKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJaWYgKCEoZWRpdG9yLmdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQ0KLQkJCQl8fCAhKGN1LmdldFJlc291cmNlKCkgaW5zdGFuY2VvZiBJRmlsZSkpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlmaW5hbCBJRmlsZSBjdUZpbGUgPSAoSUZpbGUpIGN1LmdldFJlc291cmNlKCk7DQotCQlmaW5hbCBJRmlsZUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcg0KLQkJCQkuZ2V0RWRpdG9ySW5wdXQoKTsNCi0NCi0JCXJldHVybiBjdUZpbGUuZXF1YWxzKGVkaXRvcklucHV0LmdldEZpbGUoKSk7DQotCX0NCi0NCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGaWxlRGlzcGxheWVkSW5EaXJ0eUVkaXRvcigNCi0JCQlmaW5hbCBMaXN0PElFZGl0b3JQYXJ0PiBkaXNwbGF5aW5nRWRpdG9ycykgew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGRpc3BsYXlpbmdFZGl0b3JzLCAiZGlzcGxheWluZ0VkaXRvcnMiKTsgLy8kTk9OLU5MUy0xJA0KLQkJZm9yIChJRWRpdG9yUGFydCBlZGl0b3IgOiBkaXNwbGF5aW5nRWRpdG9ycykgew0KLQkJCWlmIChlZGl0b3IuaXNEaXJ0eSgpKSB7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmVhZHMgZmlsZSBjb250ZW50IGFzIHRleHQgYW5kIHJldHVybnMge0BsaW5rIFN0cmluZ30NCi0JICogDQotCSAqIEBwYXJhbSBzb3VyY2VGaWxlDQotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgb2YgZmlsZQ0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVDb250ZW50KGZpbmFsIEZpbGUgc291cmNlRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCWZpbmFsIEZpbGVSZWFkZXIgZnIgPSBuZXcgRmlsZVJlYWRlcihzb3VyY2VGaWxlKTsNCi0JCWZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7DQotDQotCQl0cnkgew0KLQkJCWZpbmFsIGNoYXJbXSBidWZmID0gbmV3IGNoYXJbMTAyNF07DQotCQkJZm9yIChpbnQgY250ID0gMDsgKGNudCA9IGZyLnJlYWQoYnVmZikpID4gLTE7KSB7DQotCQkJCWJ1aWxkZXIuYXBwZW5kKGJ1ZmYsIDAsIGNudCk7DQotCQkJfQ0KLQkJfSBmaW5hbGx5IHsNCi0JCQlmci5jbG9zZSgpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRDb21waWxhdGlvblVuaXRDb250ZW50KGZpbmFsIElDb21waWxhdGlvblVuaXQgdW5pdCwNCi0JCQlmaW5hbCBTdHJpbmcgY29udGVudCwgZmluYWwgYm9vbGVhbiBmb3JjZSwNCi0JCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKHVuaXQsICJ1bml0Iik7IC8vJE5PTi1OTFMtMSQNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShjb250ZW50LCAiY29udGVudCIpOyAvLyROT04tTkxTLTEkDQotDQotCQl1bml0LmJlY29tZVdvcmtpbmdDb3B5KG1vbml0b3IpOw0KLQkJdHJ5IHsNCi0JCQl1bml0LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKGNvbnRlbnQpOw0KLQkJCXVuaXQuY29tbWl0V29ya2luZ0NvcHkoZm9yY2UsIG1vbml0b3IpOw0KLQkJfSBmaW5hbGx5IHsNCi0JCQl1bml0LmRpc2NhcmRXb3JraW5nQ29weSgpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldENvbXBpbGF0aW9uVW5pdENvbnRlbnRBbmRTYXZlRGlydHlFZGl0b3JzKA0KLQkJCWZpbmFsIElDb21waWxhdGlvblVuaXQgdW5pdCwgZmluYWwgU3RyaW5nIGNvbnRlbnQsDQotCQkJZmluYWwgYm9vbGVhbiBmb3JjZSwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQkJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KLQkJc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudCh1bml0LCBjb250ZW50LCBmb3JjZSwgbW9uaXRvcik7DQotCQlpZiAoaXNDb21waWxhdGlvblVuaXREaXNwbGF5ZWRJbkRpcnR5RWRpdG9yKHVuaXQpKSB7DQotCQkJc2F2ZUVkaXRvcih1bml0KTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9JRmlsZVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9JRmlsZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmZGZhMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvSUZpbGVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlczsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0Ow0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSB0aGF0IGRlZmluZXMgY29tbW9uIHV0aWxpZXMgZm9yIGZpbGUgbWFuaXB1bGF0aW9uDQotICogDQotICogQGF1dGhvciBEYW5haWwgQnJhbmVrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElGaWxlVXRpbHMgew0KLQ0KLQkvKioNCi0JICogUmV0cmlldmVzIHRoZSBlZGl0b3JzIHRoYXQgYXJlIGN1cnJlbnRseSBkaXNwbGF5aW5nIHRoZSBmaWxlIHNwZWNmaWVkLg0KLQkgKiANCi0JICogQHBhcmFtIGZpbGVMb2NhdGlvbg0KLQkgKiAgICAgICAgICAgIEFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUNCi0JICogQHNlZSBJUmVzb3VyY2UjZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkNCi0JICogQHJldHVybiBDdXJyZW50IG9wZW5lZCBlZGl0b3JzIG9mIHRoZSBmaWxlIHNwZWNpZmllZCBvciBhbiBlbXB0eSBsaXN0IGlmIHN1Y2ggYXJlIG5vdCBvcGVuZWQNCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdA0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IExpc3Q8SUVkaXRvclBhcnQ+IGdldEVkaXRvcnNCeUZpbGVMb2NhdGlvbigNCi0JCQlmaW5hbCBTdHJpbmcgZmlsZUxvY2F0aW9uKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBmaWxlIHNwZWNpZmllZCBpcyBkaXNwbGF5ZWQgd2l0aGluIGFuIGVkaXRvciB3aGljaA0KLQkgKiBoYXMgYSBkaXJ0eSBzdGF0ZS4NCi0JICogDQotCSAqIEBwYXJhbSBmaWxlTG9jYXRpb24NCi0JICogICAgICAgICAgICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlDQotCSAqIEBzZWUgSVJlc291cmNlI2dldExvY2F0aW9uKCkudG9PU1N0cmluZygpDQotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgZmlsZSBpcyBkaXJ0eQ0KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgZG9lcyBub3QgZXhpc3QNCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRmlsZURpc3BsYXllZEluRGlydHlFZGl0b3IoDQotCQkJZmluYWwgU3RyaW5nIGZpbGVMb2NhdGlvbikgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFNhdmVzIHRoZSBkaXJ0eSBzdGF0ZSBlZGl0b3INCi0JICogDQotCSAqIEBwYXJhbSBmaWxlTG9jYXRpb24NCi0JICogICAgICAgICAgICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlDQotCSAqIEBzZWUgSVJlc291cmNlI2dldExvY2F0aW9uKCkjdG9PU1N0cmluZygpDQotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGZpbGUgaXMgbm90IGRpc3BsYXllZCBieSBhbiBlZGl0b3INCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNhdmVFZGl0b3IoU3RyaW5nIGZpbGVMb2NhdGlvbikNCi0JCQl0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogU2F2ZXMgdGhlIGRpcnR5IHN0YXRlIGVkaXRvcg0KLQkgKiANCi0JICogQHBhcmFtIGZpbGVMb2NhdGlvbg0KLQkgKiAgICAgICAgICAgIEFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUNCi0JICogQHNlZSBJUmVzb3VyY2UjZ2V0TG9jYXRpb24oKSN0b09TU3RyaW5nKCkNCi0JICogQHBhcmFtIG1vbml0b3INCi0JICogICAgICAgICAgICBQcm9ncmVzcyBtb25pdG9yDQotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGZpbGUgaXMgbm90IGRpc3BsYXllZCBieSBhbiBlZGl0b3INCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNhdmVFZGl0b3IoU3RyaW5nIGZpbGVMb2NhdGlvbiwNCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIGRpcnR5IGVkaXRvcnMNCi0JICogDQotCSAqIEByZXR1cm4gY29sbGVjdGlvbiBjb250YWluaW5nIGRpcnR5IGVkaXRvcnMNCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCBDb2xsZWN0aW9uPElFZGl0b3JQYXJ0PiBnZXREaXJ0eUVkaXRvcnMoKTsNCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlIGNvbXBpbGF0aW9uIHVuaXRzIGZvciB0aGUgbG9jYXRpb24gc3BlY2lmaWVkDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZUxvY2F0aW9uDQotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUsIGUuZy4NCi0JICogICAgICAgICAgICA8Y29kZT5DOlxcZGlyMVxcZGlyMlxcZmlsZS5uYW1lPC9jb2RlPg0KLQkgKiBAc2VlIElSZXNvdXJjZSNnZXRMb2NhdGlvbigpI3RvT1NTdHJpbmcoKQ0KLQkgKiANCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgZmlsZSBzcGVjaWZpZWQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSB3b3Jrc3BhY2UNCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgZmlsZSBzcGVjaWZpZWQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gZmlsZUxvY2F0aW9uIGlzIG51bGwNCi0JICogQHJldHVybiBUaGUgY29tcGlsYXRpb24gdW5pdHM7IGNhbm5vdCBiZSBudWxsDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3QgTGlzdDxJQ29tcGlsYXRpb25Vbml0PiBnZXRDb21waWxhdGlvblVuaXRzKA0KLQkJCWZpbmFsIFN0cmluZyBmaWxlTG9jYXRpb24pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb247DQotCQ0KLQkvKioNCi0JICogUmV0cmlldmUgcHJvamVjdCB1bml0IGZvciB0aGUgbG9jYXRpb24gc3BlY2lmaWVkDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZUxvY2F0aW9uDQotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUsIGUuZy4NCi0JICogICAgICAgICAgICA8Y29kZT5DOlxcZGlyMVxcZGlyMlxcZmlsZS5uYW1lPC9jb2RlPg0KLQkgKiBAc2VlIElSZXNvdXJjZSNnZXRMb2NhdGlvbigpI3RvT1NTdHJpbmcoKQ0KLQkgKiANCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgZmlsZSBzcGVjaWZpZWQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSB3b3Jrc3BhY2UNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIGZpbGVMb2NhdGlvbiBpcyBudWxsDQotCSAqIEByZXR1cm4gVGhlIGNvbXBpbGF0aW9uIHVuaXRzOyBjYW5ub3QgYmUgbnVsbA0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IElQcm9qZWN0IGdldFByb2plY3RVbml0KA0KLQkJCWZpbmFsIFN0cmluZyBmaWxlTG9jYXRpb24pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBDb252ZXJ0cyBhIFN0cmluZyB0byBhIFVSTCwgYXNzdW1pbmcgJ2ZpbGU6JyBhcyBhIGRlZmF1bHQgc2NoZW1lLg0KLQkgKiANCi0JICogQHBhcmFtIGJhc2UNCi0JICogQHBhcmFtIHBhdGgNCi0JICogDQotCSAqIEByZXR1cm4NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24sDQotCSAqICAgICAgICAgICAgIGlmIHRoZSBTdHJpbmcgaXMgbmVpdGhlciBhIHZhbGlkIFVSTCwgbm9yIGEgdmFsaWQgZmlsZW5hbWUuDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IFVSTCBmaWxlT3JVUkxUb1VSTChmaW5hbCBVUkwgYmFzZSwgZmluYWwgU3RyaW5nIHBhdGgpDQotCQkJdGhyb3dzIElPRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIG5ldyBkaXJlY3RvcnkgaW4gdGhlIE9TIHRlbXAgZm9sZGVyDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBkaXJlY3RvcnkNCi0JICovDQotCXB1YmxpYyBGaWxlIGNyZWF0ZVRlbXBEaXJlY3RvcnkoKTsNCi0NCi0JLyoqDQotCSAqIERlbGV0ZXMgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgYW5kIGFsbCBpdHMgY29udGVudA0KLQkgKiANCi0JICogcGFyYW0gZGlyZWN0b3J5DQotCSAqLw0KLQlwdWJsaWMgdm9pZCBkZWxldGVEaXJlY3RvcnkoZmluYWwgRmlsZSBkaXJlY3RvcnkpOw0KLQ0KLQkvKioNCi0JICogR2V0cyBhbGwgdGhlIGZpbGVzIHdpdGggdGhlIHByb3ZpZGVkIGV4dGVuc2lvbiB3aXRoaW4gYSBwcm9qZWN0Lg0KLQkgKiANCi0JICogQHBhcmFtIHByb2plY3QgLQ0KLQkgKiAgICAgICAgICAgIHRvIGJlIHNlYXJjaGVkDQotCSAqIEBwYXJhbSBleHRlbnNpb24gLQ0KLQkgKiAgICAgICAgICAgIHR5cGVzIG9mIGZpbGVzIG9mIGludGVyZXN0DQotCSAqLw0KLQlwdWJsaWMgSUZpbGVbXSBnZXRGaWxlc0J5RXh0ZW5zaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBleHRlbnNpb24pDQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIGVkaXRvcnMgdGhhdCBhcmUgY3VycmVudGx5IGRpc3BsYXlpbmcgdGhlIGNvbXBpbGF0aW9uDQotCSAqIHVuaXQgc3BlY2lmaWVkLg0KLQkgKiANCi0JICogQHBhcmFtIGN1DQotCSAqICAgICAgICAgICAgdGhlIGNvbXBpbGF0aW9uIHVuaXQ7IG11c3Qgbm90IGJlIG51bGwNCi0JICogQHJldHVybiBDdXJyZW50IGVkaXRvcnMgbGlzdCBvciBhbiBlbXB0eSBsaXN0IGluIGNhc2UgdGhlcmUgYXJlIG5vdA0KLQkgKiAgICAgICAgIGVkaXRvcnMgZGlzcGxheWluZyB0aGUgZmlsZSBzcGVjaWZpZWQNCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgPGNvZGU+Y3U8L2NvZGU+IHBhcmFtZXRlciBpcyBudWxsDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3QgTGlzdDxJRWRpdG9yUGFydD4gZ2V0RWRpdG9yc0J5Q29tcGlsYXRpb25Vbml0KA0KLQkJCWZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpOw0KLQ0KLQkvKioNCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb21waWxhdGlvbiB1bml0IHNwZWNpZmllZCBpcyBkaXNwbGF5ZWQgd2l0aGluIGFuDQotCSAqIGVkaXRvciB3aGljaCBoYXMgYSBkaXJ0eSBzdGF0ZS4NCi0JICogDQotCSAqIEBwYXJhbSB1bml0DQotCSAqICAgICAgICAgICAgVGhlIGNvbXBpbGF0aW9uIHVuaXQNCi0JICogDQotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tcGlsYXRpb24gdW5pdCBpcyBkaXJ0eQ0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDb21waWxhdGlvblVuaXREaXNwbGF5ZWRJbkRpcnR5RWRpdG9yKA0KLQkJCWZpbmFsIElDb21waWxhdGlvblVuaXQgdW5pdCk7DQotDQotCS8qKg0KLQkgKiBTYXZlcyBhbGwgdGhlIGRpcnR5IHN0YXRlIGVkaXRvcnMgdGhhdCBhcmUgY3VycmVudGx5IGRpc3BsYXlpbmcgdGhlDQotCSAqIGNvbXBpbGF0aW9uIHVuaXQgc3BlY2lmaWVkDQotCSAqIA0KLQkgKiBAcGFyYW0gY3UNCi0JICogICAgICAgICAgICB0aGUgY29tcGlsYXRpb24gdW5pdA0KLQkgKiBAcGFyYW0gbW9uaXRvcg0KLQkgKiAgICAgICAgICAgIFByb2dyZXNzIG1vbml0b3INCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0DQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGZpbGUgaXMgbm90IGRpc3BsYXllZCBieSBhbiBlZGl0b3INCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNhdmVFZGl0b3IoSUNvbXBpbGF0aW9uVW5pdCBjdSwNCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOw0KLQ0KLQkvKioNCi0JICogU2F2ZXMgYWxsIHRoZSBkaXJ0eSBzdGF0ZSBlZGl0b3JzIHRoYXQgYXJlIGN1cnJlbnRseSBkaXNwbGF5aW5nIHRoZQ0KLQkgKiBjb21waWxhdGlvbiB1bml0IHNwZWNpZmllZA0KLQkgKiANCi0JICogQHBhcmFtIGN1DQotCSAqICAgICAgICAgICAgdGhlIGNvbXBpbGF0aW9uIHVuaXQNCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0DQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGZpbGUgaXMgbm90IGRpc3BsYXllZCBieSBhbiBlZGl0b3INCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNhdmVFZGl0b3IoSUNvbXBpbGF0aW9uVW5pdCBjdSk7DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZSBhIGZpbGUgaW5zdGFuY2UgZm9yIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQuIFRoaXMgbWV0aG9kIGlzIGENCi0JICogY29udmVuaWVuY2UgbWV0aG9kIGVxdWl2YWxlbnQgdG8gaW52b2tpbmcNCi0JICogPGNvZGU+UmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24obG9jYXRpb24pPC9jb2RlPg0KLQkgKiANCi0JICogQHBhcmFtIGxvY2F0aW9uDQotCSAqICAgICAgICAgICAgdGhlIGZpbGUgbG9jYXRpb247IG11c3QgYmUgYWJzb2x1dGUNCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBmaWxlIGluIHRoZSB3b3Jrc3BhY2UsIG9yIG51bGwgaWYgbm9uZQ0KLQkgKiBAc2VlIElXb3Jrc3BhY2VSb290I2dldEZpbGVGb3JMb2NhdGlvbihJUGF0aCkNCi0JICovDQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlRm9yTG9jYXRpb24oSVBhdGggbG9jYXRpb24pOw0KLQ0KLQkvKioNCi0JICogUmVhZHMgZmlsZSBjb250ZW50IGFzIHRleHQgYW5kIHJldHVybnMge0BsaW5rIFN0cmluZ30NCi0JICogDQotCSAqIEBwYXJhbSBzb3VyY2VGaWxlDQotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgb2YgZmlsZQ0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVDb250ZW50KGZpbmFsIEZpbGUgc291cmNlRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgY29udGVudCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCBzcGVjaWZpZWQgd2l0aCB0aGUNCi0JICogPGNvZGU+Y29udGVudDwvY29kZT4gcHJvdmlkZWQuIFRoZXJlIGlzIG5vIHZhbGlkYXRpb24gb2YgdGhlIGNvbnRlbnQNCi0JICogDQotCSAqIEBwYXJhbSBjVW5pdA0KLQkgKiAgICAgICAgICAgIHRoZSBjb21waWxhdGlvbiB1bml0LiBNdXN0IG5vdCBiZSBudWxsLiBJZiB0aGUgY29tcGlsYXRpb24NCi0JICogICAgICAgICAgICB1bml0IGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQNCi0JICogQHBhcmFtIGNvbnRlbnQNCi0JICogICAgICAgICAgICB0aGUgY29udGVudCB0byBiZSBzZXQuIE11c3Qgbm90IGJlIG51bGwNCi0JICogQHBhcmFtIGZvcmNlDQotCSAqICAgICAgICAgICAgYSBmbGFnIHRvIGhhbmRsZSB0aGUgY2FzZXMgd2hlbiB0aGUgY29udGVudHMgb2YgdGhlIG9yaWdpbmFsDQotCSAqICAgICAgICAgICAgcmVzb3VyY2UgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoaXMgd29ya2luZyBjb3B5IHdhcyBjcmVhdGVkDQotCSAqIEBwYXJhbSBtb25pdG9yDQotCSAqICAgICAgICAgICAgdGhlIG1vbml0b3IgdG8gcmVwb3J0IHByb2dyZXNzIHRvIG9yIG51bGwgaWYgbm8gcHJvZ3Jlc3MNCi0JICogICAgICAgICAgICBtb25pdG9yaW5nIGlzIHJlcXVpcmVkDQotCSAqIA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHNldHRpbmcgY29tcGlsYXRpb24gdW5pdCBjb250ZW50DQotCSAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCNiZWNvbWVXb3JraW5nQ29weShJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKiBAc2VlIElDb21waWxhdGlvblVuaXQjY29tbWl0V29ya2luZ0NvcHkoYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikNCi0JICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I2Rpc2NhcmRXb3JraW5nQ29weSgpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRDb21waWxhdGlvblVuaXRDb250ZW50KElDb21waWxhdGlvblVuaXQgY1VuaXQsDQotCQkJU3RyaW5nIGNvbnRlbnQsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0JCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgY29udGVudCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCBzcGVjaWZpZWQgd2l0aCB0aGUNCi0JICogPGNvZGU+Y29udGVudDwvY29kZT4gcHJvdmlkZWQgYW5kIHNhdmVzIHRoZSBkaXJ0eSBlZGl0b3JzIGlmIGFueSB3aGljaA0KLQkgKiBkaXNwbGF5IHRoZSBjb21waWxhdGlvbiB1bml0LiBUaGVyZSBpcyBubyB2YWxpZGF0aW9uIG9mIHRoZSBjb250ZW50DQotCSAqIA0KLQkgKiBAcGFyYW0gY1VuaXQNCi0JICogICAgICAgICAgICB0aGUgY29tcGlsYXRpb24gdW5pdC4gTXVzdCBub3QgYmUgbnVsbC4gSWYgdGhlIGNvbXBpbGF0aW9uDQotCSAqICAgICAgICAgICAgdW5pdCBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkDQotCSAqIEBwYXJhbSBjb250ZW50DQotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgdG8gYmUgc2V0LiBNdXN0IG5vdCBiZSBudWxsDQotCSAqIEBwYXJhbSBmb3JjZQ0KLQkgKiAgICAgICAgICAgIGEgZmxhZyB0byBoYW5kbGUgdGhlIGNhc2VzIHdoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbA0KLQkgKiAgICAgICAgICAgIHJlc291cmNlIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGlzIHdvcmtpbmcgY29weSB3YXMgY3JlYXRlZA0KLQkgKiBAcGFyYW0gbW9uaXRvcg0KLQkgKiAgICAgICAgICAgIHRoZSBtb25pdG9yIHRvIHJlcG9ydCBwcm9ncmVzcyB0byBvciBudWxsIGlmIG5vIHByb2dyZXNzDQotCSAqICAgICAgICAgICAgbW9uaXRvcmluZyBpcyByZXF1aXJlZA0KLQkgKiANCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCBzZXR0aW5nIGNvbXBpbGF0aW9uIHVuaXQgY29udGVudA0KLQkgKiBAc2VlIElDb21waWxhdGlvblVuaXQjYmVjb21lV29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvcikNCi0JICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I2NvbW1pdFdvcmtpbmdDb3B5KGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpDQotCSAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCNkaXNjYXJkV29ya2luZ0NvcHkoKQ0KLQkgKiBAc2VlIElGaWxlVXRpbHMjc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudChJQ29tcGlsYXRpb25Vbml0LCBTdHJpbmcsDQotCSAqICAgICAgYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikNCi0JICogQHNlZSBJRmlsZVV0aWxzI2lzRmlsZURpc3BsYXllZEluRGlydHlFZGl0b3IoU3RyaW5nKQ0KLQkgKiBAc2VlIElGaWxlVXRpbHMjc2F2ZUVkaXRvcihJQ29tcGlsYXRpb25Vbml0LCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudEFuZFNhdmVEaXJ0eUVkaXRvcnMoDQotCQkJSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCwgU3RyaW5nIGNvbnRlbnQsIGJvb2xlYW4gZm9yY2UsDQotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9Qcm9qZWN0TWFuYWdlbWVudFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9Qcm9qZWN0TWFuYWdlbWVudFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmODgwYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvUHJvamVjdE1hbmFnZW1lbnRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlczsNCi0NCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZXhjZXB0aW9uLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmZhY2V0cy5GYWNldFV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZmFjZXRzLklGYWNldFV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwudGV4dC5KYXhXc1V0aWxNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLQ0KLS8qKg0KLSAqIFV0aWxpdHkgdGhhdCBwcm92aWRlcyB1c2VmdWwgcHJvamVjdCBtYW5hZ2VtZW50IHNlcnZpY2VzDQotICogDQotICogQGF1dGhvciBKb2VyZyBEZWhtZWwNCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqLw0KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9qZWN0TWFuYWdlbWVudFV0aWxzDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJTG9nZ2VyIGxvZ2dlciA9IG5ldyBMb2dnZXIoKTsNCi0JDQotCS8qKg0KLQkgKiBQcm92aWRlcyB0aGUgbWV0YS1pbmYgZm9sZGVyIG9mIGEgRUpCIHByb2plY3QuDQotCSAqIA0KLQkgKiBAcGFyYW0gcFByb2plY3ROYW1lDQotCSAqICAgICAgICAgICAgcHJvamVjdCBuYW1lDQotCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIG9mIHRoZSBtZXRhLWluZiBmb2xkZXINCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiBwcm9qZWN0IG5hbWUgc3BlY2lmaWVkIGlzIDxjb2RlPm51bGw8L2NvZGU+LCBlbXB0eSBzdHJpbmcsIHRoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhY2Nlc3NpYmxlLCBvciB0aGUgcHJvamVjdA0KLQkgKiAgICAgICAgICAgICBpcyBub3QgYW4gZWpiIHByb2plY3QNCi0JICogQHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgZWl0aGVyIHRoZSBwcm9qZWN0IGRvZXNuJ3QgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZSBvciBpdCBkb2Vzbid0IGNvbnRhaW4gYSBtZXRhLWluZiBmb2xkZXINCi0JICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBhY2Nlc3NpbmcgamF2YSBtb2RlbA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJRm9sZGVyIGZpbmRNZXRhSW5mRm9sZGVyKGZpbmFsIFN0cmluZyBwUHJvamVjdE5hbWUpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgU3RyaW5nIG1ldGFJbmZOYW1lID0gIk1FVEEtSU5GIjsgLy8kTk9OLU5MUy0xJA0KLQkJZmluYWwgU3RyaW5nIGVqYk1vZHVsZU5hbWUgPSAiZWpiTW9kdWxlIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJaWYgKCFpc0VqYjNQcm9qZWN0KHBQcm9qZWN0TmFtZSkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvamVjdCAiICsgcFByb2plY3ROYW1lICsgIiBpcyBub3QgYW4gRUpCIHByb2plY3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl9DQotDQotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEJ5TmFtZShwUHJvamVjdE5hbWUpOw0KLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QocHJvamVjdCk7DQotCQlJUGFja2FnZUZyYWdtZW50IGVqYk1vZHVsZVBrZ0ZyYWdtZW50ID0gbnVsbDsNCi0NCi0JCXRyeQ0KLQkJew0KLQkJCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3QgZnJhZ21lbnRSb290IDogamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKSkNCi0JCQl7DQotCQkJCWlmIChmcmFnbWVudFJvb3QuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFICYmIGZyYWdtZW50Um9vdC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhlamJNb2R1bGVOYW1lKSkNCi0JCQkJew0KLQkJCQkJZWpiTW9kdWxlUGtnRnJhZ21lbnQgPSBmcmFnbWVudFJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KG1ldGFJbmZOYW1lKTsNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQl2ZXJpZnlNZXRhSW5mRm9sZGVyKGVqYk1vZHVsZVBrZ0ZyYWdtZW50LCBwUHJvamVjdE5hbWUpOw0KLQkJCXJldHVybiAoSUZvbGRlcikgZWpiTW9kdWxlUGtnRnJhZ21lbnQuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7DQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlsb2dnZXIubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeU1ldGFJbmZGb2xkZXIoSVBhY2thZ2VGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uDQotCXsNCi0JCWlmIChmcmFnbWVudCA9PSBudWxsKQ0KLQkJew0KLQkJCWZpbmFsIFN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgicHJvamVjdCB7MH0gZG9lcyBub3QgaGF2ZSBhIE1FVEEtSU5GIGZvbGRlciIsIG5ldyBPYmplY3RbXSB7IHByb2plY3ROYW1lIH0pOyAvLyROT04tTkxTLTEkDQotCQkJZmluYWwgU3RyaW5nIGxvY2FsaXplZE1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzVXRpbE1lc3NhZ2VzLlByb2plY3RNYW5hZ2VtZW50VXRpbHNfUHJvamVjdEhhc05vTWV0YUluZkZvbGRlck1zZywgbmV3IE9iamVjdFtdIHsgcHJvamVjdE5hbWUgfSk7DQotCQkJdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbihtc2csIGxvY2FsaXplZE1zZyk7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBmcmFnbWVudC5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsNCi0JCQkvLyBzaG91bGQgbm90IGhhcHBlbiENCi0JCQlpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpKQ0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlJlc291cmNlICIgKyByZXNvdXJjZS5nZXROYW1lKCkgKyAiIGlzIG5vdCBhIGZvbGRlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQl9DQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlsb2dnZXIubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2sgd2hldGhlciBhIHByb2plY3QgaXMgYW4gZWpiIDMgcHJvamVjdA0KLQkgKiANCi0JICogQHBhcmFtIHByb2plY3ROYW1lDQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Q7IGNhbm5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPiBvciBlbXB0eSBzdHJpbmcNCi0JICogQHJldHVybiB0cnVlIGluIGNhc2UgdGhlIHByb2plY3Qgc3BlY2lmaWVkIGlzIGEgZWpiIDMgcHJvamVjdDsgZmFsc2Ugb3RoZXJ3aXNlDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIHByb2plY3QgbmFtZSBzcGVjaWZpZWQgaXMgPGNvZGU+bnVsbDwvY29kZT4sIGVtcHR5IHN0cmluZw0KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhY2Nlc3NpYmxlDQotCSAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGFjY2Vzc2luZyB0aGUgcHJvamVjdCBtZXRhZGF0YQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRWpiM1Byb2plY3QoZmluYWwgU3RyaW5nIHByb2plY3ROYW1lKQ0KLQl7DQotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEJ5TmFtZShwcm9qZWN0TmFtZSk7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlyZXR1cm4gZmFjZXRVdGlscygpLmhhc0ZhY2V0V2l0aFZlcnNpb24ocHJvamVjdCwgSUZhY2V0VXRpbHMuRUpCXzMwX0ZBQ0VUX1ZFUlNJT04sIElGYWNldFV0aWxzLkVKQl8zMF9GQUNFVF9JRCwgdHJ1ZSk7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJbG9nZ2VyLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIENoZWNrIHdoZXRoZXIgYSBwcm9qZWN0IGlzIGFuIHdlYiAyLjUgcHJvamVjdA0KLQkgKiANCi0JICogQHBhcmFtIHByb2plY3ROYW1lDQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Q7IGNhbm5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPiBvciBlbXB0eSBzdHJpbmcNCi0JICogQHJldHVybiB0cnVlIGluIGNhc2UgdGhlIHByb2plY3Qgc3BlY2lmaWVkIGlzIGEgd2ViIDIuNSBwcm9qZWN0OyBmYWxzZSBvdGhlcndpc2UNCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgcHJvamVjdCBuYW1lIHNwZWNpZmllZCBpcyA8Y29kZT5udWxsPC9jb2RlPiwgZW1wdHkgc3RyaW5nDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIHByb2plY3QgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGFjY2Vzc2libGUNCi0JICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgYWNjZXNzaW5nIHRoZSBwcm9qZWN0IG1ldGFkYXRhDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXZWIyNVByb2plY3QoZmluYWwgU3RyaW5nIHByb2plY3ROYW1lKQ0KLQl7DQotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEJ5TmFtZShwcm9qZWN0TmFtZSk7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlyZXR1cm4gZmFjZXRVdGlscygpLmhhc0ZhY2V0V2l0aFZlcnNpb24ocHJvamVjdCwgSUZhY2V0VXRpbHMuV0VCXzI1X0ZBQ0VUX1ZFUlNJT04sIElGYWNldFV0aWxzLldFQl8yNV9GQUNFVF9JRCwgdHJ1ZSk7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJbG9nZ2VyLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlIHRoZSBwcm9qZWN0IGluc3RhbmNlIGJ5IHByb2plY3QgbmFtZQ0KLQkgKiANCi0JICogQHBhcmFtIHByb2plY3ROYW1lDQotCSAqICAgICAgICAgICAgdGhlIHByb2plY3QgbmFtZQ0KLQkgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IGluc3RhbmNlDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIHByb2plY3QgbmFtZSBzcGVjaWZpZWQgaXMgbnVsbCBvciBlbXB0eSBzdHJpbmcNCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgcHJvamVjdCBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYWNjZXNzaWJsZQ0KLQkgKiANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdEJ5TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpDQotCXsNCi0JCWlmIChwcm9qZWN0TmFtZSA9PSBudWxsIHx8IHByb2plY3ROYW1lLmxlbmd0aCgpID09IDApDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBwcm9qZWN0IG5hbWU6ICIgKyBwcm9qZWN0TmFtZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOw0KLQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCAhcHJvamVjdC5pc0FjY2Vzc2libGUoKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9qZWN0IGlzIG5vdCBhY2Nlc3NpYmxlIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBwcm9qZWN0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBHZXQgdGhlIGphdmEgcHJvamVjdCBpbnN0YW5jZQ0KLQkgKiANCi0JICogQHBhcmFtIHByb2plY3QNCi0JICogICAgICAgICAgICB0aGUgcHJvamVjdCBhcyBlY2xpcHNlIHJlc291cmNlDQotCSAqIEByZXR1cm4gdGhlIGphdmEgcHJvamVjdCBpbnN0YW5jZQ0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPnByb2plY3Q8L2NvZGU+IG51bGwgb3IgdGhlIHByb2plY3QgaXMgbm90IGFjY2Vzc2libGUNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpDQotCXsNCi0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvamVjdCBpcyBub3QgYWNjZXNzaWJsZSIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmVmcmVzaCB0aGUgcmVzb3VyY2Ugc3BlY2lmaWVkLiBSZWZyZXNoIGRlcHRoIHVzZWQgaXMgemVybw0KLQkgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIHRvIGJlIHJlZnJlc2hlZA0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gDQotCSAqIEBzZWUgSVJlc291cmNlI0RFUFRIX1pFUk8NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlpZihyZXNvdXJjZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicmVzb3VyY2UiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlyZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG51bGwpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZWZyZXNoZXMgdGhlIHByb2plY3QgdGhlIHJlc291cmNlIHNwZWNpZmllZCBiZWxvbmdzIHRvLiBSZWZyZXNoIGRlcHRoIHVzZWQgaXMgaW5maW5pdGUuDQotCSAqIEBwYXJhbSB0aGUgcmVzb3VyY2Ugd2hpY2ggcHJvamVjdCBpcyB0byBiZSByZWZyZXNoZWQNCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHRoZSByZXNvdXJjZSBzcGVjaWZpZWQgaXMgYSB3b3Jrc3BhY2Ugcm9vdA0KLQkgKiBAc2VlIElSZXNvdXJjZSNERVBUSF9JTkZJTklURQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hQcm9qZWN0QnlSZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWlmKHJlc291cmNlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJyZXNvdXJjZSIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkNCi0JCWlmKHJlc291cmNlIGluc3RhbmNlb2YgSVdvcmtzcGFjZVJvb3QpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT3BlcmF0aW9uIGlzIG5vdCBkZWZpbmVkIGZvciB3b3Jrc3BhY2Ugcm9vdHMiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlyZXNvdXJjZS5nZXRQcm9qZWN0KCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7DQotCX0NCi0JDQotCXByaXZhdGUgc3RhdGljIElGYWNldFV0aWxzIGZhY2V0VXRpbHMoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IEZhY2V0VXRpbHMoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9TdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL1N0cmluZ0lucHV0U3RyZWFtQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMGM5NjI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL1N0cmluZ0lucHV0U3RyZWFtQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIGNsYXNzIHRoYXQgdXNlcyBhIFN0cmluZ1JlYWRlciB0byBvcmdhbml6ZSBhbiBJbnB1dFN0cmVhbQ0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICogDQotICovDQotcHVibGljIGNsYXNzIFN0cmluZ0lucHV0U3RyZWFtQWRhcHRlciBleHRlbmRzIElucHV0U3RyZWFtDQotew0KLQlwcml2YXRlIFN0cmluZ1JlYWRlciByZWFkZXI7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiANCi0JICogQHBhcmFtIHN0cmluZw0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gPGNvZGU+c3RyaW5nPC9jb2RlPiBpcyBudWxsDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyKFN0cmluZyBzdHJpbmcpDQotCXsNCi0JCWlmIChzdHJpbmcgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInN0cmluZyIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlyZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHN0cmluZyk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbg0KLQl7DQotCQlyZXR1cm4gcmVhZGVyLnJlYWQoKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljNTlhM2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjdjNjhkZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXI7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC41LjAKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cztidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGQ2OTBmMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+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+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9jeGZfZmFjZXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvY3hmX2ZhY2V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0NGRlNjIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9jeGZfZmFjZXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5DWEYgUHJvamVjdCBGYWNldDwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj5DWEYgUHJvamVjdCBGYWNldDwvaDI+Ci08cD5GYWNldHMgY2FuIGJlIHRob3VnaHQgb2YgYXMgdW5pdHMgb2YgZnVuY3Rpb25hbGl0eSB0aGF0IGNhbiBiZSBhZGRlZCBhbmQgcmVtb3ZlZCBmcm9tIGZhY2V0IGJhc2VkIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UuPC9wPgotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gb24gZmFjZXRzIHNlZSB0aGUgPGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jZmFjZXRzLmh0bWwiPldUUCBQcm9qZWN0IEZhY2V0cyBkb2N1bWVudGF0aW9uPC9hPi48L3A+Ci08cD5KQVgtV1MgVG9vbHMgcHJvdmlkZXMgdGhlIENYRiBGYWNldCB0aGF0IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgd2hlbiBpbnN0YWxsZWQgb24gYSBEeW5hbWljIFdlYiBQcm9qZWN0OjwvcD4KLTx1bD4KLSAgPGxpPkNvbmZpZ3VyZXMgdGhlIHByb2plY3Qgd2l0aCB0aGUgQ1hGIENsYXNzcGF0aCBDb250YWluZXIuPC9saT4KLSAgPGxpPkNvbmZpZ3VyZXMgdGhlIHByb2plY3Qgd2l0aCB0aGUgQ1hGIEpBWC1XUyBlbmRwb2ludCBjb25maWd1cmF0aW9uIG9wdGlvbiB0aGF0IGlzIHNlbGVjdGVkIGluIHRoZSA8YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvZW5kcG9pbnRfY29uZmlnX3RhYi5odG1sIj5FbmRwb2ludCBDb25maWc8L2E+IHByZWZlcmVuY2VzLjwvbGk+Ci0gIDxsaT5FbmFibGVzIEpBWC1XUyBBbm5vdGF0aW9uIHByb2Nlc3NpbmcgaWYgdGhlIG9wdGlvbiBpcyBzZWxlY3RlZCBpbiB0aGUgPGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2pheHdzX3RhYi5odG1sIj5KQVgtV1M8L2E+IHByZWZlcmVuY2VzLjwvbGk+Ci08L3VsPgotPHA+VGhlIENYRiBGYWNldCBoYXMgdGhlIGZvbGxvd2luZyBmYWNldCBwcmVyZXF1aXNpdGVzOjwvcD4KLTx1bD4KLSAgPGxpPkR5bmFtaWMgV2ViIE1vZHVsZSB2ZXJzaW9uIDIuNCBvciBncmVhdGVyPC9saT4KLSAgPGxpPkphdmEgdmVyc2lvbiA1LjAgb3IgZ3JlYXRlcjwvbGk+Ci08L3VsPgotPHA+VGhlIENYRiBGYWNldCBhbmQgaXQncyBwcmVyZXF1aXNpdGVzIGFyZSBncm91cGVkIGludG8gYSBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gdGhhdCBjYW4gYmUgc2VsZWN0ZWQgd2hlbiBjcmVhdGluZyBhIER5bmFtaWMgV2ViIFByb2plY3QuPC9wPgotCi08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iLi4vdGFza3MvY3JlYXRlX2N4Zl9wcm9qZWN0Lmh0bWwiPkNyZWF0aW5nIGEgcHJvamVjdCBmb3IgQ1hGIFdlYiBzZXJ2aWNlczwvYT48YnI+Ci08YSBocmVmPSIuLi90YXNrcy9pbnN0YWxsX2N4Zl9mYWNldC5odG1sIj5JbnN0YWxsIHRoZSBDWEYgUHJvamVjdCBGYWNldDwvYT48YnI+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9lbmRwb2ludF9jb25maWdfdGFiLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2VuZHBvaW50X2NvbmZpZ190YWIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzRiOTNhZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2VuZHBvaW50X2NvbmZpZ190YWIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5KQVgtV1MgRW5kcG9pbnQgQ29uZmlndXJhdGlvbiBQcmVmZXJlbmNlczwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj5FbmRwb2ludCBDb25maWcgUHJlZmVyZW5jZXM8L2gyPgotPHA+VGhlIDxzdHJvbmc+RW5kcG9pbnQgQ29uZmlnPC9zdHJvbmc+IHRhYiBwcm92aWRlcyBzZXR0aW5nIHRoYXQgY29udHJvbCB0aGUgdHlwZSBvZiBlbmRwb2ludCBjb25maWd1cmF0aW9uIHRoYXQgd2ViIHByb2plY3RzIGFyZSBjb25maWd1cmVkIHdpdGggd2hlbiB0aGUgQ1hGIEZhY2V0IGlzIGluc3RhbGxlZC48L3A+Ci08cD48aW1nIHNyYz0iLi9pbWFnZXMvc3ByaW5nX2NvbmZpZy5wbmciIGFsdD0iU3ByaW5nIENvbmZpZyB0YWIiID4gPC9wPgotPHA+PC9wPgotICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgc3VtbWFyeT0iSmF2YSBzZWFyY2ggYWN0aW9ucyI+Ci0gICAgICA8dGhlYWQ+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8cD48c3BhbiBjbGFzcz0iY29udHJvbCI+T3B0aW9uPC9zcGFuPjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9ImNvbnRyb2wiPkRlc2NyaXB0aW9uPC9zcGFuPjwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIAotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxwPjxzcGFuIGNsYXNzPSJjb250cm9sIj5EZWZhdWx0PC9zcGFuPjwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90aGVhZD4KLQotICAgICAgPHRib2R5PgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlVzZSBDWEYgU2VydmxldDwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkNyZWF0ZXMgYSBjeGYtc2VydmxldC54bWwgZmlsZSBpbiB0aGUgV2ViIFByb2plY3RzIFdFQi1JTkYgZGlyZWN0b3J5LiBUaGlzIGlzIHRoZSBzbG93ZXIgb3B0aW9uIG9mIHRoZSB0d28gYXMgaXQgbG9hZHMgYWxsIHBvc3NpYmxlIENYRiBtb2R1bGVzIGZvciBhbiBlbmRwb2ludDwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIAotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5mYWxzZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+Q3JlYXRlcyBhIGJlYW5zLnhtbCBmaWxlIGluIHRoZSBXZWIgUHJvamVjdHMgV0VCLUlORiBkaXJlY3RvcnkuIFRoaXMgaXMgdGhlIGZhc3Rlc3Qgb3B0aW9uIGFzIGl0IGFsbG93cyB0aGUgc3BlY2lmaWNhdGlvbiBvZiB3aGljaCBDWEYgbW9kdWxlcyB0byBsb2FkIGZvciBhbiBlbmRwb2ludDwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPnRydWU8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGJvZHk+Ci0gICAgPC90YWJsZT4KLSAgICAKLTxwPkR1cmluZyBib3R0b20tdXAgYW5kIHRvcC1kb3duIHdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCB0aGUgZW5kcG9pbnQgY29uZmlndXJhdGlvbiBmaWxlIGluIHRoZSB3ZWIgcHJvamVjdCBpcyB1cGRhdGVkIHdpdGggYSBqYXh3czplbmRwb2ludCBlbGVtZW50IGZvciB0aGUgZ2VuZXJhdGVkIHdlYiBzZXJ2aWNlLjwvcD4KLQotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSIuLi9yZWZlcmVuY2UvY3hmX2ZhY2V0Lmh0bWwiPkNYRiBQcm9qZWN0IEZhY2V0PC9hPjxicj4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSIuLi90YXNrcy9jcmVhdGVfY3hmX3Byb2plY3QuaHRtbCI+Q3JlYXRlIGEgcHJvamVjdCBmb3IgQ1hGIFdlYiBzZXJ2aWNlczwvYT48YnI+Ci08YSBocmVmPSIuLi90YXNrcy9jcmVhdGVfYm90dG9tdXAuaHRtbCI+Q3JlYXRlIGEgV2ViIFNlcnZpY2UgZnJvbSBhIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiB1c2luZyBBcGFjaGUgQ1hGPC9hPjxicj4KLTxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV90b3Bkb3duLmh0bWwiPkdlbmVyYXRlIGFuIFNFSSBhbmQgYSBza2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEY8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2FwdF9wcm9jZXNzaW5nLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2FwdF9wcm9jZXNzaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjEyYmVjNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9hcHRfcHJvY2Vzc2luZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9jeGYyeF9wcmVmZXJlbmNlcy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9jeGYyeF9wcmVmZXJlbmNlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJmZjM3YjguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvY3hmMnhfcHJlZmVyZW5jZXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvY3hmX3J1bnRpbWVfdGFiLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2N4Zl9ydW50aW1lX3RhYi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0YjZlNzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvY3hmX3J1bnRpbWVfdGFiLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2phdmEyd3NfdGFiLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2phdmEyd3NfdGFiLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjg5MDY4YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9qYXZhMndzX3RhYi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9qYXh3c19hbm5vdGF0aW9ucy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9qYXh3c19hbm5vdGF0aW9ucy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQyMTY5MGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvamF4d3NfYW5ub3RhdGlvbnMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvc2VydmVyX3J1bnRpbWUucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvc2VydmVyX3J1bnRpbWUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZjAzMGYwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL3NlcnZlcl9ydW50aW1lLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL3NwcmluZ19jb25maWcucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvc3ByaW5nX2NvbmZpZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1NjY0MTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvc3ByaW5nX2NvbmZpZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy93c2RsMmphdmEucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvd3NkbDJqYXZhLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzAyZDY0Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy93c2RsMmphdmEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMveGpjLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL3hqYy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZhNzcwMjEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMveGpjLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvamF2YTJ3c190YWIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvamF2YTJ3c190YWIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzlmMzJmZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2phdmEyd3NfdGFiLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiI+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPkphdmEyV1MgUHJlZmVyZW5jZXM8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+SmF2YTJXUyBQcmVmZXJlbmNlczwvaDI+Ci08cD5UaGUgPHN0cm9uZz5KYXZhMldTPC9zdHJvbmc+IHRhYiBwcm92aWRlcyBzZXR0aW5ncyB0aGF0IGNvbnRyb2wgdGhlIENYRiBqYXZhMndzIHRvb2wgKGZvciBDWEYgMi4xLnggcnVudGltZXMgYW5kIGFib3ZlKS4gV2hlbiBhIENYRiAyLjAueCBydW50aW1lIGlzIHNlbGVjdGVkIHRoaXMgcGFnZSBkaXNwbGF5cyBhIHN1YnNldCBvZiB0aGUgYXZhaWxhYmxlIHNldHRpbmcgdGhhdCBwcm92aWRlcyBjb250cm9sIG9mIHRoZSBDWEYgamF2YTJ3c2RsIHRvb2wuPC9wPgotPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL2phdmEyd3NfdGFiLnBuZyIgYWx0PSJKYXZhMldTIHRhYiIgPiA8L3A+Ci08cD48L3A+Ci0gICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI1IiBzdW1tYXJ5PSJKYXZhIHNlYXJjaCBhY3Rpb25zIj4KLSAgICAgIDx0aGVhZD4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxwPjxzcGFuIGNsYXNzPSJjb250cm9sIj5PcHRpb248L3NwYW4+PC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8cD48c3BhbiBjbGFzcz0iY29udHJvbCI+RGVzY3JpcHRpb248L3NwYW4+PC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgCi0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9ImNvbnRyb2wiPkRlZmF1bHQ8L3NwYW4+PC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RoZWFkPgotCi0gICAgICA8dGJvZHk+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+RGVmYXVsdCBGcm9udGVuZDwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNwZWNpZmllcyB0aGUgZnJvbnQgZW5kIHRvIHVzZS4gQ3VycmVudGx5IG9ubHkgdGhlIGpheHdzIGZyb250IGVuZCBpcyBzdXBwb3J0ZWQ8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICAKLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+amF4d3M8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkRlZmF1bHQgRGF0YWJpbmRpbmc8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TcGVjaWZpZXMgdGhlIGRhdGEgYmluZGluZyB0byB1c2UuIEN1cnJlbnRseSBvbmx5IHRoZSBqYXhiIGRhdGEgYmluZGluZyBpcyBzdXBwb3J0ZWQ8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5qYXhiPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5HZW5lcmF0ZSBDbGllbnQ8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZ2VuZXJhdGUgYSBjbGllbnQgbWFpbmxpbmUgdXNpbmcgSkFYLVdTIEFQSXM8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICAKLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+ZmFsc2U8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkdlbmVyYXRlIFNlcnZlcjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBnZW5lcmF0ZSBhIHNlcnZlciBtYWlubGluZSB1c2luZyBKQVgtV1MgQVBJczwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIAotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5mYWxzZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICAKLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5HZW5lcmF0ZSBXcmFwcGVyIGFuZCBGYXVsdCBCZWFuczwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBnZW5lcmF0ZSB3cmFwcGVyIGFuZCBmYXVsdCBiZWFuczwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIAotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD50cnVlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+ICAgICAgICAKLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkdlbmVyYXRlIFdTREw8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZ2VuZXJhdGUgYSBXU0RMIGRvY3VtZW50PC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPnRydWU8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkRlZmF1bHQgU09BUCBCaW5kaW5nPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U3BlY2lmeSB0aGUgU09BUCBiaW5kaW5nIHRvIGluY2x1ZGUgaW4gdGhlIGdlbmVyYXRlZCBXU0RMIGRvY3VtZW50LiBTT0FQIDEuMSBhbmQgU09BUCAxLjIgc3VwcG9ydGVkPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U09BUCAxLjE8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkdlbmVyYXRlIHNlcGFyYXRlIFhTRCBmb3IgdGhlIHR5cGVzPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIG91dHB1dCBzY2hlbWFzIHRvIHNlcGFyYXRlIGZpbGVzIHdoZW4gZ2VuZXJhdGluZyBhIFdTREwgZG9jdW1lbnQ8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD50cnVlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgIDwvdGJvZHk+Ci0gICAgPC90YWJsZT4KLTxwPlRoZSBvcHRpb25zIG9uIHRoaXMgdGFiIGFyZSBwcmVzZW50ZWQgaW4gdGhlIHdlYiBzZXJ2aWNlcyB3aXphcmQgd2hlbiBjcmVhdGluZyBhIGJvdHRvbS11cCB3ZWIgc2VydmljZSB3aXRoIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUuPC9wPgotPHA+VGhlIG9wdGlvbnMgdGhlcmUgY2FuIGJlIGNoYW5nZWQgZnJvbSB0aGVpciBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHdlYiBzZXJ2aWNlIGJlaW5nIGNyZWF0ZWQuPC9wPgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV9ib3R0b211cC5odG1sIj5DcmVhdGUgYSBXZWIgU2VydmljZSBmcm9tIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIHVzaW5nIEFwYWNoZSBDWEY8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvamF4d3NfdGFiLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2pheHdzX3RhYi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwM2Y3NDdhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvamF4d3NfdGFiLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+SkFYLVdTIFByZWZlcmVuY2VzPC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPkpBWC1XUyBQcmVmZXJlbmNlczwvaDI+Ci08cD5UaGUgPHN0cm9uZz5KQVgtV1M8L3N0cm9uZz4gdGFiIHByb3ZpZGVzIHNldHRpbmdzIHRoYXQgY29udHJvbCB0aGUgYXV0b21hdGljIGdlbmVyYXRpb24gb2YgSkFYLVdTIGFubm90YXRpb25zIGFuZCB0aGUgZW5hYmxlbWVudCBvZiBKQVgtV1MgYW5ub3RhdGlvbiB2YWxpZGF0aW9uIHByb2Nlc3NpbmcuPC9wPgotPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL2pheHdzX2Fubm90YXRpb25zLnBuZyIgYWx0PSJKQVhXUyBBbm5vdGF0aW9ucyIgPiA8L3A+Ci08cD5TZWxlY3QgdGhlIEpBWC1XUyBhbm5vdGF0aW9ucyB0aGF0IGFyZSBhZGRlZCBieSBkZWZhdWx0IHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBiZWFuIG9yIFNFSSBiZWZvcmUgaW5wdXQgdG8gdGhlIENYRiBqYXZhMndzIHRvb2wuPC9wPgotPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL2FwdF9wcm9jZXNzaW5nLnBuZyIgYWx0PSJBUFQgUHJvY2Vzc2luZyI+IDwvcD4KLTxwPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBlbmFibGUgYW5ub3RhdGlvbiB2YWxpZGF0aW9uIHByb2Nlc3NpbmcgaW4gd2ViIHByb2plY3RzIHdoZW4gY29uZmlndXJlZCB3aXRoIHRoZSBDWEYgRmFjZXQuPC9wPgotPHA+VGhlIEpEVCBBUFQgcHJvY2Vzc29ycyByZXBvcnQgZXJyb3JzLCB3YXJuaW5ncyBhbmQgaW5mb3JtYXRpb24gbWVzc2FnZXMgaW4gdGhlIEphdmEgRWRpdG9yIGFuZCBQcm9ibGVtcyBWaWV3IHdoZW4gSkFYLVdTIHJ1bGVzIGFyZSBicm9rZW4uPC9wPgotPHA+QW5ub3RhdGlvbiBwcm9jZXNzaW5nIGNhbiBiZSBlbmFibGVkIGFuZCBkaXNhYmxlZCBvbiBhbnkgSmF2YSBiYXNlZCBwcm9qZWN0IHVzaW5nIHRoZSBBbm5vdGF0aW9uIFByb2Nlc3NpbmcgcHJvcGVydGllcyBwYWdlIG9uIHRoZSBwcm9qZWN0cyBjb250ZXh0IG1lbnUuPC9wPgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9Ii4uL3Rhc2tzL2NvbmZpZ3VyaW5nX2pheHdzX2Fubm90YXRpb25fcHJvY2Vzc2luZy5odG1sIj5FbmFibGUgSkFYLVdTIEFubm90YXRpb24gUHJvY2Vzc2luZzwvYT48YnI+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9wcmVmZXJlbmNlcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9wcmVmZXJlbmNlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3Y2VkMjg1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvcHJlZmVyZW5jZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5BcGFjaGUgQ1hGIDIueCBQcmVmZXJlbmNlczwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9saXZlaGVscC5qcyI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPkFwYWNoZSBDWEYgMi54IFByZWZlcmVuY2VzPC9oMj4KLTxwPkpBWC1XUyBUb29scyBwcm92aWRlcyBhIHByZWZlcmVuY2UgcGFnZSBmb3Igc2V0dGluZyB1cCBhbmQgY29uZmlndXJpbmcgdGhlIEFwYWNoZSBDWEYgcnVudGltZS48L3A+Ci08cD5UaGUgQ1hGIDIueCBwcmVmZXJlbmNlcyBjYW4gYmUgYWNjZXNzZWQgdmlhIAotPGEgY2xhc3M9ImNvbW1hbmQtbGluayIgaHJlZj0namF2YXNjcmlwdDpleGVjdXRlQ29tbWFuZCgib3JnLmVjbGlwc2UudWkud2luZG93LnByZWZlcmVuY2VzKHByZWZlcmVuY2VQYWdlSWQ9b3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS5DWEZSdW50aW1lUHJlZmVyZW5jZXNQYWdlKSIpJz4KLTxpbWcgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9jb21tYW5kX2xpbmsucG5nIiBhbHQ9Ik9wZW4gdGhlIENYRiAyLnggcHJlZmVyZW5jZSBwYWdlIj4KLTxzdHJvbmc+V2luZG93ICZndDsgUHJlZmVyZW5jZXMuLi4gJmd0OyBXZWIgU2VydmljZXMgJmd0OyBDWEYgMi54IFByZWZlcmVuY2VzPC9zdHJvbmc+PC9hPiBmcm9tIHRoZSB0b3AgbGV2ZWwgbWVudS4gPC9wPgotPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL2N4ZjJ4X3ByZWZlcmVuY2VzLnBuZyIgYWx0PSJDWEYgMi54IFByZWZlcmVuY2VzIiA+IDwvcD4KLTxwPlRoZSBDWEYgUnVudGltZSB0YWIgaXMgdXNlZCB0byBwb2ludCB0byB0aGUgaW5zdGFsbCBsb2NhdGlvbiBvZiBhIENYRiAyLnggcnVudGltZS48L3A+Ci08cD48aW1nIHNyYz0iLi9pbWFnZXMvY3hmX3J1bnRpbWVfdGFiLnBuZyIgYWx0PSJDWEYgMi54IFByZWZlcmVuY2VzIiA+IDwvcD4KLTxwPlRoZSA8c3Ryb25nPkV4cG9ydCBydW50aW1lIGxpYnJhcmllcy4uLjwvc3Ryb25nPiBvcHRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0IGFuZCBjb250cm9scyB3aGV0aGVyIHRoZSBDWEYgbGlicmFyeSBqYXIgZmlsZXMgYXJlIHJlc29sdmVkIGludG8gdGhlIFdFQi1JTkYvbGliIGZvbGRlciBvZiB0aGUgd2ViIG1vZHVsZSBhdCBkZXBsb3ltZW50IHRpbWUuPC9wPgotPHA+VGhpcyBvcHRpb24gY2FuIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQgb24gZXhpc3RpbmcgcHJvamVjdHMgdGhhdCBhcmUgY29uZmlndXJlZCB3aXRoIHRoZSBDWEYgRmFjZXQgdXNpbmcgdGhlIEphdmEgRUUgTW9kdWxlIERlcGVuZGVuY2llcyBwcm9wZXJ0aWVzIHBhZ2UuPC9wPgotPHA+Rm9yIGRldGFpbHMgb24gdGhlIG90aGVyIENYRiAyLnggcHJlZmVyZW5jZXMgdGFicywgcmVmZXIgdG8gdGhlIGZvbGxvd2luZyBkb2N1bWVudHM6PC9wPgotPHVsPgotICA8bGk+PGEgaHJlZj0iamF2YTJ3c190YWIuaHRtbCI+SmF2YTJXUzwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0id3NkbDJqYXZhX3RhYi5odG1sIj5XU0RMMkphdmE8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9ImpheHdzX3RhYi5odG1sIj5KQVgtV1M8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9ImVuZHBvaW50X2NvbmZpZ190YWIuaHRtbCI+RW5kcG9pbnQgQ29uZmlnPC9hPjwvbGk+Ci08L3VsPgotRm9yIGluZm9ybWF0aW9uIG9uIHNldHRpbmcgQXBhY2hlIENYRiBhcyB0aGUgZGVmYXVsdCBXZWIgc2VydmljZXMgcnVudGltZSwgcmVmZXIgdG8gdGhpcyBkb2N1bWVudC4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9InNlcnZlcl9ydW50aW1lLmh0bWwiPlNlcnZlciBhbmQgUnVudGltZTwvYT48L2xpPgotPC91bD4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iLi4vcmVmZXJlbmNlL2N4Zl9mYWNldC5odG1sIj5DWEYgUHJvamVjdCBGYWNldDwvYT48YnI+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iLi4vdGFza3MvbWFuYWdlX2N4Zl9saWJfZXhwb3J0Lmh0bWwiPk1hbmFnZSB0aGUgZXhwb3J0aW5nIG9mIENYRiBsaWJyYXJpZXMgYXQgZGVwbG95bWVudCB0aW1lPC9hPjxicj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL3NlcnZlcl9ydW50aW1lLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL3NlcnZlcl9ydW50aW1lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyMmM3MDEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9zZXJ2ZXJfcnVudGltZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiI+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPlNlcnZlciBhbmQgUnVudGltZTwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj5TZXJ2ZXIgYW5kIFJ1bnRpbWU8L2gyPgotQXBhY2hlIENYRiBjYW4gYmUgc2V0IGFzIHRoZSBkZWZhdWx0IFdlYiBzZXJ2aWNlcyBydW50aW1lIHNlbGVjdGlvbiBpbiB0aGUgV2ViIHNlcnZpY2VzIHdpemFyZHMgdXNpbmcgdGhlIFNlcnZlciBhbmQgUnVudGltZSBwcmVmZXJlbmNlIHBhZ2UuCi08cD5UaGUgU2VydmVyIGFuZCBSdW50aW1lIHByZWZlcmVuY2UgcGFnZSBjYW4gYmUgYWNjZXNzZWQgdmlhIAotPGEgY2xhc3M9ImNvbW1hbmQtbGluayIgaHJlZj0namF2YXNjcmlwdDpleGVjdXRlQ29tbWFuZCgib3JnLmVjbGlwc2UudWkud2luZG93LnByZWZlcmVuY2VzKHByZWZlcmVuY2VQYWdlSWQ9b3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnByZWZlcmVuY2VzLlNlcnZlclJ1bnRpbWVQcmVmZXJlbmNlUGFnZSkiKSc+Ci08aW1nIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvY29tbWFuZF9saW5rLnBuZyIgYWx0PSJPcGVuIHRoZSBDWEYgMi54IHByZWZlcmVuY2UgcGFnZSI+Ci08c3Ryb25nPldpbmRvdyAmZ3Q7IFByZWZlcmVuY2VzLi4uICZndDsgV2ViIFNlcnZpY2VzICZndDsgU2VydmVyIGFuZCBSdW50aW1lPC9zdHJvbmc+PC9hPiBmcm9tIHRoZSB0b3AgbGV2ZWwgbWVudS4gPC9wPgotPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL3NlcnZlcl9ydW50aW1lLnBuZyIgYWx0PSJTZXJ2ZXIgYW5kIFJ1bnRpbWUiID4gPC9wPgotPHA+U2VsZWN0IDxiPkFwYWNoZSBDWEYgMi54PC9iPiBpbiB0aGUgPGI+V2ViIHNlcnZpY2UgcnVudGltZTwvYj4gZHJvcCBkb3duIGxpc3QgYW5kIGNsaWNrIDxiPk9LPC9iPi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL3dzZGwyamF2YV90YWIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2Uvd3NkbDJqYXZhX3RhYi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZTJiNzA4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2Uvd3NkbDJqYXZhX3RhYi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5XU0RMMkphdmEgUHJlZmVyZW5jZXM8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+V1NETDJKYXZhIFByZWZlcmVuY2VzPC9oMj4KLTxwPlRoZSA8c3Ryb25nPldTREwySmF2YTwvc3Ryb25nPiB0YWIgcHJvdmlkZXMgc2V0dGluZ3MgdGhhdCBjYW4gYmUgdXNlZCB0byBjdXN0b21pemUgdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBDWEYgd3NkbDJqYXZhIHRvb2wuCi08cD48aW1nIHNyYz0iLi9pbWFnZXMvd3NkbDJqYXZhLnBuZyIgYWx0PSJKYXZhMldTIHRhYiIgPiA8L3A+Ci08cD48L3A+Ci0gICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI1IiBzdW1tYXJ5PSJKYXZhIHNlYXJjaCBhY3Rpb25zIj4KLSAgICAgIDx0aGVhZD4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxwPjxzcGFuIGNsYXNzPSJjb250cm9sIj5PcHRpb248L3NwYW4+PC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8cD48c3BhbiBjbGFzcz0iY29udHJvbCI+RGVzY3JpcHRpb248L3NwYW4+PC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8cD48c3BhbiBjbGFzcz0iY29udHJvbCI+RGVmYXVsdDwvc3Bhbj48L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGhlYWQ+Ci0KLSAgICAgIDx0Ym9keT4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5HZW5lcmF0ZSBTZXJ2ZXI8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZ2VuZXJhdGUgc3RhcnRpbmcgcG9pbnQgY29kZSBmb3IgYSBzZXJ2ZXIgbWFpbmxpbmU8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5mYWxzZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+R2VuZXJhdGUgSW1wbGVtZW50YXRpb248L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZ2VuZXJhdGUgc3RhcnRpbmcgcG9pbnQgY29kZSBmb3IgYW4gaW1wbGVtZW50YXRpb24gYmVhbjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPnRydWU8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkdlbmVyYXRlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgZ2VuZXJhdGVkIGFydGlmYWN0czwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBnZW5lcmF0ZSBkZWZhdWx0IHZhbHVlcyBmb3IgYSBnZW5lcmF0ZWQgY2xpZW50IGFuZCBpbXBsZW1lbnRhdGlvbjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPnRydWU8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkVuYWJsZSBwcm9jZXNzaW5nIG9mIGltcGxpY2l0IFNPQVAgaGVhZGVyczwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBlbmFibGUgdGhlIHByb2Nlc3Npbmcgb2Ygb2YgU09BUCBoZWFkZXJzIGRlZmluZWQgaW4gdGhlIHdzZGw6YmluZGluZzwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmZhbHNlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIAotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkVuYWJsZSBsb2FkaW5nIG9mIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBwYWNrYWdlIG5hbWUgbWFwcGluZzwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBlbmFibGUgdGhlIGxvYWRpbmcgb2YgdGhlIGRlZmF1bHQgbmFtZXBzYWNlIHBhY2thZ2UgbmFtZSBtYXBwaW5nPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+dHJ1ZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPiAgICAgICAgCi0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5FbmFibGUgdGhlIHVzZSBvZiB0aGUgZGVmYXVsdCBleGNsdWRlcyBuYW1lc3BhY2UgbWFwcGluZzwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBlbmFibGUgdGhlIGxvYWRpbmcgb2YgdGhlIGRlZmF1bHQgZXhjbHVkZXMgbmFtZXNwYWNlIG1hcHBpbmc8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD50cnVlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5FbmFibGUgQXV0byBOYW1lIFJlc29sdXRpb248L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gYXV0b21hdGljYWxseSByZXNvbHZlIG5hbWluZyBjb25mbGljdHMgd2l0aG91dCByZXF1aXJpbmcgdGhlIHVzZSBvZiBiaW5kaW5nIGN1c3RvbWl6YXRpb25zPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+ZmFsc2U8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlVzZSB0aGUgQXBhY2hlIENYRiBwcm9wcmlldGFyeSBXUy1BZGRyZXNzaW5nIHR5cGU8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZ2VuZXJhdGUgdGhlIG9sZGVyIENYRiBwcm9wcmlldGFyeSBXUy1BZGRyZXNzaW5nIHR5cGVzIGluc3RlYWQgb2YgdGhlIEpBWC1XUyAyLjEgY29tcGxpYW50IFdTLUFkZHJlc3NpbmcgdHlwZXMuIFVzZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBDWEYgMi4wPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+ZmFsc2U8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGJvZHk+Ci0gICAgPC90YWJsZT4KLQotPHA+VGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBwYXNzZWQgdG8gdGhlIFhKQyBwcm9jZXNzb3IuPC9wPgotPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL3hqYy5wbmciIGFsdD0iSmF2YTJXUyB0YWIiID4gPC9wPgotPHA+PC9wPgotICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgc3VtbWFyeT0iSmF2YSBzZWFyY2ggYWN0aW9ucyI+Ci0gICAgICA8dGhlYWQ+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8cD48c3BhbiBjbGFzcz0iY29udHJvbCI+T3B0aW9uPC9zcGFuPjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9ImNvbnRyb2wiPkRlc2NyaXB0aW9uPC9zcGFuPjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9ImNvbnRyb2wiPkRlZmF1bHQ8L3NwYW4+PC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RoZWFkPgotCi0gICAgICA8dGJvZHk+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+LVhkdjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBpbml0aWFsaXplIGZpZWxkcyBtYXBwZWQgZnJvbSBlbGVtZW50cyB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWVzPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+ZmFsc2U8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPi1YdHM8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gYWN0aXZhdGUgcGx1Z2luIHRvIGFkZCBhIHRvU3RyaW5nKCkgbWV0aG9kIHRvIGdlbmVyYXRlZCBjbGFzc2VzPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+ZmFsc2U8L3A+Ci0gICAgICAgICAgPC90ZD4gICAgICAgICAKLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPi1YdHM6c3R5bGU6bXVsdGlsaW5lPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGhhdmUgdG9TdHJpbmcgcHJvZHVjZSBtdWx0aSBsaW5lIG91dHB1dDwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmZhbHNlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD4tWHRzOnN0eWxlOnNpbXBsZTwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBoYXZlIHRvU3RyaW5nIHByb2R1Y2Ugc2luZ2xlIGxpbmUgdGVyc2Ugb3V0cHV0PC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+ZmFsc2U8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+LVhsb2NhdG9yPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGVuYWJsZSBzb3VyY2UgbG9jYXRpb24gc3VwcG9ydCBmb3IgZ2VuZXJhdGVkIGNvZGU8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5mYWxzZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPiAgICAgICAgCi0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD4tWHN5bmMtbWV0aG9kczwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBnZW5lcmF0ZSBhY2Nlc3NvciBtZXRob2RzIHdpdGggdGhlICdzeW5jaHJvbml6ZWQnIGtleXdvcmQ8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5mYWxzZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+LW1hcmstZ2VuZXJhdGVkPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGFkZCBAR2VuZXJhdGVkIGFubm90YXRpb25zIHRvIHRoZSBnZW5lcmF0ZWQgY29kZTwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmZhbHNlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgIDwvdGJvZHk+Ci0gICAgPC90YWJsZT4KLQotPHA+VGhlIG9wdGlvbnMgb24gdGhpcyB0YWIgYXJlIHByZXNlbnRlZCBpbiB0aGUgd2ViIHNlcnZpY2VzIHdpemFyZCB3aGVuIGNyZWF0aW5nIGEgdG9wLWRvd24gd2ViIHNlcnZpY2Ugd2l0aCB0aGUgQXBhY2hlIENYRiBydW50aW1lLjwvcD4KLTxwPlRoZSBvcHRpb25zIHRoZXJlIGNhbiBiZSBjaGFuZ2VkIGZyb20gdGhlaXIgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSB3ZWIgc2VydmljZSBiZWluZyBjcmVhdGVkLjwvcD4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSIuLi90YXNrcy9jcmVhdGVfdG9wZG93bi5odG1sIj5HZW5lcmF0ZSBhbiBTRUkgYW5kIGEgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGPC9hPjxicj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvY29uZmlndXJpbmdfamF4d3NfYW5ub3RhdGlvbl9wcm9jZXNzaW5nLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvY29uZmlndXJpbmdfamF4d3NfYW5ub3RhdGlvbl9wcm9jZXNzaW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkZTg5ZjIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NvbmZpZ3VyaW5nX2pheHdzX2Fubm90YXRpb25fcHJvY2Vzc2luZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+Q29uZmlndXJpbmcgSkFYLVdTIEFubm90YXRpb24gUHJvY2Vzc2luZzwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj5FbmFibGUgSkFYLVdTIEFubm90YXRpb24gUHJvY2Vzc2luZzwvaDI+Ci08cD5JZiB0aGUgPHN0cm9uZz5FbmFibGUgYW5ub3RhdGlvbiB2YWxpZGF0aW9uIHByb2Nlc3Npbmc8L3N0cm9uZz4gc2V0dGluZyBvbiB0aGUgPGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2pheHdzX3RhYi5odG1sIj5KQVgtV1M8L2E+IHRhYiBpbgotdGhlIEFwYWNoZSBDWEYgMi54IHByZWZlcmVuY2VzIGlzIHNlbGVjdGVkLCBhbm5vdGF0aW9uIHByb2Nlc3Npbmcgd2lsbCBiZSBlbmFibGVkIG9uIHByb2plY3RzIG9uIGFzIHBhcnQgb2YgdGhlIENYRiBGYWNldCBpbnN0YWxsLjwvcD4KLQotPGgzPkVuYWJsaW5nIEV4aXN0aW5nIFByb2plY3RzPC9oMz4KLVRvIHR1cm4gYW5ub3RhdGlvbiBwcm9jZXNzaW5nIG9uIG9yIG9mZiBvbiBhbiBleGlzdGluZyBwcm9qZWN0IHJpZ2h0LWNsaWNrIG9uIHRoZSBwcm9qZWN0IGFuZCBjaG9vc2UgPGI+UHJvcGVydGllczwvYj4gZnJvbSB0aGUgY29udGV4dCBtZW51LiAKLSBPbiB0aGUgPHN0cm9uZz5KYXZhIENvbXBpbGVyID4gQW5ub3RhdGlvbiBQcm9jZXNzaW5nPC9zdHJvbmc+IHByb3BlcnRpZXMgcGFnZSBzZWxlY3Qgb3IgZGVzZWxlY3QgdGhlIDxzdHJvbmc+RW5hYmxlIEFubm90YXRpb24gUHJvY2Vzc2luZzwvc3Ryb25nPiBjaGVjayBib3ggYW5kIHRoZW4gY2xpY2sgPGI+T0s8L2I+LgotPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL2Fubm90YXRpb25fcHJvY2Vzc2luZy5wbmciIGFsdD0iQW5ub3RhdGlvbiBQcm9jZXNzaW5nIiA+IDwvcD4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2N4Zl9mYWNldC5odG1sIj5DWEYgUHJvamVjdCBGYWNldDwvYT48YnI+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV9ib3R0b211cC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV9ib3R0b211cC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZmIzZTE1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfYm90dG9tdXAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+Q3JlYXRlIGEgV2ViIFNlcnZpY2UgZnJvbSBhIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiB1c2luZyBBcGFjaGUgQ1hGPC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2xpdmVoZWxwLmpzIj48L3NjcmlwdD4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+Q3JlYXRlIGEgV2ViIFNlcnZpY2UgZnJvbSBhIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiB1c2luZyBBcGFjaGUgQ1hGPC9oMj4KLTxoMz5QcmVyZXF1aXNpdGVzOjwvaDM+Ci08b2w+Ci08bGk+SW5zdGFsbCBhbmQgY29uZmlndXJlIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgZW52aXJvbm1lbnQuIFNlZSB0aGUgPGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9nZXR0aW5nc3RhcnRlZC9yZXF1aXJlbWVudHMuaHRtbCI+UmVxdWlyZW1lbnRzIGFuZCBJbnN0YWxsYXRpb248L2E+IHBhZ2UgZm9yIG1vcmUgZGV0YWlscy48L2xpPgotPGxpPkNyZWF0ZSBhIER5bmFtaWMgV2ViIFByb2plY3QgYW5kIGVuYWJsZSBpdCBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQgYXMgZGVzY3JpYmVkIGhlcmU6IDxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV9jeGZfcHJvamVjdC5odG1sIj5DcmVhdGUgYSBwcm9qZWN0IGZvciBDWEYgV2ViIHNlcnZpY2VzPC9hPi48L2xpPgotPGxpPkNyZWF0ZSBvciBpbXBvcnQgYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gaW50byB0aGUgc291cmNlIGZvbGRlciBvZiB0aGUgRHluYW1pYyBXZWIgUHJvamVjdC48L2xpPgotPC9vbD4KLVRvIGNyZWF0ZSBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGJlYW4gdXNpbmcgdGhlIEFwYWNoZSBDWEYgcnVudGltZSBlbnZpcm9ubWVudDoKLTxvbD4KLTxsaT5TZWxlY3QgPGEgY2xhc3M9ImNvbW1hbmQtbGluayIgaHJlZj0namF2YXNjcmlwdDpleGVjdXRlQ29tbWFuZCgib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzLnNob3dQZXJzcGVjdGl2ZShvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMuc2hvd1BlcnNwZWN0aXZlLnBlcnNwZWN0aXZlSWQ9b3JnLmVjbGlwc2UuanN0LmoyZWUuSjJFRVBlcnNwZWN0aXZlKSIpJz4KLQk8aW1nIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvY29tbWFuZF9saW5rLnBuZyIgYWx0PSJPcGVuIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlIj48c3Ryb25nPldpbmRvdyAmZ3Q7IE9wZW4gUGVyc3BlY3RpdmUgJmd0OyBKYXZhIEVFPC9zdHJvbmc+PC9hPiBmcm9tIHRoZSB0b3AgbGV2ZWwgbWVudSB0byBzd2l0Y2ggdG8gdGhlIEphdmEgRUUgcGVyc3BlY3RpdmUuPC9saT4KLTxsaT5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3IHNlbGVjdCB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIHRoYXQgeW91IGNyZWF0ZWQgb3IgaW1wb3J0ZWQgaW50byB0aGUgRHluYW1pYyBXZWIgUHJvamVjdHMgc291cmNlIGZvbGRlci48L2xpPgotPGxpPk9wZW4gdGhlIFdlYiBTZXJ2aWNlIHdpemFyZCBieSBzZWxlY3RpbmcgPGEgY2xhc3M9ImNvbW1hbmQtbGluayIgaHJlZj0namF2YXNjcmlwdDpleGVjdXRlQ29tbWFuZCgib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkKG5ld1dpemFyZElkPW9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkKSIpJz4KLTxpbWcgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9jb21tYW5kX2xpbmsucG5nIiBhbHQ9Ik9wZW4gdGhlIG5ldyB3ZWIgc2VydmljZSB3aXphcmQiPjxzdHJvbmc+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyLi4uICZndDsgV2ViIFNlcnZpY2VzICZndDsgV2ViIFNlcnZpY2U8L3N0cm9uZz48L2E+IGZyb20gdGhlIHRvcCBsZXZlbCBtZW51LjwvbGk+Ci08bGk+V2ViIFNlcnZpY2VzIHBhZ2U6IHNlbGVjdCA8Yj5Cb3R0b20gdXAgSmF2YSBiZWFuIFdlYiBTZXJ2aWNlPC9iPiBhcyB0aGUgV2ViIHNlcnZpY2UgdHlwZSBhbmQgYnJvd3NlIHRvIHNlbGVjdCB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gd2hpY2ggdG8gY3JlYXRlIHRoZSBXZWIgc2VydmljZTo8cD48aW1nIHNyYz0iLi9pbWFnZXMvYm90dG9tX3VwX3dpemFyZC5wbmciIGFsdD0iQm90dG9tIFVwIFdlYiBTZXJ2aWNlcyBXaXphcmQiID48L3A+Ci08b2wgdHlwZT0iYSI+Ci08bGk+TW92ZSB0aGUgc2VydmljZSBzbGlkZXIgdG8gdGhlIHN0YWdlIG9mIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCB0aGF0IHlvdSB3aXNoIHRvIGNvbXBsZXRlLjwvbGk+Ci08dWw+Ci08bGk+RGV2ZWxvcDogSW52b2tlcyB0aGUgQXBhY2hlIENYRiBqYXZhMndzIHRvb2wgdXNpbmcgdGhlIHByZWZlcmVuY2UgZGVmYXVsdHMgYW5kIHRoZSBpbmZvcm1hdGlvbiBnYXRoZXJlZCBpbiB0aGUgd2l6YXJkIHRvIGNyZWF0ZSBhIHNlcnZpY2UuIFRoZSB3aXphcmQgYWxzbyBnZW5lcmF0ZXMgYSBKQVgtV1MgZW5kcG9pbnQgY29uZmlndXJhdGlvbiBmaWxlLjwvbGk+Ci08bGk+QXNzZW1ibGU6IElmIHJlcXVpcmVkIGJ5IHRoZSB0YXJnZXQgc2VydmVyIHRoaXMgcGhhc2UgYXNzZW1ibGVzIGFuZCBjb25maWd1cmVzIHRoZSBwcm9qZWN0IHRoYXQgaG9zdHMgdGhlIFdlYiBzZXJ2aWNlIGludG8gYW4gRUFSLjwvbGk+Ci08bGk+RGVwbG95OiBHZW5lcmF0ZXMgdGhlIGRlcGxveW1lbnQgYXJ0aWZhY3RzIGZvciB0aGUgV2ViIHNlcnZpY2UuPC9saT4KLTxsaT5JbnN0YWxsOiBJbnN0YWxscyBhbmQgY29uZmlndXJlcyB0aGUgV2ViIE1vZHVsZSBhbmQgRUFScyBvbiB0aGUgdGFyZ2V0IHNlcnZlci48L2xpPgotPGxpPlN0YXJ0OiBTdGFydHMgdGhlIHRhcmdldCBzZXJ2ZXIgb25jZSB0aGUgV2ViIHNlcnZpY2UgaGFzIGJlZW4gaW5zdGFsbGVkIG9uIGl0LjwvbGk+Ci08bGk+VGVzdDogVXNlIHRoZSBXZWIgU2VydmljZSBFeHBsb3JlciB0byB0ZXN0IHRoZSBnZW5lcmF0ZWQgV2ViIHNlcnZpY2UuPC9saT4KLTwvdWw+Ci08bGk+U2VydmVyOiBTZWxlY3QgYSBzZXJ2ZXIgdG8gZGVwbG95IHlvdXIgV2ViIHNlcnZpY2UgdG8uPC9saT4KLTxsaT5XZWIgc2VydmljZSBydW50aW1lOiBTZWxlY3QgQXBhY2hlIENYRiAyLng8L2xpPgotPGxpPlNlcnZpY2UgcHJvamVjdDogU2VsZWN0IHRoZSBwcm9qZWN0IGluIHlvdXIgd29ya3NwYWNlIGludG8gd2hpY2ggQXBhY2hlIENYRiB3aWxsIGdlbmVyYXRlIHRoZSBjb2RlLjwvbGk+Ci08bGk+SWYgeW91IHdpc2ggdG8gZ2VuZXJhdGUgYSBjbGllbnQgZm9yIHlvdXIgV2ViIHNlcnZpY2UsIHNlbGVjdCA8Yj5KYXZhIFByb3h5PC9iPiBhcyB0aGUgQ2xpZW50IHR5cGU6Ci08dWw+Ci08bGk+TW92ZSB0aGUgY2xpZW50IHNsaWRlciB0byB0aGUgPGI+RGV2ZWxvcCBjbGllbnQ8L2I+IHN0YWdlLjwvbGk+Ci08bGk+Q2xpZW50IHByb2plY3Q6IFNlbGVjdCBhIGRpZmZlcmVudCBwcm9qZWN0IGludG8gd2hpY2ggdG8gZ2VuZXJhdGUgdGhlIGNsaWVudCBjb2RlLiBUaGUgd2l6YXJkIHdpbGwgY3JlYXRlIHRoZSBwcm9qZWN0IGZvciB5b3UgaWYgaXQgZG9lc24ndCBleGlzdCBhbmQgY29uZmlndXJlIGl0IHdpdGggdGhlIENYRiBGYWNldC48L2xpPgotPC91bD48L2xpPgotPGxpPlB1Ymxpc2ggdGhlIFdlYiBzZXJ2aWNlOiBMYXVuY2ggdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlciB0byBwdWJsaXNoIHlvdXIgV2ViIHNlcnZpY2UgdG8gYSBVRERJIHJlZ2lzdHJ5LjwvbGk+Ci08bGk+TW9uaXRvciB0aGUgV2ViIHNlcnZpY2U6IE1vbml0b3IgdGhlIFdlYiBzZXJ2aWNlJ3MgU09BUCB0cmFmZmljIHVzaW5nIHRoZSBUQ1AvSVAgTW9uaXRvci48L2xpPgotPC9vbD48L2xpPgotPGxpPkNsaWNrIDxiPk5leHQgJmd0OzwvYj4gdG8gbW92ZSB0byB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgY29uZmlndXJhdGlvbiBwYWdlOgotPG9sPgotPGxpPlVzZSBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlOiBTZWxlY3Qgb3IgY3JlYXRlIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgKFNFSSkgdGhhdCBkZWZpbmVzIHRoZSBtZXRob2RzIHlvdSB3aXNoIHRvIGV4cG9zZSBpbiB0aGUgc2VydmljZS4gVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgYXBwcm9hY2guIAotPHVsPgotPGxpPlNlbGVjdCBhbiBTRUk6IEJyb3dzZSB0byBzZWxlY3QgYW4gZXhpc3RpbmcgU0VJLjwvbGk+Ci08bGk+Q3JlYXRlIGFuIFNFSTogQ3JlYXRlIGFuIEludGVyZmFjZSBmcm9tIHRoZSBJbXBsZW1lbnRhdGlvbiBieSBwcm92aWRpbmcgYSBuYW1lIGFuZCB0aGUgbWV0aG9kcyB0byBkZWNsYXJlIGluIHRoZSBleHRyYWN0ZWQgaW50ZXJmYWNlLjwvbGk+Ci08L3VsPgotQm90aCBvcHRpb25zIGNyZWF0ZSBvciB1cGRhdGUgdGhlIDxpPkBXZWJTZXJ2aWNlLmVuZHBvaW50SW50ZXJmYWNlPC9pPiBlbGVtZW50IG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBiZWFuLiAKLTwvb2w+Ci08L2xpPgotPGxpPkNsaWNrIDxiPk5leHQgJmd0OzwvYj4gdG8gbW92ZSB0byB0aGUgSkFYLVdTIGFubm90YXRpb25zIGNvbmZpZ3VyYXRpb24gcGFnZToKLTxwPlRoaXMgcGFnZSBhbGxvd3MgeW91IGFkZCB0byBKQVgtV1MgYW5ub3RhdGlvbnMgdG8gdGhlIFNFSSBvciBJbXBsZW1lbnRhdGlvbiAoaWYgbm90IHVzaW5nIGFuIGV4cGxpY2l0IFNFSSkuPC9wPgotPHA+VGhlIEpBWC1XUyBhbm5vdGF0aW9ucyBlbGVtZW50IHZhbHVlcyBkZWZhdWx0IHRvIHRob3NlIG91dGxpbmVkIGluIHRoZSBKQVgtV1Mgc3BlY2lmaWNhdGlvbnMuPC9wPgotPHA+SWYgdGhlIEltcGxlbWVudGF0aW9uIGJlYW4gLyBTRUkgY29udGFpbnMgb3ZlcmxvYWRlZCBtZXRob2RzIHRoZSBKQVgtV1MgYW5ub3RhdGlvbnMgYWRkZWQgb24gdGhpcyBwYWdlIGFkanVzdCB0byByZXNvbHZlIHRob3NlIGNvbmZsaWN0cy48L3A+PC9saT4KLTxsaT5DbGljayA8Yj5OZXh0ICZndDs8L2I+IHRvIG1vdmUgdG8gdGhlIEFwYWNoZSBDWEYgamF2YTJ3cyBjb25maWd1cmF0aW9uIHBhZ2Ugd2hpY2ggYWxsb3dzIHlvdSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCA8YSBocmVmPSIuLi9yZWZlcmVuY2UvamF2YTJ3c190YWIuaHRtbCI+amF2YTJ3czwvYT4gcHJlZmVyZW5jZXM6Ci08L2xpPgotCTxsaT5UZXN0IFdlYiBTZXJ2aWNlIHBhZ2UuIFRoaXMgcGFnZSB3aWxsIGJlIGRpc3BsYXllZCBpZiB0aGUgc2VydmljZSBzbGlkZXIgb24gdGhlIGZpcnN0IHBhZ2Ugd2FzIHNldCB0byBUZXN0IHNlcnZpY2UuCi0JPHA+U2VsZWN0IHRoZSBsYXVuY2ggYnV0dG9uIHRvIHRlc3QgdGhlIFdlYiBTZXJ2aWNlIHdpdGggdGhlIDxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuZG9jLnVzZXIvdGFza3MvdHRlc3R3c2RsLmh0bWwiPldlYiBTZXJ2aWNlcyBFeHBsb3JlcjwvYT4uPC9wPgotCTwvbGk+Ci0JPGxpPkFwYWNoZSBDWEYgSkFYLVdTIGNsaWVudCBjb25maWd1cmF0aW9uIHBhZ2U6IFRoaXMgcGFnZSB3aWxsIGJlIGRpc3BsYXllZCBpZiB0aGUgY2xpZW50IHNsaWRlciBvbiB0aGUgV2ViIHNlcnZpY2VzIHBhZ2Ugd2FzIHNldCB0byA8Yj5EZXZlbG9wIGNsaWVudDwvYj4uCi0JPHA+UmVmZXIgdG8gdGhlIDxhIGhyZWY9Ii4vY3JlYXRlX2NsaWVudC5odG1sIj5HZW5lcmF0ZSBhIEpBWC1XUyBXZWIgU2VydmljZSBDbGllbnQ8L2E+IHBhZ2UgZm9yIGluZm9ybWF0aW9uIG9uIHRoZSBvcHRpb25zIGRpc3BsYXllZCBvbiB0aGlzIHBhZ2UuPC9wPgotCTwvbGk+Ci0JPGxpPldlYiBTZXJ2aWNlIFB1YmxpY2F0aW9uIFBhZ2U6IFNlbGVjdCB3aGV0aGVyIG9yIG5vdCB5b3Ugd2FudCB0byBwdWJsaXNoIHRoaXMgV2ViIHNlcnZpY2UgdG8gYSBVRERJIHJlZ2lzdHJ5LiBDbGljayA8Yj5GaW5pc2g8L2I+PC9saT4KLTwvb2w+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iLi4vdGFza3MvY3JlYXRlX3RvcGRvd24uaHRtbCI+R2VuZXJhdGUgYW4gU0VJIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRjwvYT48YnI+Ci08YSBocmVmPSIuLi90YXNrcy9jcmVhdGVfY2xpZW50Lmh0bWwiPkdlbmVyYXRlIGEgSkFYLVdTIFdlYiBTZXJ2aWNlIENsaWVudCBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGPC9hPjxicj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvY3JlYXRlX2NsaWVudC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV9jbGllbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTFmNTYwNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvY3JlYXRlX2NsaWVudC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5HZW5lcmF0ZSBhIEpBWC1XUyBXZWIgU2VydmljZSBDbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRjwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9saXZlaGVscC5qcyI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPkdlbmVyYXRlIGEgSkFYLVdTIFdlYiBTZXJ2aWNlIENsaWVudCBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGPC9oMj4KLTxoMz5QcmVyZXF1aXNpdGVzOjwvaDM+Ci08b2w+Ci0gICAgPGxpPkluc3RhbGwgYW5kIGNvbmZpZ3VyZSB0aGUgQXBhY2hlIENYRiBydW50aW1lIGVudmlyb25tZW50LiBTZWUgdGhlIDxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvZ2V0dGluZ3N0YXJ0ZWQvcmVxdWlyZW1lbnRzLmh0bWwiPlJlcXVpcmVtZW50cyBhbmQgSW5zdGFsbGF0aW9uPC9hPiBwYWdlIGZvciBtb3JlIGRldGFpbHMuPC9saT4KLSAgICA8bGk+Q3JlYXRlIGEgRHluYW1pYyBXZWIgUHJvamVjdCBhbmQgZW5hYmxlIGl0IGZvciBBcGFjaGUgQ1hGIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCBhcyBkZXNjcmliZWQgaGVyZTogPGEgaHJlZj0iLi4vdGFza3MvY3JlYXRlX2N4Zl9wcm9qZWN0Lmh0bWwiPkNyZWF0ZSBhIHByb2plY3QgZm9yIENYRiBXZWIgc2VydmljZXM8L2E+LjwvbGk+Ci08L29sPgotVG8gZ2VuZXJhdGUgYSBKQVgtV1MgY2xpZW50IGZyb20gYSBXU0RMIGRvY3VtZW50OgotPG9sPgotCTxsaT5TZWxlY3QgPGEgY2xhc3M9ImNvbW1hbmQtbGluayIKLQkJaHJlZj0namF2YXNjcmlwdDpleGVjdXRlQ29tbWFuZCgib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzLnNob3dQZXJzcGVjdGl2ZShvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMuc2hvd1BlcnNwZWN0aXZlLnBlcnNwZWN0aXZlSWQ9b3JnLmVjbGlwc2UuanN0LmoyZWUuSjJFRVBlcnNwZWN0aXZlKSIpJz4KLQk8aW1nIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvY29tbWFuZF9saW5rLnBuZyIgYWx0PSJPcGVuIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlIj48c3Ryb25nPldpbmRvdyAmZ3Q7IE9wZW4gUGVyc3BlY3RpdmUgJmd0OyBKYXZhIEVFPC9zdHJvbmc+PC9hPiBmcm9tIHRoZSB0b3AgbGV2ZWwgbWVudSB0byBzd2l0Y2ggdG8gdGhlIEphdmEgRUUgcGVyc3BlY3RpdmUuPC9saT4KLQk8bGk+T3BlbiB0aGUgV2ViIFNlcnZpY2UgQ2xpZW50IGJ5IHNlbGVjdGluZyA8YSBjbGFzcz0iY29tbWFuZC1saW5rIiBocmVmPSdqYXZhc2NyaXB0OmV4ZWN1dGVDb21tYW5kKCJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmQobmV3V2l6YXJkSWQ9b3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkKSIpJz4KLQk8aW1nIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvY29tbWFuZF9saW5rLnBuZyIgYWx0PSJPcGVuIHRoZSBuZXcgd2ViIHNlcnZpY2UgY2xpZW50IHdpemFyZCI+PHN0cm9uZz5GaWxlCi0JJmd0OyBOZXcgJmd0OyBPdGhlci4uLiAmZ3Q7IFdlYiBTZXJ2aWNlcyAmZ3Q7IFdlYiBTZXJ2aWNlIENsaWVudDwvc3Ryb25nPjwvYT4gZnJvbSB0aGUgdG9wIGxldmVsIG1lbnUuPC9saT4KLQk8bGk+V2ViIFNlcnZpY2VzIHBhZ2U6Ci0JPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL3dzX2NsaWVudF93aXphcmQucG5nIiBhbHQ9IldlYiBTZXJ2aWNlcyBDbGllbnQgV2l6YXJkIj48L3A+Ci0JPG9sIHR5cGU9ImEiPgotCSAgICA8TGk+RW50ZXIgdGhlIFVSSSB0byB0aGUgcmVtb3RlIFdTREwgZmlsZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY2xpZW50LjwvTGk+Ci0JCTxsaT5TZWxlY3QgPGI+SmF2YSBQcm94eTwvYj4gYXMgdGhlIENsaWVudCB0eXBlLjwvbGk+Ci0JCTxsaT5Nb3ZlIHRoZSBjbGllbnQgc2xpZGVyIHRvIHRoZSA8Yj5EZXZlbG9wIGNsaWVudDwvYj4gc3RhZ2UuPC9saT4KLQkJPGxpPldlYiBzZXJ2aWNlIHJ1bnRpbWU6IFNlbGVjdCBBcGFjaGUgQ1hGIDIueDwvbGk+Ci0JCTxsaT5TZXJ2aWNlIHByb2plY3Q6IFNlbGVjdCB0aGUgcHJvamVjdCBpbiB5b3VyIHdvcmtzcGFjZSBpbnRvIHdoaWNoIEFwYWNoZSBDWEYgd2lsbCBnZW5lcmF0ZSB0aGUgY29kZS48L2xpPgotCTwvb2w+Ci0JPC9saT4KLQk8bGk+Q2xpY2sgPGI+TmV4dCAmZ3Q7PC9iPiB0byBtb3ZlIHRvIHRoZSBmaXJzdCBBcGFjaGUgQ1hGIHdzZGwyamF2YSBDb25maWd1cmF0aW9uIHBhZ2U6Ci0JPG9sPgotCQk8bGk+T3V0cHV0IERpcmVjdG9yeTogU3BlY2lmeSB0aGUgc291cmNlIGZvbGRlciBpbiB0aGUgc2VydmljZSBwcm9qZWN0IGludG8gd2hpY2ggdGhlIGNvZGUgaXMgZ2VuZXJhdGVkLjwvbGk+Ci0JCTxsaT5QYWNrYWdlIE5hbWU6IFR5cGUgdGhlIEphdmEgcGFja2FnZSBuYW1lIHRvIHVzZSBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlLjwvbGk+Ci0JCTxsaT5TcGVjaWZ5IFdTREwgTmFtZXNwYWNlIHRvIFBhY2thZ2UgTmFtZSBNYXBwaW5nczogT3B0aW9uYWxseSBzcGVjaWZ5IFdTREwgbmFtZXNwYWNlIG1hcHBpbmdzIHRvIEphdmEgcGFja2FnZSBuYW1lcy48L2xpPgotCQk8bGk+U2VydmljZSBOYW1lOiBTcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBXU0RMIHNlcnZpY2UgZnJvbSB3aGljaCB0byBnZW5lcmF0ZSBjb2RlLiBUaGUgZGVmYXVsdCBpcyB0byBnZW5lcmF0ZSBjb2RlIGZvciBldmVyeSBzZXJ2aWNlIGluIHRoZSBXU0RMIGRvY3VtZW50LjwvbGk+Ci0JCTxsaT5CaW5kaW5nIEZpbGVzOiBTcGVjaWZ5IG9uZSBvciBtb3JlIEpBWC1XUyBvciBKQVhCIGJpbmRpbmcgZmlsZXMuPC9saT4KLQk8L29sPgotCTwvbGk+Ci0JPGxpPkNsaWNrIDxiPk5leHQgJmd0OzwvYj4gdG8gbW92ZSB0byB0aGUgc2Vjb25kIEFwYWNoZSBDWEYgd3NkbDJqYXZhIGNvbmZpZ3VyYXRpb24gcGFnZSB3aGljaCBhbGxvd3MgeW91IHRvIG92ZXJyaWRlIHRoZSA8YSBocmVmPSIuLi9yZWZlcmVuY2Uvd3NkbDJqYXZhX3RhYi5odG1sIj53c2RsMmphdmE8L2E+IGRlZmF1bHQgcHJlZmVyZW5jZXM6Ci0JPC9saT4KLQk8bGk+Q2xpY2sgPGI+RmluaXNoPC9iPiB0byBnZW5lcmF0ZSB0aGUgY2xpZW50LjwvbGk+Ci08L29sPgotPHA+VGhlIGdlbmVyYXRlZCBjbGllbnQgd2lsbCBpbmNsdWRlIGEgbWFpbigpIHRoYXQgd2hlbiBydW4gd2lsbCBjb25uZWN0IHRvIHRoZSByZW1vdGUgc2VydmljZSBhbmQgaW52b2tlIGV2ZXJ5IG9wZXJhdGlvbiBvbiB0aGF0IHJlbW90ZSBzZXJ2aWNlLjwvcD4KLTxwPkJlZm9yZSBydW5uaW5nIHRoZSBjbGllbnQgb3BlbiB0aGUgY2xpZW50IGluIHRoZSBKYXZhIEVkaXRvciBhbmQgZWRpdCB0aGUgZ2VuZXJhdGVkIGFyZ3VtZW50cyB1c2VkIHRvIGludm9rZSB0aGUgb3BlcmF0aW9ucyBvbiB0aGUgc2VydmljZS48L3A+Ci08cD5UbyA8Yj5ydW48L2I+IHRoZSBjbGllbnQgcmlnaHQtY2xpY2sgb24gdGhlIGNsaWVudCBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciBhbmQgc2VsZWN0IDxiPlJ1biBBcyA+IEphdmEgQXBwbGljYXRpb248L2I+LgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV9ib3R0b211cC5odG1sIj5DcmVhdGUgYSBXZWIgU2VydmljZSBmcm9tIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIHVzaW5nIEFwYWNoZSBDWEY8L2E+PGJyPgotPGEgaHJlZj0iLi4vdGFza3MvY3JlYXRlX3RvcGRvd24uaHRtbCI+R2VuZXJhdGUgYW4gU0VJIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRjwvYT48YnI+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV9jeGZfcHJvamVjdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV9jeGZfcHJvamVjdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MDg3MGEzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfY3hmX3Byb2plY3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5DcmVhdGUgYSBwcm9qZWN0IGZvciBDWEYgV2ViIHNlcnZpY2VzPC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci0JPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2xpdmVoZWxwLmpzIj48L3NjcmlwdD4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+Q3JlYXRlIGEgcHJvamVjdCBmb3IgQ1hGIFdlYiBzZXJ2aWNlczwvaDI+Ci08cD5UbyBjcmVhdGUgYSBEeW5hbWljIFdlYiBQcm9qZWN0IGFuZCBlbmFibGUgaXQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BtZW50IHBlcmZvcm0gdGhlIGZvbGxvd2luZyBzdGVwczo8YnIvPgotPG9sPgotPGxpPgotU2VsZWN0IDxhIGNsYXNzPSJjb21tYW5kLWxpbmsiIGhyZWY9J2phdmFzY3JpcHQ6ZXhlY3V0ZUNvbW1hbmQoIm9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZChuZXdXaXphcmRJZD1vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wcm9qZWN0LmZhY2V0LldlYlByb2plY3RXaXphcmQpIiknPgotPGltZyBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2NvbW1hbmRfbGluay5wbmciIGFsdD0iT3BlbiB0aGUgbmV3IGR5bmFtaWMgd2ViIHByb2plY3Qgd2l6YXJkIj48c3Ryb25nPkZpbGUgJmd0OyBOZXcgJmd0OyBQcm9qZWN0Li4uICZndDsgV2ViICZndDsgRHluYW1pYyBXZWIgUHJvamVjdDwvc3Ryb25nPjwvYT4gZnJvbSB0aGUgdG9wIGxldmVsIG1lbnUKLWVudGVyIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246Ci08b2wgdHlwZT0iYSI+Ci08bGk+UHJvamVjdCBuYW1lOiBFbnRlciBhIG5hbWUgb2YgdGhlIHByb2plY3QuPC9saT4KLTxsaT5UYXJnZXQgUnVudGltZTogU2VsZWN0IHRoZSBzZXJ2ZXIgeW91IHdpc2ggdG8gZGVwbG95IHlvdXIgV2ViIHNlcnZpY2UgdG8uIElmIGl0J3Mgbm90IGxpc3RlZAotY2xpY2sgPGI+TmV3PC9iPiBhbmQgYnJvd3NlIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSBpdCBpcyBpbnN0YWxsZWQuPC9saT4KLTxsaT5EeW5hbWljIFdlYiBNb2R1bGUgdmVyc2lvbjogU2VsZWN0IHZlcnNpb24gMi40IG9yIDIuNTwvbGk+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+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0OWY0ZGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlcjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC41LjAKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cztidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiN2UxM2QuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPg0KLTx0aXRsZT5BYm91dDwvdGl0bGU+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9IkVOLVVTIj4NCi08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4NCi0gDQotPHA+RmVicnVhcnkgMTksIDIwMDk8L3A+CQ0KLTxoMz5MaWNlbnNlPC9oMz4NCi0NCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSANCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlDQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSANCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+Lg0KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+DQotDQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyANCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5DQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIA0KLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQ0KLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50DQotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9ib29rLmNzcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2Jvb2suY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkN2UyYjU3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2Jvb2suY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotQGltcG9ydCAiLi4vUFJPRFVDVF9QTFVHSU4vYm9vay5jc3MiOwotCi1zcGFuLmNvbnRyb2wgewotICBmb250LXdlaWdodDogYm9sZDsKLX0KLQotc3Bhbi5uYW1lIHsKLSAgZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1zcGFuLmNvZGUgewotICBmb250LWZhbWlseTogbW9ub3NwYWNlOwotfQotCi1wLm5hdl9mb290ZXIgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1wLm5hdl9mb290ZXIgYSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE4Mjk3ZWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgKi54bWwsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwNCi0gICAgICAgICAgICAgICBib29rLmNzcyxcDQotICAgICAgICAgICAgICAgY29uY2VwdHMvLFwNCi0gICAgICAgICAgICAgICBnZXR0aW5nc3RhcnRlZC8sXA0KLSAgICAgICAgICAgICAgIGltYWdlcy8sXA0KLSAgICAgICAgICAgICAgIG1haW5wYWdlLmh0bWwsXA0KLSAgICAgICAgICAgICAgIHRhc2tzLyxcDQotICAgICAgICAgICAgICAgbGVnYWwuaHRtbCxcDQotICAgICAgICAgICAgICAgdGlwcy8sXA0KLSAgICAgICAgICAgICAgIHJlZmVyZW5jZS8NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9jb25jZXB0cy9qYXh3cy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvY29uY2VwdHMvamF4d3MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDI5OWI3MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9jb25jZXB0cy9qYXh3cy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiI+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPkphdmEgQVBJIGZvciBYTUwtQmFzZWQgV2ViIFNlcnZpY2VzPC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPkphdmEgQVBJIGZvciBYTUwtQmFzZWQgV2ViIFNlcnZpY2VzPC9oMj4KLTxwPkpBWC1XUyBpcyBhIEphdmEgQVBJIGZvciBjcmVhdGluZyBXZWIgc2VydmljZXMgYW5kIGNsaWVudHMgdGhhdCBjb21tdW5pY2F0ZSB1c2luZyBYTUwuIEl0IHdhcyBkZXNpZ25lZCB0byBzdXBlcnNlZGUgdGhlIEpBWC1SUEMgc3RhbmRhcmQuPC9wPgotCi08cD5BZGRpdGlvbmFsIGluZm9ybWF0aW9uOjwvcD4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuamNwLm9yZy9lbi9qc3IvZGV0YWlsP2lkPTIyNCI+SlNSLTIyNCBTcGVjaWZpY2F0aW9uPC9hPjwvbGk+Ci08L3VsPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2dldHRpbmdzdGFydGVkL2dldHRpbmdfc3RhcnRlZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvZ2V0dGluZ3N0YXJ0ZWQvZ2V0dGluZ19zdGFydGVkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwODJkZDkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvZ2V0dGluZ3N0YXJ0ZWQvZ2V0dGluZ19zdGFydGVkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+R2V0dGluZyBTdGFydGVkPC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPkdldHRpbmcgU3RhcnRlZDwvaDI+Ci08cD5UaGlzIHNlY3Rpb24gcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gZ2V0dGluZyBzdGFydGluZyBzdGFydGVkIHdpdGggSkFYLVdTIFRvb2xzLjwvcD4KLTx1bD4KLQk8bGk+Ci0JPHA+PGEgaHJlZj0icmVxdWlyZW1lbnRzLmh0bWwiPlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uPC9hPjwvcD4KLQk8L2xpPgotCTxsaT4KLQk8cD48YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvcHJlZmVyZW5jZXMuaHRtbCI+Q29uZmlndXJpbmcgQXBhY2hlIENYRiBpbiB0aGUgd29ya2JlbmNoPC9hPjwvcD4KLQk8L2xpPgotCTxsaT4KLQk8cD48YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9nZXR0aW5nc3RhcnRlZC9xdWlja3N0YXJ0Lmh0bWwiPkpBWC1XUyBUb29scyBRdWljayBTdGFydDwvYT48L3A+Ci0JPC9saT4KLTwvdWw+Ci08cD5Gb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgcGxlYXNlIHZpc2l0IHRoZSA8YSBocmVmPSJodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9KQVhXUyI+SkFYLVdTIFdpa2k8L2E+IHBhZ2UuPC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2dldHRpbmdzdGFydGVkL3JlcXVpcmVtZW50cy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvZ2V0dGluZ3N0YXJ0ZWQvcmVxdWlyZW1lbnRzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg2ODdiM2QuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvZ2V0dGluZ3N0YXJ0ZWQvcmVxdWlyZW1lbnRzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+UmVxdWlyZW1lbnRzIGFuZCBpbnN0YWxsYXRpb248L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+UmVxdWlyZW1lbnRzIGFuZCBpbnN0YWxsYXRpb248L2gyPgotPHA+SkFYLVdTIFRvb2xzIGN1cnJlbnRseSBzdXBwb3J0cyBib3RoIEVjbGlwc2UgMy40IGFuZCAzLjUgZW52aXJvbm1lbnRzIGFuZCBoYXMgdGhlIGZvbGxvd2luZyA8aT5taW5pbXVtPC9pPiByZXF1aXJlbWVudHMuPC9wPgotPHA+PC9wPgotPHVsPgotCTxsaT4KLQk8cD5FY2xpcHNlIDMuNC4wICg8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2Fkcy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzPC9hPik8L3A+Ci0JPC9saT4KLQk8bGk+Ci0JPHA+RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgMy4wLjEgKDxhIGhyZWY9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy9kb3dubG9hZHMvIj5odHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvZG93bmxvYWRzPC9hPik8L3A+Ci0JPC9saT4KLTwvdWw+Ci0KLTxoMz5KREsgVmVyc2lvbnM8L2gzPgotPHA+SmF2YSA1LjAgaXMgdGhlIG1pbmltdW0gcmVxdWlyZWQgdmVyc2lvbiBhbmQgSkRLIDYuMCBpcyBzdXBwb3J0ZWQgZnJvbSB1cGRhdGUgNCBhbmQgbGF0ZXIuPC9wPgotPHA+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvZG93bmxvYWRzLyI+aHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvZG93bmxvYWRzLzwvYT48L3A+Ci0KLQotPGgzPkpBWC1XUyBSdW50aW1lPC9oMz4KLTxwPkJlZm9yZSBjcmVhdGluZyBXZWIgc2VydmljZSBhcHBsaWNhdGlvbnMgd2l0aCBKQVgtV1MgVG9vbHMgYSBKQVgtV1MgcnVudGltZSBtdXN0IGJlIGRvd25sb2FkZWQsIGluc3RhbGxlZCBhbmQgY29uZmlndXJlZCBpbiB0aGUgd29ya2JlbmNoLjwvcD4KLTxwPkN1cnJlbnRseSB3ZSBzdXBwb3J0IHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgZm9yIEpBWC1XUyBkZXZlbG9wbWVudCBmcm9tIHZlcnNpb24gMi4wLjYgdXB3YXJkcy4gV2UgcmVjb21tZW5kIHVzaW5nIGEgdmVyc2lvbiBmcm9tCi10aGUgQ1hGIDIuMS54IG9yIHRoZSBjdXJyZW50IDIuMi54IHN0cmVhbS48L3A+Ci08cD5UaGUgQXBhY2hlIENYRiBydW50aW1lIGNhbiBiZSBkb3dubG9hZGVkIGZyb20gdGhlIDxhIGhyZWY9Imh0dHA6Ly9jeGYuYXBhY2hlLm9yZy9kb3dubG9hZC5odG1sIj5BcGFjaGUgQ1hGIERvd25sb2FkczwvYT4gcGFnZS48cD4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL3ByZWZlcmVuY2VzLmh0bWwiPkFwYWNoZSBDWEYgMi54IFByZWZlcmVuY2VzPC9hPjxicj4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfY3hmX3Byb2plY3QuaHRtbCI+Q3JlYXRlIGEgcHJvamVjdCBmb3IgQ1hGIFdlYiBzZXJ2aWNlczwvYT48YnI+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvaW1hZ2VzL2VnZy1pbmN1YmF0aW9uLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2ltYWdlcy9lZ2ctaW5jdWJhdGlvbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg2MWM5ODEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvaW1hZ2VzL2VnZy1pbmN1YmF0aW9uLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2ltYWdlcy9uZ3JlbGMucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvaW1hZ2VzL25ncmVsYy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE2MWUzYWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvaW1hZ2VzL25ncmVsYy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9pbWFnZXMvbmdyZWxyLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2ltYWdlcy9uZ3JlbHIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NzI2ZjhjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2ltYWdlcy9uZ3JlbHIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvaW1hZ2VzL25ncmVsdC5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9pbWFnZXMvbmdyZWx0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzRiZWUyYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9pbWFnZXMvbmdyZWx0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2ltYWdlcy93dHBsb2dvc21hbGwuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvaW1hZ2VzL3d0cGxvZ29zbWFsbC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcxYmVhNzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvaW1hZ2VzL3d0cGxvZ29zbWFsbC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9sZWdhbC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvbGVnYWwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjEyZmNmYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9sZWdhbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+TGVnYWw8L3RpdGxlPgotCTxsaW5rIGhyZWY9ImJvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvbGl2ZWhlbHAuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj5MZWdhbDwvaDI+Ci08cD5Db3B5cmlnaHQgJmNvcHk7IDIwMDksIFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC48L3A+Ci08cD5UaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdDo8L3A+Ci08cD48Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+PC9jb2RlPjwvcD4KLTxwPjxhIGhyZWY9ImFib3V0Lmh0bWwiPlRlcm1zIGFuZCBjb25kaXRpb25zIHJlZ2FyZGluZyB0aGUgdXNlIG9mIHRoaXMgZ3VpZGUuPC9hPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9tYWlucGFnZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvbWFpbnBhZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTBhOThjMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9tYWlucGFnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+SkFYLVdTIFRvb2xzIFVzZXIgR3VpZGU8L3RpdGxlPgotCTxsaW5rIGhyZWY9ImJvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci0JPGRpdiBhbGlnbj0iY2VudGVyIj4KLQkJPGJyPgotCQk8aW1nIGFsdD0iV2ViVG9vbHMgUGxhdGZvcm0iIHNyYz0iaW1hZ2VzL3d0cGxvZ29zbWFsbC5qcGciIGhzcGFjZT0iNzAiPgotCQk8aW1nIGFsdD0iV2ViVG9vbHMgUGxhdGZvcm0iIHNyYz0iaW1hZ2VzL2VnZy1pbmN1YmF0aW9uLnBuZyIgaHNwYWNlPSIxMDAiPgotCQk8YnI+Ci0JCTxoMT5KQVgtV1MgVG9vbHMgVXNlciBHdWlkZTwvaDE+Ci0JPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDU4Y2RiMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1wbHVnaW5OYW1lPUpBWC1XUyBUb29scyBVc2VyIEd1aWRlIChJbmN1YmF0aW9uKQ0KLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQotDQotY2hlYXRzaGVldC5jYXRlZ29yeS5qYXh3cz1KQVgtV1MgRGV2ZWxvcG1lbnQNCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTE0Y2U0Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08P2VjbGlwc2UgdmVyc2lvbj0iMy40Ij8+DQotPHBsdWdpbj4NCi0NCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+DQotICAgICAgPHRvYyBmaWxlPSJ0b2MueG1sIiBwcmltYXJ5PSJ0cnVlIi8+DQotICAgICAgPHRvYyBmaWxlPSJ0b2Njb25jZXB0cy54bWwiLz4NCi0gICAgICA8dG9jIGZpbGU9InRvY3Rhc2tzLnhtbCIvPg0KLSAgICAgIDx0b2MgZmlsZT0idG9jcmVmZXJlbmNlLnhtbCIvPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIA0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLmNoZWF0U2hlZXRDb250ZW50Ij4NCi0gICAgICA8Y2F0ZWdvcnkNCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzIg0KLSAgICAgICAgICAgIG5hbWU9IiVjaGVhdHNoZWV0LmNhdGVnb3J5LmpheHdzIj4NCi0gICAgICA8L2NhdGVnb3J5Pg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIA0KLTwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3JlZmVyZW5jZS9hbm5vdGF0aW9uX3Byb2Nlc3NvcnMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3JlZmVyZW5jZS9hbm5vdGF0aW9uX3Byb2Nlc3NvcnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzAyMmQxOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9yZWZlcmVuY2UvYW5ub3RhdGlvbl9wcm9jZXNzb3JzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIj4KLQk8dGl0bGU+QW5ub3RhdGlvbiBQcm9jZXNzb3JzPC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPkFubm90YXRpb24gVmFsaWRhdGlvbjwvaDI+Ci08cD5KQVgtV1MgVG9vbHMgcHJvdmlkZXMgSkRULUFQVCBBbm5vdGF0aW9uIFByb2Nlc3NvcnMgdGhhdCBnYXRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNvdXJjZSBjb2RlIGFzIGl0IGlzIGJlaW5nIGVkaXRlZC48L3A+Ci08cD5UaGUgcHJvY2Vzc29ycyByZXBvcnQgZXJyb3JzIGFuZCB3YXJuaW5ncyBpbiB0aGUgUHJvYmxlbXMgVmlldyB3aGVuIEpBWC1XUyBydWxlcyBhcmUgYnJva2VuLjwvcD4gCi08cD5KQVgtV1MgQW5ub3RhdGlvbiBwcm9jZXNzaW5nIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuPC9wPgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NvbmZpZ3VyaW5nX2pheHdzX2Fubm90YXRpb25fcHJvY2Vzc2luZy5odG1sIj5FbmFibGUgSkFYLVdTIEFubm90YXRpb24gUHJvY2Vzc2luZzwvYT48YnI+ICAgIAotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3JlZmVyZW5jZS9hbm5vdGF0aW9uX3ZpZXcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3JlZmVyZW5jZS9hbm5vdGF0aW9uX3ZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmFlM2Q5OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9yZWZlcmVuY2UvYW5ub3RhdGlvbl92aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+QW5ub3RhdGlvbnMgVmlldzwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj5Bbm5vdGF0aW9uIFByb3BlcnRpZXMgVmlldzwvaDI+Ci08cD5KQVgtV1MgVG9vbHMgcHJvdmlkZXMgYSBjb250ZXh0IGF3YXJlIEFubm90YXRpb24gcHJvcGVydGllcyB2aWV3IHRoYXQgcmVhY3RzIHRvIHRoZSBzZWxlY3Rpb24gaW4gdGhlIEphdmEgCi1FZGl0b3IgcHJlc2VudGluZyBhIGxpc3Qgb2YgYXBwbGljYWJsZSBKQVgtV1MgYW5ub3RhdGlvbnMgZm9yIHRoYXQgc2VsZWN0aW9uLjwvcD4KLTxwPlNlbGVjdGluZyBvciBkZXNlbGVjdGluZyBhIGNoZWNrIGJveCBpbiB0aGUgdmFsdWVzIGNvbHVtbiB3aWxsIGFkZCBvciByZW1vdmUgdGhlIGFubm90YXRpb24gYXQgdGhhdCByb3cgCi10byB0aGUgY3VycmVudGx5IHNlbGVjdGVkIEphdmEgZWxlbWVudCBpbiB0aGUgSmF2YSBFZGl0b3I8L3A+Ci08cD48aW1nIHNyYz0iLi9pbWFnZXMvYW5ub3RhdGlvbnNfdmlldy5wbmciIGFsdD0iQW5ub3RhdGlvbiBwcm9wZXJ0aWVzIHZpZXciID4gPC9wPgotPHA+RXhwYW5kaW5nIGFuIGFubm90YXRpb24gaW4gdGhlIHZpZXcgd2lsbCByZXZlYWwgdGhlIGFubm90YXRpb25zIGVsZW1lbnRzIGFuZCB0aGUgZWxlbWVudCB2YWx1ZXMuPC9wPgotPHA+WW91IGNhbiBlZGl0IHRoZSBhbm5vdGF0aW9uIGVsZW1lbnQgdmFsdWVzIHVzaW5nIHRoZSBlZGl0b3JzIGluIHRoZSB2YWx1ZXMgY29sdW1uLjwvcD4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy9hbm5vdGF0aW9uc192aWV3X2V4cGFuZGVkLnBuZyIgYWx0PSJBbm5vdGF0aW9uIHByb3BlcnRpZXMgdmlldyBleHBhbmRlZCIgPiA8L3A+Ci08cD5UaGUgPHN0cm9uZz5Bbm5vdGF0aW9uIFByb3BlcnRpZXM8L3N0cm9uZz4gdmlldyBpcyBhdmFpbGFibGUgdW5kZXIKLTxhIGNsYXNzPSJjb21tYW5kLWxpbmsiIGhyZWY9J2phdmFzY3JpcHQ6ZXhlY3V0ZUNvbW1hbmQoIm9yZy5lY2xpcHNlLnVpLnZpZXdzLnNob3dWaWV3KG9yZy5lY2xpcHNlLnVpLnZpZXdzLnNob3dWaWV3LnZpZXdJZD1vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkudmlld3MuQW5ub3RhdGlvbnNWaWV3KSIpJz4KLTxpbWcgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9jb21tYW5kX2xpbmsucG5nIiBhbHQ9Ik9wZW4gdGhlIGFubm90YXRpb24gcHJvcGVydGllcyB2aWV3Ij48c3Ryb25nPldpbmRvdyAmZ3Q7IFNob3cgVmlldyAmZ3Q7IE90aGVyLi4uICZndDsgSkFYLVdTICZndDsgQW5ub3RhdGlvbiBQcm9wZXJ0aWVzPC9zdHJvbmc+PC9hPiBmcm9tIHRoZSB0b3AgbGV2ZWwgbWVudS4gPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9hbm5vdGF0aW9uc192aWV3LnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvYW5ub3RhdGlvbnNfdmlldy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjMzZiOTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9hbm5vdGF0aW9uc192aWV3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvYW5ub3RhdGlvbnNfdmlld19leHBhbmRlZC5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2Fubm90YXRpb25zX3ZpZXdfZXhwYW5kZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OTRlNTNhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvYW5ub3RhdGlvbnNfdmlld19leHBhbmRlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90aXBzL2ltYWdlcy9jb250ZW50X2Fzc2lzdC5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90aXBzL2ltYWdlcy9jb250ZW50X2Fzc2lzdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwNDdmMjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdGlwcy9pbWFnZXMvY29udGVudF9hc3Npc3QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdGlwcy9pbWFnZXMvcXVpY2tfZml4ZXMucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdGlwcy9pbWFnZXMvcXVpY2tfZml4ZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyY2E0YzFiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RpcHMvaW1hZ2VzL3F1aWNrX2ZpeGVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RpcHMvdGlwc190cmlja3MuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RpcHMvdGlwc190cmlja3MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTJkNzE3MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90aXBzL3RpcHNfdHJpY2tzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+VGlwcyBhbmQgdHJpY2tzIChKQVgtV1MgVG9vbHMpPC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci0JPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2xpdmVoZWxwLmpzIj48L3NjcmlwdD4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+VGlwcyBhbmQgdHJpY2tzIChKQVgtV1MgVG9vbHMpPC9oMj4KLTxwPlRoZSBmb2xsb3dpbmcgdGlwcyBhbmQgdHJpY2tzIGdpdmUgc29tZSBoZWxwZnVsIGlkZWFzIGZvciBpbmNyZWFzaW5nIHlvdXIgcHJvZHVjdGl2aXR5LjwvcD4KLSAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjUiIHN1bW1hcnk9IkphdmEgc2VhcmNoIGFjdGlvbnMiPgotICAgICAgPHRib2R5PgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPjxiPkNvbnRlbnQgQXNzaXN0PC9iPjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHlvdSB3aXRoIGEgbGlzdCBvZiBwcm9wb3NhbHMgaWYgYXZhaWxhYmxlIG9yIHdpbGwgYXV0b21hdGljYWxseSBpbnNlcnQgdGhlIGRlZmF1bHQgdmFsdWUgYXMgb3V0bGluZWQgaW4gdGhlIEpBWC1XUyBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGFubm90YXRpb25zIGVsZW1lbnQuCi0gICAgICAgICAgICBJbiB0aGUgSmF2YSBlZGl0b3IgcHJlc3MgPGI+Q3RybCtTcGFjZTwvYj4gb3IgdXNlIDxiPkVkaXQgJmd0OyBDb250ZW50IEFzc2lzdCAgJmd0OyBKQVgtV1MgUHJvcG9zYWxzPC9iPiB3aGVuIHRoZSBjdXJzb3IgaXMgYmV0d2VlbiB0aGUgcXVvdGF0aW9uIG1hcmtzIG9mIGFuIGFubm90YXRpb25zIGVsZW1lbnQgU3RyaW5nIHZhbHVlCi0gICAgICAgICAgICBvciBkaXJlY3RseSBhZnRlciB0aGUgJz0nIHNpbXBsZSBhc3NpZ25tZW50IG9wZXJhdG9yLjwvcD4KLSAgICAgICAgICAgIDxwPjxpbWcgc3JjPSIuL2ltYWdlcy9jb250ZW50X2Fzc2lzdC5wbmciIGFsdD0iQ29udGVudCBBc3Npc3QiID4gPC9wPgotICAgICAgICAgICAgCi0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD48Yj5Vc2UgUXVpY2sgRml4ZXMgdG8gcmVzb2x2ZSBKQVgtV1MgdmFsaWRhdGlvbiBlcnJvcnM8L2I+PC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+V2l0aCA8Yj5Bbm5vdGF0aW9uIFByb2Nlc3Npbmc8L2I+IGVuYWJsZWQgb24gYSBwcm9qZWN0IHRoZSBKQVgtV1MgYW5ub3RhdGlvbiBwcm9jZXNzb3JzIHJlcG9ydCBlcnJvcnMgYW5kIHdhcm5pbmcgd2hlbgotICAgICAgICAgICAgcnVsZXMgYXJlIGJyb2tlbi4gQSBudW1iZXIgb2YgdGhlc2UgcnVsZXMgYXJlIHJlcG9ydGVkIGFzIGZpeGFibGUgZXJyb3JzIGFuZCB3YXJuaW5ncy48L3A+Ci0gICAgICAgICAgICA8cD48aW1nIHNyYz0iLi9pbWFnZXMvcXVpY2tfZml4ZXMucG5nIiBhbHQ9IlF1aWNrIEZpeGVzIiA+IDwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPjxiPkluaXRpYWxpemUgdGhlIFdlYiBTZXJ2aWNlcyB3aXphcmRzPC9iPjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkxhdW5jaCB0aGUgV2ViIFNlcnZpY2UgYW5kIFdlYiBTZXJ2aWNlIENsaWVudCB3aXphcmRzIGZyb20gdGhlIGNvbnRleHQgbWVudSB0byBpbml0aWFsaXplIHRoZSB3aXphcmQgZmllbGRzLiAKLSAgICAgICAgICAgIFJpZ2h0LWNsaWNrIG9uIGEgSmF2YSBJbXBsZW1lbnRhdGlvbiBiZWFuIGFuZCBzZWxlY3QgPGI+V2ViIFNlcnZpY2VzID4gQ3JlYXRlIFdlYiBTZXJ2aWNlPC9iPi4gCi0gICAgICAgICAgICBGb3IgYSBXU0RMIGRvY3VtZW50IHJpZ2h0LWNsaWNrIGFuZCBzZWxlY3QgPGI+V2ViIFNlcnZpY2VzID4gR2VuZXJhdGUgSmF2YSBiZWFuIHNrZWxldG9uPC9iPi4KLSAgICAgICAgICAgIFRoaXMgd2lsbCBpbml0aWFsaXplIHRoZSAmcXVvdDtXZWIgc2VydmljZSB0eXBlJnF1b3Q7LCB0aGUgJnF1b3Q7U2VydmljZSBpbXBsZW1lbnRhdGlvbiZxdW90OyBvciAmcXVvdDtTZXJ2aWNlIGRlZmluaXRpb24mcXVvdDsgZmllbGRzCi0gICAgICAgICAgICBhbmQgdGhlICZxdW90O1NlcnZpY2UgcHJvamVjdCZxdW90OyBmaWVsZC48L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGJvZHk+Ci0gICAgPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90b2MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdG9jLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjZkNzVkZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90b2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgbGFiZWw9IkpBWC1XUyBUb29scyBVc2VyIEd1aWRlIiB0b3BpYz0ibWFpbnBhZ2UuaHRtbCI+Ci0gICA8dG9waWMgaHJlZj0iZ2V0dGluZ3N0YXJ0ZWQvZ2V0dGluZ19zdGFydGVkLmh0bWwiIGxhYmVsPSJHZXR0aW5nIFN0YXJ0ZWQiPgotICAgICAgPHRvcGljIGhyZWY9ImdldHRpbmdzdGFydGVkL3JlcXVpcmVtZW50cy5odG1sIiBsYWJlbD0iUmVxdWlyZW1lbnRzIGFuZCBJbnN0YWxsYXRpb24iLz4KLSAgICAgIDxsaW5rIHRvYz0iLi4vb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90b2NnZXR0aW5nc3RhcnRlZC54bWwiLz4KLSAgICAgIDxhbmNob3IgaWQ9ImdldHRpbmdzdGFydGVkIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJDb25jZXB0cyI+Ci0gICAgICA8YW5jaG9yIGlkPSJjb25jZXB0cyIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iVGFza3MiPgotICAgICAgPGFuY2hvciBpZD0idGFza3MiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IlJlZmVyZW5jZSI+Ci0gICAgICA8YW5jaG9yIGlkPSJyZWZlcmVuY2UiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgaHJlZj0idGlwcy90aXBzX3RyaWNrcy5odG1sIiBsYWJlbD0iVGlwcyBhbmQgdHJpY2tzIj4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgaHJlZj0ibGVnYWwuaHRtbCIgbGFiZWw9IkxlZ2FsIj4KLSAgIDwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RvY2NvbmNlcHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RvY2NvbmNlcHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDg2NWNjNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90b2Njb25jZXB0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJDb25jZXB0cyIgbGlua190bz0idG9jLnhtbCNjb25jZXB0cyI+Ci0gICA8dG9waWMgaHJlZj0iY29uY2VwdHMvamF4d3MuaHRtbCIgbGFiZWw9IkphdmEgQVBJIGZvciBYTUwtQmFzZWQgV2ViIFNlcnZpY2VzIj4KLSAgIDwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RvY3JlZmVyZW5jZS54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90b2NyZWZlcmVuY2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZDBhMWM5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RvY3JlZmVyZW5jZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iUmVmZXJlbmNlIiBsaW5rX3RvPSJ0b2MueG1sI3JlZmVyZW5jZSI+Ci0gICA8bGluayB0b2M9Ii4uL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdG9jcmVmZXJlbmNlLnhtbCIvPgotICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZS9hbm5vdGF0aW9uX3Byb2Nlc3NvcnMuaHRtbCIgbGFiZWw9IkFubm90YXRpb24gVmFsaWRhdGlvbiI+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZS9hbm5vdGF0aW9uX3ZpZXcuaHRtbCIgbGFiZWw9IkFubm90YXRpb24gUHJvcGVydGllcyBWaWV3Ij4KLSAgIDwvdG9waWM+IAotPC90b2M+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90b2N0YXNrcy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90b2N0YXNrcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwY2RiYzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdG9jdGFza3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iVGFza3MiIGxpbmtfdG89InRvYy54bWwjdGFza3MiPgotICAgPGxpbmsgdG9jPSIuLi9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3RvY3Rhc2tzLnhtbCIvPiAKLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjhkZjliLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZTE5ZTUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmY3OWM5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9Q1hGIFdlYiBTZXJ2aWNlcyAoSW5jdWJhdGlvbikKLQotIyAiZmVhdHVyZVByb3ZpZGVyIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotZmVhdHVyZVByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1DWEYgV2ViIFNlcnZpY2VzIAotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi0gQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQ1xuXAotIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1lcGwtdjEwLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDg1MmE3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIwLjQuMi5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlZmVhdHVyZVByb3ZpZGVyIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmpkb20iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIxNTYiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iNDQiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjIwNCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iNTIiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSI5NiIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjEyMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iamF2YXgud3NkbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjYuMi5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+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+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE2OWJmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPlNlcHRlbWJlciAxMiwgMjAwODwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODY0NzI3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgZmVhdHVyZSBkZXRhaWxzIGluIHRoZSAiQWJvdXQiIAotIyBkaWFsb2cgKHRyYW5zbGF0ZWQpLiAgTWF4aW11bSAxNSBsaW5lcyBhbmQgNzUgY2hhcmFjdGVycyBwZXIgbGluZS4KLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWN4ZjMyLmdpZgotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxMzUyZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9Q1hGIFdlYiBTZXJ2aWNlcyBTb3VyY2UgKEluY3ViYXRpb24pXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBJT05BIFRlY2hub2xvZ2llcyBQTEMgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2luY3ViYXRvci9cblwKLVxuCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzQzNDRkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCBjeGYzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2N4ZjMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9jeGYzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMWVjY2IuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2N4ZjMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhOWQwMC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9Q1hGIFdlYiBTZXJ2aWNlcyBTb3VyY2UgKEluY3ViYXRpb24pCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGUxOWU1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhYzgxNC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1DWEYgV2ViIFNlcnZpY2VzIERldmVsb3BlciBSZXNvdXJjZXMgKEluY3ViYXRpb24pCi0KLSMgImZlYXR1cmVQcm92aWRlciIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLWZlYXR1cmVQcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgZm9yIENYRiBXZWIgU2VydmljZXMKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTENcblwKLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi0gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9ZXBsLXYxMC5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+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+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE2OWJmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPlNlcHRlbWJlciAxMiwgMjAwODwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODY0NzI3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgZmVhdHVyZSBkZXRhaWxzIGluIHRoZSAiQWJvdXQiIAotIyBkaWFsb2cgKHRyYW5zbGF0ZWQpLiAgTWF4aW11bSAxNSBsaW5lcyBhbmQgNzUgY2hhcmFjdGVycyBwZXIgbGluZS4KLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWN4ZjMyLmdpZgotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxMzUyZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9Q1hGIFdlYiBTZXJ2aWNlcyBTb3VyY2UgKEluY3ViYXRpb24pXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBJT05BIFRlY2hub2xvZ2llcyBQTEMgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2luY3ViYXRvci9cblwKLVxuCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzQzNDRkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCBjeGYzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2N4ZjMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9jeGYzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMWVjY2IuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2N4ZjMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFhMmU1OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1DWEYgV2ViIFNlcnZpY2VzIFNvdXJjZSAoSW5jdWJhdGlvbikKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEyNTFjZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmOGI3Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZQotICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2Yjc5Yi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1DWEYgV2ViIFNlcnZpY2VzIFNESyAoSW5jdWJhdGlvbikKLQotIyAiZmVhdHVyZVByb3ZpZGVyIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotZmVhdHVyZVByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1DWEYgV2ViIFNlcnZpY2VzIFNvdXJjZQotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi0gQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQ1xuXAotIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1lcGwtdjEwLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZWMyNWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMC40LjIucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJWZlYXR1cmVQcm92aWRlciIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+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+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRmZDcyYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGUxOWU1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBiZjdiMS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUNYRiBXZWIgU2VydmljZXMgVGVzdHMgKEluY3ViYXRpb24pCi0KLSMgImZlYXR1cmVQcm92aWRlciIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLWZlYXR1cmVQcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249Q1hGIFdlYiBTZXJ2aWNlcyBUZXN0cwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi0gQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQ1xuXAotIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1lcGwtdjEwLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzUxOThiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIwLjQuMi5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlZmVhdHVyZVByb3ZpZGVyIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV90ZXN0cy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+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+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHkuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFkOWMzMC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHkuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMTM3ODkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2MjI3Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseS5mZWF0dXJlIgotICAgICAgbGFiZWw9IkFzc2VtYmx5IEZlYXR1cmUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSJXZWJ0b29scyBQbGF0Zm9ybSBQcm9qZWN0Ij4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgVGhpcyBmZWF0dXJlIGlzIGZvciBidWlsZGluZyBvbmx5LCB0byBhc3NlbWJsZSB0aGUgcmVsZWF0ZWQgZmVhdHVyZXMsIHdpdGhvdXQgZm9yY2VpbmcgdGhlbSB0byBlbmNvZGluZyBkZXBlbmRlbmNpZXMgb24gZWFjaCBvdGhlci4gCi1UaGlzIGZlYXR1cmUgc2hvdWxkIG5ldmVyIGFwcGVhciBpbiBidWlsZCBkaXN0cmlidXRpb25zIG9yIHVwZGF0ZSBzaXRlcy4KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLSAgICAgICAgIAotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2E4OTYyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV9zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMTM3ODkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhOGExZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iQXNzZW1ibHkgRmVhdHVyZSIKLSAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IldlYnRvb2xzIFBsYXRmb3JtIFByb2plY3QiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICBUaGlzIGZlYXR1cmUgaXMgZm9yIGJ1aWxkaW5nIG9ubHksIHRvIGFzc2VtYmxlIHRoZSByZWxlYXRlZCBmZWF0dXJlcywgd2l0aG91dCBmb3JjZWluZyB0aGVtIHRvIGVuY29kaW5nIGRlcGVuZGVuY2llcyBvbiBlYWNoIG90aGVyLiAKLVRoaXMgZmVhdHVyZSBzaG91bGQgbmV2ZXIgYXBwZWFyIGluIGJ1aWxkIGRpc3RyaWJ1dGlvbnMgb3IgdXBkYXRlIHNpdGVzLgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0gICAgICAgICAKLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotICAgICAgICAgCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZDZlOWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YTJhNmEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYjYxNWUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpBWC1XUyBET00gVG9vbHMgU0RLIChJbmN1YmF0aW9uKQotCi0jICJmZWF0dXJlUHJvdmlkZXIiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1mZWF0dXJlUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUpBWC1XUyBET00gVG9vbHMgU291cmNlCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVdlYiBUb29scyAoV1RQKSBVcGRhdGUgU2l0ZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi0gQ29weXJpZ2h0IChjKSAyMDA5IFNBUCBBRywgV2FsbGRvcmYuXG5cCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWVwbC12MTAuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBlYTZmZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlZmVhdHVyZVByb3ZpZGVyIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+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+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMTkyYTUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV90ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV90ZXN0cy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV90ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjkzZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV90ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NTFjNzMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SkFYLVdTIERPTSBUb29scyBUZXN0cyAoSW5jdWJhdGlvbikKLQotIyAiZmVhdHVyZVByb3ZpZGVyIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotZmVhdHVyZVByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1KQVgtV1MgRE9NIFRvb2xzIFRlc3RzCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVdlYiBUb29scyAoV1RQKSBVcGRhdGUgU2l0ZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi0gQ29weXJpZ2h0IChjKSAyMDA5IFNBUCBBRywgV2FsbGRvcmYuXG5cCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWVwbC12MTAuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMTQ1ODUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV90ZXN0cy5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVmZWF0dXJlUHJvdmlkZXIiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuam1vY2siCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+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+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViODhlYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5M2YuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmVjZWQ5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpBWC1XUyBUb29scyAoSW5jdWJhdGlvbikKLQotIyAiZmVhdHVyZVByb3ZpZGVyIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotZmVhdHVyZVByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1KQVgtV1MgVG9vbHMgCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLSBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycy5cblwKLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi0gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9ZXBsLXYxMC5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZDZjOGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIwLjUuMi5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlZmVhdHVyZVByb3ZpZGVyIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImphdmF4LnhtbC53cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjEuMC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJqYXZheC5qd3MiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImphdmF4LnhtbC5iaW5kIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMS45LnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImphdmF4LnhtbC5zdHJlYW0iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJqYXZheC5hY3RpdmF0aW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+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+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjZhMDMxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMTksIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZmVmZWIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yIGZlYXR1cmUgZGV0YWlscyBpbiB0aGUgIkFib3V0IiAKLSMgZGlhbG9nICh0cmFuc2xhdGVkKS4gIE1heGltdW0gMTUgbGluZXMgYW5kIDc1IGNoYXJhY3RlcnMgcGVyIGxpbmUuCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmM2MTQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUpBWC1XUyBUb29scyBTb3VyY2UgKEluY3ViYXRpb24pXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDgsIDIwMDkuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9pbmN1YmF0b3IvXG5cCi1cbgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDUxMmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU3ZjFjYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZSBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUpBWC1XUyBUb29scyBTb3VyY2UgKEluY3ViYXRpb24pCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTNmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzYThiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SkFYLVdTIFRvb2xzIERldmVsb3BlciBSZXNvdXJjZXMgKEluY3ViYXRpb24pCi0KLSMgImZlYXR1cmVQcm92aWRlciIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLWZlYXR1cmVQcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgZm9yIEpBWC1XUyBUb29scyAKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzLlxuXAotIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1lcGwtdjEwLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+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+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjZhMDMxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMTksIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZmVmZWIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yIGZlYXR1cmUgZGV0YWlscyBpbiB0aGUgIkFib3V0IiAKLSMgZGlhbG9nICh0cmFuc2xhdGVkKS4gIE1heGltdW0gMTUgbGluZXMgYW5kIDc1IGNoYXJhY3RlcnMgcGVyIGxpbmUuCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmM2MTQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUpBWC1XUyBUb29scyBTb3VyY2UgKEluY3ViYXRpb24pXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDgsIDIwMDkuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9pbmN1YmF0b3IvXG5cCi1cbgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDUxMmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk4YWViZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZSBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jcHJvcGVydGllcyBmaWxlIGZvciBKQVhXUyBDb3JlCi1wbHVnaW5OYW1lPUpBWC1XUyBUb29scyBTb3VyY2UgKEluY3ViYXRpb24pCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MjM1MzMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRhMmE4Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbAotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZjIzOTcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpBWC1XUyBUb29scyBTREsgKEluY3ViYXRpb24pCi0KLSMgImZlYXR1cmVQcm92aWRlciIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLWZlYXR1cmVQcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249SkFYLVdTIFRvb2xzIFNvdXJjZQotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi0gQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMuXG5cCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWVwbC12MTAuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMmIyNzAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjAuNS4yLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVmZWF0dXJlUHJvdmlkZXIiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+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+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0Zjc2OS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1MDI2MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMDRlOWIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpBWC1XUyBUb29scyBVc2VyIERvY3VtZW50YXRpb24gKEluY3ViYXRpb24pCi0KLSMgImZlYXR1cmVQcm92aWRlciIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLWZlYXR1cmVQcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249SkFYLVdTIFRvb2xzIFVzZXIgRG9jdW1lbnRhdGlvbgotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi0gQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS5cblwKLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi0gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9ZXBsLXYxMC5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjU1OTk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjAuNS4wIgotICAgICAgcHJvdmlkZXItbmFtZT0iJWZlYXR1cmVQcm92aWRlciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMmcXVvdDsiLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+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+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjNWUzMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMDQ1YjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1MmYwMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1RodSBKYW4gMTAgMDk6MjA6NTQgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGM5MWZjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cwotQnVuZGxlLVZlcnNpb246IDAuNC4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IlszLjguMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzO2J1bmRsZS12ZXJzaW9uPSJbMC41LjAsMC42LjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzO2J1bmRsZS12ZXJzaW9uPSJbMC4xLjAsMC4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHM7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHM7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHM7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cztidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZjkwZDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNvdXJjZS4uID0gc3JjLwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MDQyNDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNQcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMKLUJ1bmRsZS1OYW1lLjAgPSBUZXN0cyBQbHVnLWluCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9jeGYvdGVzdHMvQWxsVGVzdHNTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2N4Zi90ZXN0cy9BbGxUZXN0c1N1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NDQ2NzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2N4Zi90ZXN0cy9BbGxUZXN0c1N1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzLkpBWEJDb3JlVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0cy5KQVhXU0Fubm90YXRpb25WYWxpZGF0aW9uVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLkpBWFdTQ29yZVRlc3RTdWl0ZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHNwZWNpZmllcyBhbGwgdGhlIGJ1bmRsZXMgb2YgdGhpcyBjb21wb25lbnQgdGhhdCBwcm92aWRlIGEgdGVzdAotICogc3VpdGUgdG8gcnVuIGR1cmluZyBhdXRvbWF0ZWQgdGVzdGluZy4KLSAqLwotcHVibGljIGNsYXNzIEFsbFRlc3RzU3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0KLQlwdWJsaWMgQWxsVGVzdHNTdWl0ZSgpIHsKLQkJc3VwZXIoIkFsbCBKQVhXUyBhbmQgSkFYQiBUZXN0IFN1aXRlcyIpOwotCQlhZGRUZXN0KEpBWFdTQ29yZVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChKQVhXU0Fubm90YXRpb25WYWxpZGF0aW9uVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KEpBWEJDb3JlVGVzdFN1aXRlLnN1aXRlKCkpOwotCQkKLQkJLy9BZGRpbmcgSkFYLVdTIERPTSBUb29scyB0ZXN0IHN1aXRlcyBmb3IgYSB0cmlhbCBydW4KLQkJYWRkVGVzdChvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLmRvbS5BbGxUZXN0c1N1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5BbGxUZXN0c1N1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMuQWxsVGVzdHNTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuQWxsVGVzdHNTdWl0ZS5zdWl0ZSgpKTsJCi0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBqdXN0IG5lZWQgdG8gcnVuIGluIGEgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgd29ya2JlbmNoLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RBbGwoKSB7Ci0JCS8vIHRoaXMgbWV0aG9kIG5lZWRzIHRvIGV4aXN0LCBidXQgZG9lc24ndCByZWFsbHkgZG8gYW55dGhpbmcKLQkJLy8gb3RoZXIgdGhhbiB0byBzaWduYWwgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0JCS8vIFRoZSByZXN0IGl0IGF1dG9tYXRpYyBmcm9tIHRoZSB0ZXN0cyBhZGRlZCBpbiBjb25zdHJ1Y3Rvci4KLQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9jeGYvdGVzdHMvRWFzeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9jeGYvdGVzdHMvRWFzeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyZTcwNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvY3hmL3Rlc3RzL0Vhc3lUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBFYXN5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCS8qKgotCSAqIHNpbXBsZSB0ZXN0IGp1c3QgdG8gYWx3YXlzIHN1Y2NlZWQgdG8gZGVtb25zdHJhdGUgdGVzdHMgYXJlIGJlaW5nIGNhbGxlZAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RUaGF0VGVzdHNSdW4oKSB7Ci0JCWFzc2VydFRydWUodHJ1ZSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy90ZXN0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YmFmZTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QKLSAgICBuYW1lPSJ0ZXN0c3VpdGUiCi0gICAgZGVmYXVsdD0icnVuIgotICAgIGJhc2VkaXI9Ii4iPgotCi0gICAgPCEtLSAKLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQKLSAgICAgICAgIHNvIHdlJ2xsIGZhaWwgZmFzdCBpZiBub3QuIAotICAgICAgICAgICAgICR7ZWNsaXBzZS1ob21lfSAgIAotICAgICAgICAgICAgICR7YnVpbGREaXJlY3Rvcnl9Ci0gICAgICAgICAgICAgJHtidWlsZExhYmVsfSAgICAgICAgCi0gICAgLS0+Ci0gIAotICAJPGZhaWwKLSAgICAgICAgbWVzc2FnZT0iRXJyb3I6IG1pc3NpbmcgcHJvcGVydHkuIGVjbGlwc2UtaG9tZSBtdXN0IGJlIHByb3ZpZGVkIgotICAgICAgICB1bmxlc3M9ImVjbGlwc2UtaG9tZSIgLz4KLSAgICA8ZmFpbAotICAgICAgICBtZXNzYWdlPSJFcnJvcjogbWlzc2luZyBwcm9wZXJ0eS4gYnVpbGREaXJlY3RvcnkgbXVzdCBiZSBwcm92aWRlZCIKLSAgICAgICAgdW5sZXNzPSJidWlsZERpcmVjdG9yeSIgLz4KLSAgICA8ZmFpbAotICAgICAgICBtZXNzYWdlPSJFcnJvcjogbWlzc2luZyBwcm9wZXJ0eS4gYnVpbGRMYWJlbCBtdXN0IGJlIHByb3ZpZGVkIgotICAgICAgICB1bmxlc3M9ImJ1aWxkTGFiZWwiIC8+Ci0JCi0gICAgPCEtLSBzaG91bGQgYmUgbGl0dGxlIG5lZWQgdG8gY2hhbmdlIHdoYXQncyBhYm92ZSAgLS0+Ci0JCi0gICAgPHByb3BlcnR5Ci0gICAgICAgIG5hbWU9InBsdWdpbi1uYW1lIgotICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cyIvPgotICAgIDxwcm9wZXJ0eQotICAgICAgICBuYW1lPSJjbGFzc25hbWUiCi0gICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzLkFsbFRlc3RzU3VpdGUiLz4KLSAgICA8cHJvcGVydHkKLSAgICAgICAgbmFtZT0idGVzdFR5cGUiCi0gICAgICAgIHZhbHVlPSJ1aS10ZXN0Ii8+Ci0KLSAgICA8IS0tIHNob3VsZCBiZSBsaXR0bGUgbmVlZCB0byBjaGFuZ2Ugd2hhdCdzIGJlbG93IC0tPgotICAgIDxlY2hvCi0gICAgICAgIG1lc3NhZ2U9ImJhc2VkaXI6ICR7YmFzZWRpcn0iLz4KLSAgICA8ZWNobwotICAgICAgICBtZXNzYWdlPSJlY2xpcHNlLWhvbWU6ICR7ZWNsaXBzZS1ob21lfSIvPgotICAgIDxlY2hvCi0gICAgICAgIG1lc3NhZ2U9ImJ1aWxkRGlyZWN0b3J5OiAke2J1aWxkRGlyZWN0b3J5fSIvPgotICAgIDxlY2hvCi0gICAgICAgIG1lc3NhZ2U9InBsdWdpbi1uYW1lOiAke3BsdWdpbi1uYW1lfSIvPgotICAgIDxlY2hvCi0gICAgICAgIG1lc3NhZ2U9ImNsYXNzbmFtZTogJHtjbGFzc25hbWV9Ii8+Ci0gICAgPGVjaG8KLSAgICAgICAgbWVzc2FnZT0idGVzdFR5cGUgJHt0ZXN0VHlwZX0iLz4KLSAgICA8cHJvcGVydHkKLSAgICAgICAgbmFtZT0ibGlicmFyeS1maWxlIgotICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdF8zLjEuMC9saWJyYXJ5LnhtbCIvPgotICAgIDxwcm9wZXJ0eQotICAgICAgICBuYW1lPSJ3b3Jrc3BhY2UiCi0gICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vanVuaXR3b3Jrc3BhY2VzLyR7cGx1Z2luLW5hbWV9Ii8+Ci0JICA8ZWNobyAKLQkgICAgICBtZXNzYWdlPSJ3b3Jrc3BhY2U6ICR7d29ya3NwYWNlfSIgLz4KLSAgICA8IS0tCi0gICAgICAgIFRoaXMgaW5pdCB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lCi0gICAgICAgIGZvciBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbAotICAgICAgICB0ZXN0cyBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gCi0gICAgLS0+Ci0gICAgPHRhcmdldAotICAgICAgICBuYW1lPSJpbml0Ij4KLSAgICAgICAgPHRzdGFtcC8+Ci0gICAgICAgIDxkZWxldGU+Ci0gICAgICAgICAgICA8ZmlsZXNldAotICAgICAgICAgICAgICAgIGRpcj0iJHtlY2xpcHNlLWhvbWV9IgotICAgICAgICAgICAgICAgIGluY2x1ZGVzPSIke3BsdWdpbi1uYW1lfS4qeG1sIi8+Ci0gICAgICAgIDwvZGVsZXRlPgotICAgICAgICA8IS0tIG1ha2UgZGlyZWN0b3J5LCBpbiBjYXNlIHBhdGggZG9lc24ndCBleGlzdCB5ZXQgLS0+Ci0gICAgICAgIDxta2RpcgotICAgICAgICAgICAgZGlyPSIke3dvcmtzcGFjZX0iLz4KLSAgICAgICAgPCEtLSAgYnV0IGRlbGV0ZSB0byBtYWtlIHN1cmUgZnJlc2ggY29udGVudHMtLT4KLSAgICAgICAgPGRlbGV0ZQotICAgICAgICAgICAgZGlyPSIke3dvcmtzcGFjZX0iCi0gICAgICAgICAgICBxdWlldD0idHJ1ZSIvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgICA8dGFyZ2V0Ci0gICAgICAgIG5hbWU9InN1aXRlIj4KLSAgICAgICAgPGFudAotICAgICAgICAgICAgdGFyZ2V0PSIke3Rlc3RUeXBlfSIKLSAgICAgICAgICAgIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIKLSAgICAgICAgICAgIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9ImRhdGEtZGlyIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke3dvcmtzcGFjZX0iLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9InBsdWdpbi1uYW1lIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZT0iY2xhc3NuYW1lIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke2NsYXNzbmFtZX0iLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9InBsdWdpbi1wYXRoIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotICAgICAgICA8L2FudD4KLSAgICAgICAgPGNvcHkKLSAgICAgICAgICAgIGZhaWxvbmVycm9yPSJmYWxzZSIKLSAgICAgICAgICAgIGZpbGU9IiR7d29ya3NwYWNlfS8ubWV0YWRhdGEvLmxvZyIKLSAgICAgICAgICAgIHRvZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vJHtidWlsZExhYmVsfS90ZXN0UmVzdWx0cy9jb25zb2xlbG9ncy8ke3BsdWdpbi1uYW1lfS5jb25zb2xlbG9nLnR4dCIvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0gICAgPCEtLQotICAgICAgICBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvCi0gICAgLS0+Ci0gICAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotICAgIDx0YXJnZXQKLSAgICAgICAgbmFtZT0iY2xlYW51cCI+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgICAgIHVzdWFsbHkgbm8gbmVlZCB0byBkZWxldGUgd29ya3NwYWNlIHVudGlsIG5leHQgcnVuLCBhbmQKLSAgICAgICAgICAgIGxlYXZpbmcgaXQgYWxsb3dzIGluc3BlY3Rpb24KLSAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPGRlbGV0ZSBkaXI9IiR7d29ya3NwYWNlfSIgcXVpZXQ9InRydWUiIC8+IC0tPgotICAgIDwvdGFyZ2V0PgotICAgIDwhLS0KLSAgICAgICAgVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbgotICAgIC0tPgotICAgIDwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLSAgICA8dGFyZ2V0Ci0gICAgICAgIG5hbWU9InJ1biIKLSAgICAgICAgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICAgICAgPGFudAotICAgICAgICAgICAgdGFyZ2V0PSJjb2xsZWN0IgotICAgICAgICAgICAgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IgotICAgICAgICAgICAgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZT0iaW5jbHVkZXMiCi0gICAgICAgICAgICAgICAgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Lip4bWwiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9Im91dHB1dC1maWxlIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICAgICAgPC9hbnQ+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTMwY2I3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlNGFkYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDQwMDIxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jVGh1IE1heSAwNyAxNTo0MDoyMyBJU1QgMjAwOQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzNlN2U5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cwotQnVuZGxlLVZlcnNpb246IDAuMS4xLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IlszLjguMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNS4wIiwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTtidW5kbGUtdmVyc2lvbj0iMC41LjAiLAotIG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIgotSW1wb3J0LVBhY2thZ2U6IGphdmF4LnhtbC5iaW5kO3ZlcnNpb249IlsyLjEuMCwyLjIuMCkiLAotIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb247dmVyc2lvbj0iWzIuMS4wLDIuMi4wKSIsCi0gamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVyczt2ZXJzaW9uPSJbMi4xLjAsMi4yLjApIiwKLSBqYXZheC54bWwuYmluZC5hdHRhY2htZW50O3ZlcnNpb249IlsyLjEuMCwyLjIuMCkiLAotIGphdmF4LnhtbC5iaW5kLmhlbHBlcnM7dmVyc2lvbj0iWzIuMS4wLDIuMi4wKSIsCi0gamF2YXgueG1sLmJpbmQudXRpbDt2ZXJzaW9uPSJbMi4xLjAsMi4yLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2YTAzMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMTksIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkM2JjNzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhN2VhNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgUHJvZ3Jlc3MgU29mdHdhcmUKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI3Byb3BlcnRpZXMgZmlsZSBmb3IgSkFYQiBUb29scyBUZXN0cwotcGx1Z2luTmFtZT1KQVhCIFRvb2xzIFRlc3RzIChJbmN1YmF0aW9uKQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL0Fic3RyYWN0QW5ub3RhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvQWJzdHJhY3RBbm5vdGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDc4Zjg1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvQWJzdHJhY3RBbm5vdGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBQcm9ncmVzcyBTb2Z0d2FyZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkFTVFJld3JpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5QZXJmb3JtQ2hhbmdlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcm90ZWN0ZWQgVGVzdEphdmFQcm9qZWN0IHRlc3RKYXZhUHJvamVjdDsKLSAgICBwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2U7Ci0gICAgcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQ7Ci0gICAgcHJvdGVjdGVkIEFTVCBhc3Q7Ci0gICAgcHJvdGVjdGVkIEFTVFJld3JpdGUgcmV3cml0ZXI7Ci0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gYW5ub3RhdGlvbjsKLSAgICBwcm90ZWN0ZWQgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2U7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdEphdmFQcm9qZWN0ID0gbmV3IFRlc3RKYXZhUHJvamVjdCgiSmF2YVByb2plY3QiKTsKLSAgICAgICAgdGVzdEphdmFQcm9qZWN0LnNldEF1dG9CdWlsZGluZyhpc0F1dG9CdWlsZGluZ0VuYWJsZWQoKSk7Ci0gICAgICAgIHRlc3RKYXZhUHJvamVjdC5lbmFibGVBbm5vdGF0aW9uUHJvY2Vzc2luZyhpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpKTsKLQotICAgICAgICBzb3VyY2UgPSB0ZXN0SmF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGdldFBhY2thZ2VOYW1lKCksIGdldENsYXNzTmFtZSgpLCBnZXRDbGFzc0NvbnRlbnRzKCkpOwotICAgICAgICAKLSAgICAgICAgY29tcGlsYXRpb25Vbml0ID0gQW5ub3RhdGlvblV0aWxzLmdldEFTVFBhcnNlcihzb3VyY2UsIGZhbHNlKTsKLSAgICAgICAgYXN0ID0gY29tcGlsYXRpb25Vbml0LmdldEFTVCgpOwotICAgICAgICByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKGFzdCk7Ci0gICAgICAgIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHRleHRGaWxlQ2hhbmdlID0gQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVRleHRGaWxlQ2hhbmdlKCJBQyIsIChJRmlsZSkgc291cmNlLmdldFJlc291cmNlKCkpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0F1dG9CdWlsZGluZ0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENsYXNzTmFtZSgpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgQ2hhbmdlIGNoYW5nZSkgewotICAgICAgICBpZiAoY2hhbmdlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNoYW5nZS5pbml0aWFsaXplVmFsaWRhdGlvbkRhdGEobW9uaXRvcik7Ci0KLSAgICAgICAgUGVyZm9ybUNoYW5nZU9wZXJhdGlvbiBjaGFuZ2VPcGVyYXRpb24gPSBuZXcgUGVyZm9ybUNoYW5nZU9wZXJhdGlvbihjaGFuZ2UpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjaGFuZ2VPcGVyYXRpb24ucnVuKG1vbml0b3IpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBjZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hhbmdlT3BlcmF0aW9uLmNoYW5nZUV4ZWN1dGVkKCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RKYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvUGFja2FnZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvUGFja2FnZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY4MjFmYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub1BhY2thZ2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFByb2dyZXNzIFNvZnR3YXJlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRBbm5vdGF0aW9uVG9QYWNrYWdlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAicGFja2FnZS1pbmZvLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgcmV0dXJuICJwYWNrYWdlIGNvbS5leGFtcGxlO1xuIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBsb2NhdGlvblZQID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgImxvY2F0aW9uIiwgInVyaTpzb21lU2NoZW1hIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVzcGFjZVZQID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgIm5hbWVzcGFjZSIsICJ1cmk6dGVzdE5TIik7Ci0gICAgICAgIAotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChsb2NhdGlvblZQKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobmFtZXNwYWNlVlApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVBbm5vdGF0aW9uKGFzdCwgWG1sU2NoZW1hLmNsYXNzLCBYbWxTY2hlbWEuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLAotICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbm5vdGF0aW9uVG9QYWNrYWdlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhYbWxTY2hlbWEuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgSVBhY2thZ2VEZWNsYXJhdGlvbiBteVBhY2thZ2UgPSBzb3VyY2UuZ2V0UGFja2FnZURlY2xhcmF0aW9uKGdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChteVBhY2thZ2UpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkQW5ub3RhdGlvblRvUGFja2FnZURlY2xhcmF0aW9uKHNvdXJjZSwgY29tcGlsYXRpb25Vbml0LmdldFBhY2thZ2UoKSwgcmV3cml0ZXIsIGFubm90YXRpb24sIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRJbXBvcnRFZGl0KGNvbXBpbGF0aW9uVW5pdCwgWG1sU2NoZW1hLmNsYXNzLCB0ZXh0RmlsZUNoYW5nZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG15UGFja2FnZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL0pBWEJDb3JlVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL0pBWEJDb3JlVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZWEwMTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9KQVhCQ29yZVRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBQcm9ncmVzcyBTb2Z0d2FyZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBPaXNpbiBIdXJsZXkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpBWEJDb3JlVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCQ29yZVRlc3RTdWl0ZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSkFYQkNvcmVUZXN0U3VpdGUoKSB7Ci0gICAgICAgIHN1cGVyKCJKQVhCIENvcmUgVGVzdHMiKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKEFkZEFubm90YXRpb25Ub1BhY2thZ2VUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFJlbW92ZUFubm90YXRpb25Gcm9tUGFja2FnZVRlc3QuY2xhc3MpOyAgICAKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tUGFja2FnZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21QYWNrYWdlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWY4MTM1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21QYWNrYWdlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBQcm9ncmVzcyBTb2Z0d2FyZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVBbm5vdGF0aW9uRnJvbVBhY2thZ2VUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJwYWNrYWdlLWluZm8uamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigiQFhtbFNjaGVtYVxuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hO1xuXG4iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUFubm90YXRpb24oYXN0LCBYbWxTY2hlbWEuY2xhc3MsIFhtbFNjaGVtYS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb25Gcm9tUGFja2FnZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoWG1sU2NoZW1hLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLSAgICAgICAgICAgIElQYWNrYWdlRGVjbGFyYXRpb24gbXlQYWNrYWdlID0gc291cmNlLmdldFBhY2thZ2VEZWNsYXJhdGlvbihnZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobXlQYWNrYWdlKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChteVBhY2thZ2UsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLnJlbW92ZUFubm90YXRpb25Gcm9tUGFja2FnZURlY2xhcmF0aW9uKHNvdXJjZSwgY29tcGlsYXRpb25Vbml0LmdldFBhY2thZ2UoKSwgcmV3cml0ZXIsIGFubm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEZhbHNlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG15UGFja2FnZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL1Rlc3RKYXZhUHJvamVjdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9UZXN0SmF2YVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmNGZjNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL1Rlc3RKYXZhUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUHJvZ3Jlc3MgU29mdHdhcmUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmUudXRpbC5BcHRDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGwyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLQotcHVibGljIGNsYXNzIFRlc3RKYXZhUHJvamVjdCBleHRlbmRzIFRlc3RQcm9qZWN0IHsKLSAgICBwcml2YXRlIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLSAgICAKLSAgICBwdWJsaWMgVGVzdEphdmFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBzdXBlcihwcm9qZWN0TmFtZSk7Ci0gICAgICAgIGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGdldFByb2plY3QoKSk7Ci0gICAgICAgIGFkZFByb2plY3ROYXR1cmUoZ2V0UHJvamVjdCgpLCBKYXZhQ29yZS5OQVRVUkVfSUQpOwotCi0gICAgICAgIGphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXcgSUNsYXNzcGF0aEVudHJ5WzBdLCBudWxsKTsKLQotICAgICAgICBjcmVhdGVTb3VyY2VGb2xkZXIoKTsKLSAgICAgICAgYWRkVG9DbGFzc3BhdGgoamF2YVByb2plY3QsIGdldEpSRUNvbnRhaW5lckVudHJ5KCkpOwotICAgICAgICBjcmVhdGVPdXRwdXRGb2xkZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0QXV0b0J1aWxkaW5nKGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElXb3Jrc3BhY2VEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICBkZXNjcmlwdGlvbi5zZXRBdXRvQnVpbGRpbmcoYXV0b0J1aWxkKTsKLSAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZW5hYmxlQW5ub3RhdGlvblByb2Nlc3NpbmcoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgQXB0Q29uZmlnLnNldEVuYWJsZWQoamF2YVByb2plY3QsIGVuYWJsZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSUNsYXNzcGF0aEVudHJ5IGdldEpSRUNvbnRhaW5lckVudHJ5KCkgewotICAgICAgICBJVk1JbnN0YWxsIGRlZmF1bHRWTUluc3RhbGwgPSBKYXZhUnVudGltZS5nZXREZWZhdWx0Vk1JbnN0YWxsKCk7Ci0gICAgICAgIGlmIChkZWZhdWx0Vk1JbnN0YWxsICE9IG51bGwgJiYgaXNKYXZhNk9yR3JlYXRlckpSRShkZWZhdWx0Vk1JbnN0YWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIEphdmFSdW50aW1lLmdldERlZmF1bHRKUkVDb250YWluZXJFbnRyeSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBJVk1JbnN0YWxsVHlwZVtdIGluc3RhbGxUeXBlcyA9IEphdmFSdW50aW1lLmdldFZNSW5zdGFsbFR5cGVzKCk7Ci0gICAgICAgIGZvciAoSVZNSW5zdGFsbFR5cGUgaW5zdGFsbFR5cGUgOiBpbnN0YWxsVHlwZXMpIHsKLSAgICAgICAgICAgIElWTUluc3RhbGxbXSB2bUluc3RhbGxzID0gaW5zdGFsbFR5cGUuZ2V0Vk1JbnN0YWxscygpOwotICAgICAgICAgICAgZm9yIChJVk1JbnN0YWxsIHZtSW5zdGFsbCA6IHZtSW5zdGFsbHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNKYXZhNk9yR3JlYXRlckpSRSh2bUluc3RhbGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShKYXZhUnVudGltZS5uZXdKUkVDb250YWluZXJQYXRoKGluc3RhbGxUeXBlLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm1JbnN0YWxsLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIEphdmFSdW50aW1lLmdldERlZmF1bHRKUkVDb250YWluZXJFbnRyeSgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNKYXZhNk9yR3JlYXRlckpSRShJVk1JbnN0YWxsIHZtSW5zdGFsbCkgewotICAgICAgICBpZiAodm1JbnN0YWxsIGluc3RhbmNlb2YgSVZNSW5zdGFsbDIpIHsKLSAgICAgICAgICAgIElWTUluc3RhbGwyIHZtSW5zdGFsbDIgPSAoSVZNSW5zdGFsbDIpIHZtSW5zdGFsbDsKLSAgICAgICAgICAgIGlmICh2bUluc3RhbGwyLmdldEphdmFWZXJzaW9uKCkuY29tcGFyZVRvKEphdmFDb3JlLlZFUlNJT05fMV82KSA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0KFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBjb250ZW50cykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChuYW1lLCBjb250ZW50cywgZmFsc2UsIG1vbml0b3IpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgZ2V0UGFja2FnZUZyYWdtZW50KFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkuY3JlYXRlUGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lLCB0cnVlLCBtb25pdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkgewotICAgICAgICByZXR1cm4gZ2V0SmF2YVByb2plY3QoKS5nZXRQYWNrYWdlRnJhZ21lbnRSb290KGdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYyIpKTsgICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlU291cmNlRm9sZGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJRm9sZGVyIHNyY0RpciA9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYyIpOwotICAgICAgICBta2RpcnMoc3JjRGlyKTsgICAgCi0gICAgICAgIGFkZFRvQ2xhc3NwYXRoKGphdmFQcm9qZWN0LCBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShzcmNEaXIuZ2V0RnVsbFBhdGgoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVPdXRwdXRGb2xkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElGb2xkZXIgb3V0cHV0RGlyID0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcigiYmluIik7Ci0gICAgICAgIG1rZGlycyhvdXRwdXREaXIpOwotICAgICAgICBnZXRKYXZhUHJvamVjdCgpLnNldE91dHB1dExvY2F0aW9uKG91dHB1dERpci5nZXRGdWxsUGF0aCgpLCBtb25pdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gamF2YVByb2plY3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFRvQ2xhc3NwYXRoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5IGNsYXNzcGF0aEVudHJ5KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBjdXJyZW50Q2xhc3NwYXRoRW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotICAgICAgICAgICAgSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoRW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbY3VycmVudENsYXNzcGF0aEVudHJpZXMubGVuZ3RoICsgMV07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGN1cnJlbnRDbGFzc3BhdGhFbnRyaWVzLCAwLCBuZXdDbGFzc3BhdGhFbnRyaWVzLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudENsYXNzcGF0aEVudHJpZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIG5ld0NsYXNzcGF0aEVudHJpZXNbY3VycmVudENsYXNzcGF0aEVudHJpZXMubGVuZ3RoXSA9IGNsYXNzcGF0aEVudHJ5OwotICAgICAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aEVudHJpZXMsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBqbWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvVGVzdFByb2plY3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvVGVzdFByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1NWUzNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL1Rlc3RQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFByb2dyZXNzIFNvZnR3YXJlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotCi1wdWJsaWMgY2xhc3MgVGVzdFByb2plY3QgewotICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0KLSAgICBwcml2YXRlIElQcm9qZWN0IHRlc3RQcm9qZWN0OwotICAgIAotICAgIHB1YmxpYyBUZXN0UHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgIHRlc3RQcm9qZWN0ID0gd29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgdGVzdFByb2plY3QuY3JlYXRlKG1vbml0b3IpOwotICAgICAgICB0ZXN0UHJvamVjdC5vcGVuKG1vbml0b3IpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIHRlc3RQcm9qZWN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9qZWN0TmF0dXJlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBuYXR1cmUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElQcm9qZWN0RGVzY3JpcHRpb24gcHJvamVjdERlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgU3RyaW5nW10gcHJldmlvdXNOYXR1cmVzID0gcHJvamVjdERlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotICAgICAgICAgICAgU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbcHJldmlvdXNOYXR1cmVzLmxlbmd0aCArIDFdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwcmV2aW91c05hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDAsIHByZXZpb3VzTmF0dXJlcy5sZW5ndGgpOwotICAgICAgICAgICAgbmV3TmF0dXJlc1twcmV2aW91c05hdHVyZXMubGVuZ3RoXSA9IG5hdHVyZTsKLSAgICAgICAgICAgIHByb2plY3REZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0gICAgICAgICAgICBwcm9qZWN0LnNldERlc2NyaXB0aW9uKHByb2plY3REZXNjcmlwdGlvbiwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGNlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG1rZGlycyhmaW5hbCBJRm9sZGVyIGZvbGRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBpZiAoIWZvbGRlci5leGlzdHMoKSkgewotICAgICAgICAgICAgaWYgKGZvbGRlci5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLSAgICAgICAgICAgICAgICBta2RpcnMoKElGb2xkZXIpIGZvbGRlci5nZXRQYXJlbnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MzBjYjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjQzZmNiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDQwMDIxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI1RodSBNYXkgMDcgMTU6NDA6MjMgSVNUIDIwMDkKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGQ0OGFlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzCi1CdW5kbGUtVmVyc2lvbjogMC41LjEucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iWzMuOC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZTtidW5kbGUtdmVyc2lvbj0iMC41LjAiLAotIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmc7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3Jpbmc7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlO2J1bmRsZS12ZXJzaW9uPSIwLjUuMCIsCi0gb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiCi1JbXBvcnQtUGFja2FnZTogamF2YXguandzLAotIGphdmF4Lmp3cy5zb2FwLAotIGphdmF4LnhtbC53czt2ZXJzaW9uPSIyLjEuMCIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHMsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjZhMDMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMTksIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQzYmM3NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDk5NzExLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlIGFuZCBvdGhlcnMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI3Byb3BlcnRpZXMgZmlsZSBmb3IgSkFYLVdTIFRvb2xzIFRlc3RzCi1wbHVnaW5OYW1lPUpBWC1XUyBUb29scyBUZXN0cyAoSW5jdWJhdGlvbikKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTVhZDAwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy5BYnN0cmFjdEFubm90YXRpb25UZXN0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQXV0b0J1aWxkaW5nRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdERvY3VtZW50QmFyZVZhbGlkYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0RG9jdW1lbnRCYXJlVmFsaWRhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg1OWI3OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0RG9jdW1lbnRCYXJlVmFsaWRhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERvY3VtZW50QmFyZVZhbGlkYXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLSAgICAgICAgCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJzdHlsZSIsIFN0eWxlLkRPQ1VNRU5UKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdXNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInVzZSIsIFVzZS5MSVRFUkFMKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAicGFyYW1ldGVyU3R5bGUiLCBQYXJhbWV0ZXJTdHlsZS5CQVJFKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzdHlsZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHVzZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUFubm90YXRpb24oYXN0LCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5jbGFzcywKLSAgICAgICAgICAgICAgICBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgU3RyaW5nIG9uZUlOKFN0cmluZyBpbk9uZSwgU3RyaW5nIGluVHdvKSB7XG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH0iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0T25ld2F5VmFsaWRhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RPbmV3YXlWYWxpZGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTAwNzdjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RPbmV3YXlWYWxpZGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9uZXdheVZhbGlkYXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVBbm5vdGF0aW9uKGFzdCwgT25ld2F5LmNsYXNzLCBPbmV3YXkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpOwotICAgIAotICAgIHB1YmxpYyBhYnN0cmFjdCBJTWV0aG9kIGdldE1ldGhvZFRvVGVzdCgpOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RPbmV3YXlSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhPbmV3YXkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IGdldE1ldGhvZFRvVGVzdCgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkSW1wb3J0RWRpdChjb21waWxhdGlvblVuaXQsIE9uZXdheS5jbGFzcywgdGV4dEZpbGVDaGFuZ2UsIHRydWUpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkQW5ub3RhdGlvblRvTWV0aG9kKHNvdXJjZSwgY29tcGlsYXRpb25Vbml0LCByZXdyaXRlciwgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLCB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGdldEVycm9yTWVzc2FnZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0U09BUEJpbmRpbmdWYWxpZGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdFNPQVBCaW5kaW5nVmFsaWRhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1ZTI3Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0U09BUEJpbmRpbmdWYWxpZGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U09BUEJpbmRpbmdWYWxpZGF0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdHB1YmxpYyBTdHJpbmcgbXlNZXRob2QoU3RyaW5nIGluKSB7Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0V2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdFdlYk1ldGhvZFB1YmxpY1N0YXRpY0ZpbmFsUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlkYWM5YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0V2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdlYk1ldGhvZFB1YmxpY1N0YXRpY0ZpbmFsUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUFubm90YXRpb24oYXN0LCBXZWJNZXRob2QuY2xhc3MsIFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkBXZWJTZXJ2aWNlKG5hbWU9XCJNeUNsYXNzXCIpXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdFN0cmluZyBteVBhY2thZ2VQcml2YXRlTWV0aG9kKCkge1xuXHRcdHJldHVybiBcInBhY2thZ2UtcHJpdmF0ZVwiO1xuXHR9XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwcml2YXRlIFN0cmluZyBteVByaXZhdGVNZXRob2QoKSB7XG5cdFx0cmV0dXJuIFwicHJpdmF0ZVwiO1xuXHR9XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwcm90ZWN0ZWQgU3RyaW5nIG15UHJvdGVjdGVkTWV0aG9kKCkge1xuXHRcdG15UHJpdmF0ZU1ldGhvZCgpO1xuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdFx0cmV0dXJuIFwicHJvdGVjdGVkXCI7XG5cdH1cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgc3RhdGljIFN0cmluZyBteVN0YXRpY01ldGhvZCgpIHtcblx0XHRyZXR1cm4gXCJzdGF0aWNcIjtcblx0fVxuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0cHVibGljIGZpbmFsIFN0cmluZyBteUZpbmFsTWV0aG9kKCkge1xuXHRcdHJldHVybiBcImZpbmFsXCI7XG5cdH1cblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBhYnN0cmFjdCBJTWV0aG9kIGdldE1ldGhvZFRvVGVzZXQoKTsKLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpOwotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYk1ldGhvZFJlc3RyaWN0aW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IGdldE1ldGhvZFRvVGVzZXQoKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEltcG9ydEVkaXQoY29tcGlsYXRpb25Vbml0LCBXZWJNZXRob2QuY2xhc3MsIHRleHRGaWxlQ2hhbmdlLCB0cnVlKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb25Ub01ldGhvZChzb3VyY2UsIGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiwgdGV4dEZpbGVDaGFuZ2UpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhnZXRFcnJvck1lc3NhZ2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RXZWJTZXJ2aWNlUHVibGljQWJzdHJhY3RGaW5hbFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0V2ViU2VydmljZVB1YmxpY0Fic3RyYWN0RmluYWxSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmVhYTU1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RXZWJTZXJ2aWNlUHVibGljQWJzdHJhY3RGaW5hbFJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0V2ViU2VydmljZVB1YmxpY0Fic3RyYWN0RmluYWxSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgIm5hbWUiLCAiTXlDbGFzcyIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBwb3J0TmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAicG9ydE5hbWUiLAotICAgICAgICAgICAgICAgICJNeUNsYXNzUG9ydCIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzZXJ2aWNlTmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJzZXJ2aWNlTmFtZSIsICJNeUNsYXNzU2VydmljZSIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAidGFyZ2V0TmFtZXNwYWNlIiwgImh0dHA6Ly9leGFtcGxlLmNvbS8iKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChuYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocG9ydE5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzZXJ2aWNlTmFtZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcywgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIAotICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuYWRkSW1wb3J0RWRpdChjb21waWxhdGlvblVuaXQsIFdlYlNlcnZpY2UuY2xhc3MsIHRleHRGaWxlQ2hhbmdlLCB0cnVlKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb25Ub1R5cGUoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLCAKLSAgICAgICAgICAgICAgICAgICAgc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uLCB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfUFVCTElDX0FCU1RSQUNUX0ZJTkFMLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0V2ViU2VydmljZVNFSVJ1bGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RXZWJTZXJ2aWNlU0VJUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmEwZDhlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RXZWJTZXJ2aWNlU0VJUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0V2ViU2VydmljZVNFSVJ1bGUgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICB0ZXN0SmF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGdldFBhY2thZ2VOYW1lKCksIGdldEludGVyZmFjZU5hbWUoKSwgZ2V0SW50ZXJmYWNlQ29udGVudHMoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiQFdlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uZXhhbXBsZS5NeUludGVyZmFjZVwiLCAiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInRhcmdldE5hbWVzcGFjZT1cImh0dHA6Ly9leGFtcGxlLmNvbS9cIiwgcG9ydE5hbWU9XCJNeUNsYXNzUG9ydFwiLCAiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInNlcnZpY2VOYW1lPVwiTXlDbGFzc1NlcnZpY2VcIilcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0cHVibGljIHZvaWQgbWV0aG9kT25lKFN0cmluZyBpbikge1xuXHR9XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgU3RyaW5nIG15TWV0aG9kKFN0cmluZyBpbikgeyIgKyAiXG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH1cblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbnRlcmZhY2VDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzZWlDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgc2VpQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7XG5cbiIpOwotICAgICAgICBzZWlDb250ZW50cy5hcHBlbmQoIkBXZWJTZXJ2aWNlKG5hbWU9XCJNeUludGVyZmFjZVwiLCB0YXJnZXROYW1lc3BhY2U9XCJodHRwOi8vZXhhbXBsZS5jb20vXCIpXG4iKTsKLSAgICAgICAgc2VpQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgaW50ZXJmYWNlIE15SW50ZXJmYWNlIHtcblxuIik7Ci0gICAgICAgIHNlaUNvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgU3RyaW5nIG15TWV0aG9kKFN0cmluZyBpbik7XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIHNlaUNvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15SW50ZXJmYWNlLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9Eb2NCYXJlTm9uVm9pZE5vT3V0UGFyYW1ldGVyc1J1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0RvY0JhcmVOb25Wb2lkTm9PdXRQYXJhbWV0ZXJzUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyM2UwYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0RvY0JhcmVOb25Wb2lkTm9PdXRQYXJhbWV0ZXJzUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRG9jQmFyZU5vblZvaWROb091dFBhcmFtZXRlcnNSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnRCYXJlVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlBhcmFtO1xuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgU3RyaW5nIG5vT3V0KFN0cmluZyBpbiwgQFdlYlBhcmFtKG5hbWU9XCJvdXRcIiwgbW9kZT1XZWJQYXJhbS5Nb2RlLk9VVCkgIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJTdHJpbmcgb3V0KSB7XG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH1cblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb25Wb2lkTm9PVVRQYXJhbWV0ZXJSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibm9PdXQiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiLAotICAgICAgICAgICAgICAgICAgICAiUVN0cmluZzsgIn0pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRJbXBvcnRFZGl0KGNvbXBpbGF0aW9uVW5pdCwgU09BUEJpbmRpbmcuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLCB0cnVlKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb25Ub01ldGhvZChzb3VyY2UsIGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiwgdGV4dEZpbGVDaGFuZ2UpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5ET0NfQkFSRV9OT05fVk9JRF9SRVRVUk5fTk9fSU5PVVRfT1VUX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvRG9jQmFyZU9uZU5vbkhlYWRlcklOUGFyYW1ldGVyUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvRG9jQmFyZU9uZU5vbkhlYWRlcklOUGFyYW1ldGVyUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdiMDFkOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0RvY0JhcmVPbmVOb25IZWFkZXJJTlBhcmFtZXRlclJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBEb2NCYXJlT25lTm9uSGVhZGVySU5QYXJhbWV0ZXJSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnRCYXJlVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlBhcmFtO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHQiKTsKLSAgICAgICAgLy9jbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIFN0cmluZyBvbmVJTigpIHtcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxuXG5cdCIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIFN0cmluZyBvbmVNb3JlKEBXZWJQYXJhbShuYW1lPVwiaW5PbmVcIiwgbW9kZT1XZWJQYXJhbS5Nb2RlLklOKSBTdHJpbmcgIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbk9uZSwgQFdlYlBhcmFtKG5hbWU9XCJpblR3b1wiLCBtb2RlPVdlYlBhcmFtLk1vZGUuSU4pU3RyaW5nIGluVHdvKSB7XG5cdFx0Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJyZXR1cm4gXCJ0eHRcIjtcblx0fVxuXG5cdHB1YmxpYyBTdHJpbmcgb25seU9uZUlOKFN0cmluZyBpbk9uZSwgU3RyaW5nIGluVHdvKSB7Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qCi0gICAgcHVibGljIHZvaWQgdGVzdE9uZU5vbkhlYWRlcklOUGFyYW1ldGVyUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlNPQVBCaW5kaW5nIiwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJvbmVJTiIsIG5ldyBTdHJpbmdbMF0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuZ2V0SW1wb3J0Q2hhbmdlKGNvbXBpbGF0aW9uVW5pdCwgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLCB0cnVlKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmNyZWF0ZU1ldGhvZEFubm90YXRpb25DaGFuZ2Uoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24sIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfT05FX05PTl9IRUFERVJfSU5fUEFSQU1FVEVSX0VSUk9SX01FU1NBR0UsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ki8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPbmx5T25lTm9uSGVhZGVySU5QYXJhbWV0ZXJSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgib25seU9uZUlOIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiwgCi0gICAgICAgICAgICAgICAgICAgICJRU3RyaW5nOyIgfSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEltcG9ydEVkaXQoY29tcGlsYXRpb25Vbml0LCBTT0FQQmluZGluZy5jbGFzcywgdGV4dEZpbGVDaGFuZ2UsIHRydWUpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkQW5ub3RhdGlvblRvTWV0aG9kKHNvdXJjZSwgY29tcGlsYXRpb25Vbml0LCByZXdyaXRlciwgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLCB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLkRPQ19CQVJFX09OTFlfT05FX05PTl9IRUFERVJfSU5fUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RPbmx5T25lTm9uSGVhZGVySU5QYXJhbWV0ZXJXaXRoV2ViUGFyYW1zUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm9uZU1vcmUiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiLCAKLSAgICAgICAgICAgICAgICAgICAgIlFTdHJpbmc7IiB9KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkSW1wb3J0RWRpdChjb21waWxhdGlvblVuaXQsIFNPQVBCaW5kaW5nLmNsYXNzLCB0ZXh0RmlsZUNoYW5nZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRBbm5vdGF0aW9uVG9NZXRob2Qoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24sIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfT05MWV9PTkVfTk9OX0hFQURFUl9JTl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvRG9jQmFyZVZvaWRPbmVJTk9uZU91dFBhcmFtZXRlclJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0RvY0JhcmVWb2lkT25lSU5PbmVPdXRQYXJhbWV0ZXJSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGJlYTRjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvRG9jQmFyZVZvaWRPbmVJTk9uZU91dFBhcmFtZXRlclJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBEb2NCYXJlVm9pZE9uZUlOT25lT3V0UGFyYW1ldGVyUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdERvY3VtZW50QmFyZVZhbGlkYXRpb25UZXN0IHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07XG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHQiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyB2b2lkIG9uZUluKEBXZWJQYXJhbShuYW1lPVwiaW5PbmVcIiwgbW9kZT1XZWJQYXJhbS5Nb2RlLklOT1VUKSAiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkhvbGRlcjxTdHJpbmc+IGluT25lLCBAV2ViUGFyYW0obmFtZT1cImluVHdvXCIsIG1vZGU9V2ViUGFyYW0uTW9kZS5JTikgIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJTdHJpbmcgaW5Ud28pIHtcblxuXHR9XG5cblx0Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgdm9pZCBvbmVPdXQoQFdlYlBhcmFtKG5hbWU9XCJvdXRPbmVcIiwgbW9kZT1XZWJQYXJhbS5Nb2RlLklOT1VUKSAiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkhvbGRlcjxTdHJpbmc+IG91dE9uZSwgQFdlYlBhcmFtKG5hbWU9XCJvdXRUd29cIiwgbW9kZT1XZWJQYXJhbS5Nb2RlLk9VVCkgIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJIb2xkZXI8U3RyaW5nPiBvdXRUd28pIHtcblxuXHR9XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Vm9pZE9uZUluUGFyYW1ldGVyUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm9uZUluIiwgbmV3IFN0cmluZ1tdIHsgIlFIb2xkZXI8UVN0cmluZzs+OyIsCi0gICAgICAgICAgICAgICAgICAgICJRU3RyaW5nOyJ9KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkSW1wb3J0RWRpdChjb21waWxhdGlvblVuaXQsIFNPQVBCaW5kaW5nLmNsYXNzLCB0ZXh0RmlsZUNoYW5nZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRBbm5vdGF0aW9uVG9NZXRob2Qoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24sIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfVk9JRF9SRVRVUk5fT05FX0lOX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWb2lkT25lT3V0UGFyYW1ldGVyUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm9uZU91dCIsIG5ldyBTdHJpbmdbXSB7ICJRSG9sZGVyPFFTdHJpbmc7PjsiLAotICAgICAgICAgICAgICAgICAgICAiUUhvbGRlcjxRU3RyaW5nOz47In0pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRJbXBvcnRFZGl0KGNvbXBpbGF0aW9uVW5pdCwgU09BUEJpbmRpbmcuY2xhc3MsIHRleHRGaWxlQ2hhbmdlLCB0cnVlKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb25Ub01ldGhvZChzb3VyY2UsIGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiwgdGV4dEZpbGVDaGFuZ2UpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5ET0NfQkFSRV9WT0lEX1JFVFVSTl9PTkVfT1VUX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9Ib2xkZXJUeXBlUGFyYW1ldGVyUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvSG9sZGVyVHlwZVBhcmFtZXRlclJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OTU4M2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9Ib2xkZXJUeXBlUGFyYW1ldGVyUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBIb2xkZXJUeXBlUGFyYW1ldGVyUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUFubm90YXRpb24oYXN0LCBXZWJTZXJ2aWNlLmNsYXNzLCBXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07XG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgdm9pZCBteU1ldGhvZCgiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkBXZWJQYXJhbShtb2RlPVdlYlBhcmFtLk1vZGUuSU4pIEhvbGRlcjxqYXZhLmxhbmcuU3RyaW5nPiBwYXJhbSkge1xuXG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SG9sZGVyVHlwZVBhcmFtZXRlclJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkSW1wb3J0RWRpdChjb21waWxhdGlvblVuaXQsIFdlYlNlcnZpY2UuY2xhc3MsIHRleHRGaWxlQ2hhbmdlLAotICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb25Ub1R5cGUoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLCAKLSAgICAgICAgICAgICAgICAgICAgc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uLCB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLkhPTERFUl9UWVBFX01VU1RfQkVfT1VUX0lOT1VULAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfWNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0pBWFdTQW5ub3RhdGlvblZhbGlkYXRpb25UZXN0U3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvSkFYV1NBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjg0YTFkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvSkFYV1NBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKQVhXU0Fubm90YXRpb25WYWxpZGF0aW9uVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhXU0Fubm90YXRpb25WYWxpZGF0aW9uVGVzdFN1aXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEpBWFdTQW5ub3RhdGlvblZhbGlkYXRpb25UZXN0U3VpdGUoKSB7Ci0gICAgICAgIHN1cGVyKCJKQVgtV1MgQW5ub3RhdGlvbiBWYWxpZGF0aW9uIFRlc3RzIik7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShEb2NCYXJlTm9uVm9pZE5vT3V0UGFyYW1ldGVyc1J1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKERvY0JhcmVPbmVOb25IZWFkZXJJTlBhcmFtZXRlclJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKERvY0JhcmVWb2lkT25lSU5PbmVPdXRQYXJhbWV0ZXJSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShPbmV3YXlOb1JldHVyblZhbHVlUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoT25ld2F5Tm9DaGVja2VkRXhjZXB0aW9uc1J1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKEhvbGRlclR5cGVQYXJhbWV0ZXJSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShPbmV3YXlOb0hvbGRlclBhcmFtZXRlcnNSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShTT0FQQmluZGluZ1JQQ1N0eWxlT25NZXRob2RSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShTT0FQQmluZGluZ1JQQ0VuY29kZWRSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShTT0FQQmluZGluZ0RvY3VtZW50RW5jb2RlZFJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFNPQVBCaW5kaW5nUkNQQmFyZVJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFNPQVBCaW5kaW5nTWl4ZWRCaW5kaW5nc1J1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYk1ldGhvZENoZWNrRm9yV2ViU2VydmljZVJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYk1ldGhvZEV4Y2x1ZGVSdWxlT25TRUlUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYk1ldGhvZEV4Y2x1ZGVSdWxlT25JbXBsVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJNZXRob2ROb1BhY2thZ2VQcml2YXRlTWV0aG9kUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViTWV0aG9kTm9Qcml2YXRlTWV0aG9kUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViTWV0aG9kTm9Qcm90ZWN0ZWRNZXRob2RSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJNZXRob2ROb0ZpbmFsTW9kaWZpZXJSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJNZXRob2ROb1N0YXRpY01vZGlmaWVyUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViUGFyYW1Nb2RlSG9sZGVyVHlwZVJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VEZWZhdWx0UHVibGljQ29uc3RydWN0b3JSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlTm9GaW5hbGl6ZU1ldGhvZFJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VOb0ZpbmFsTW9kaWZlclJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VOb0Fic3RyYWN0TW9kaWZpZXJSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlU0VJTm9TZXJ2aWNlTmFtZVJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VTRUlOb0VuZHBvaW50SW50ZXJmYWNlUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViU2VydmljZVNFSU5vUG9ydE5hbWVSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlU0VJTm9XZWJNZXRob2RSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlU0VJTm9XZWJSZXN1bHRSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlU0VJTm9XZWJQYXJhbVJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VTRUlOb09uZXdheVJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VTRUlOb1NPQVBCaW5kaW5nUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViU2VydmljZVdlYlNlcnZpY2VQcm92aWRlckNvRXhpc3RSdWxlVGVzdC5jbGFzcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL09uZXdheU5vQ2hlY2tlZEV4Y2VwdGlvbnNSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9PbmV3YXlOb0NoZWNrZWRFeGNlcHRpb25zUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5ZDA5YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL09uZXdheU5vQ2hlY2tlZEV4Y2VwdGlvbnNSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBPbmV3YXlOb0NoZWNrZWRFeGNlcHRpb25zUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdE9uZXdheVZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdHB1YmxpYyB2b2lkIG15TWV0aG9kKGludCBpKSB0aHJvd3MgRXhjZXB0aW9uIHtcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gSkFYV1NDb3JlTWVzc2FnZXMuT05FV0FZX05PX0NIRUNLRURfRVhDRVBUSU9OUzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1ldGhvZCBnZXRNZXRob2RUb1Rlc3QoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbXXsiSSJ9KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvT25ld2F5Tm9Ib2xkZXJQYXJhbWV0ZXJzUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvT25ld2F5Tm9Ib2xkZXJQYXJhbWV0ZXJzUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmNGE4YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL09uZXdheU5vSG9sZGVyUGFyYW1ldGVyc1J1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIE9uZXdheU5vSG9sZGVyUGFyYW1ldGVyc1J1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RPbmV3YXlWYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgdm9pZCBteU1ldGhvZCgiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkhvbGRlcjxTdHJpbmc+IGluKSB7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIEpBWFdTQ29yZU1lc3NhZ2VzLk9ORVdBWV9OT19IT0xERVJfUEFSQU1FVEVSUzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1ldGhvZCBnZXRNZXRob2RUb1Rlc3QoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbXXsiUUhvbGRlcjxRU3RyaW5nOz47In0pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9PbmV3YXlOb1JldHVyblZhbHVlUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvT25ld2F5Tm9SZXR1cm5WYWx1ZVJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYTBmOTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9PbmV3YXlOb1JldHVyblZhbHVlUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgT25ld2F5Tm9SZXR1cm5WYWx1ZVJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RPbmV3YXlWYWxpZGF0aW9uVGVzdCB7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0JICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLQkgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgaW50IG15TWV0aG9kKGludCBpKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLQl9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIEpBWFdTQ29yZU1lc3NhZ2VzLk9ORVdBWV9OT19SRVRVUk5fVkFMVUU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElNZXRob2QgZ2V0TWV0aG9kVG9UZXN0KCkgewotICAgICAgICByZXR1cm4gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nW117IkkifSk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ0RvY3VtZW50RW5jb2RlZFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nRG9jdW1lbnRFbmNvZGVkUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0Njc1MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nRG9jdW1lbnRFbmNvZGVkUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZ0RvY3VtZW50RW5jb2RlZFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTT0FQQmluZGluZ1ZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHN0eWxlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInN0eWxlIiwgU3R5bGUuRE9DVU1FTlQpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB1c2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAidXNlIiwgVXNlLkVOQ09ERUQpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBwYXJhbWV0ZXJTdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJwYXJhbWV0ZXJTdHlsZSIsIFBhcmFtZXRlclN0eWxlLkJBUkUpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHN0eWxlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodXNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlQW5ub3RhdGlvbihhc3QsIFNPQVBCaW5kaW5nLmNsYXNzLCBTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIAotICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQQmluZGluZ0RvY3VtZW50RW5jb2RlZFJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRJbXBvcnRFZGl0KGNvbXBpbGF0aW9uVW5pdCwgU09BUEJpbmRpbmcuY2xhc3MsIHRleHRGaWxlQ2hhbmdlLCB0cnVlKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb25Ub01ldGhvZChzb3VyY2UsIGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiwgdGV4dEZpbGVDaGFuZ2UpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5TT0FQQklORElOR19ET0NVTUVOVF9FTkNPREVEX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nTWl4ZWRCaW5kaW5nc1J1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nTWl4ZWRCaW5kaW5nc1J1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZWY0NTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ01peGVkQmluZGluZ3NSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZ01peGVkQmluZGluZ3NSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0U09BUEJpbmRpbmdWYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJzdHlsZSIsIFN0eWxlLkRPQ1VNRU5UKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdXNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInVzZSIsIFVzZS5MSVRFUkFMKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAicGFyYW1ldGVyU3R5bGUiLCBQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzdHlsZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHVzZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUFubm90YXRpb24oYXN0LCBTT0FQQmluZGluZy5jbGFzcywgU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCAKLSAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiQFNPQVBCaW5kaW5nKHN0eWxlPVNPQVBCaW5kaW5nLlN0eWxlLlJQQywgdXNlPVNPQVBCaW5kaW5nLlVzZS5MSVRFUkFMLCAiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInBhcmFtZXRlclN0eWxlPVNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLldSQVBQRUQpXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgU3RyaW5nIG15TWV0aG9kKFN0cmluZyBpbikgeyIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH1cblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUEJpbmRpbmdNaXhlZEJpbmRpbmdzUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15TWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEltcG9ydEVkaXQoY29tcGlsYXRpb25Vbml0LCBTT0FQQmluZGluZy5jbGFzcywgdGV4dEZpbGVDaGFuZ2UsIHRydWUpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkQW5ub3RhdGlvblRvTWV0aG9kKHNvdXJjZSwgY29tcGlsYXRpb25Vbml0LCByZXdyaXRlciwgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLCB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLlNPQVBCSU5ESU5HX05PX01JWEVEX0JJTkRJTkdTLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ1JDUEJhcmVSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ1JDUEJhcmVSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWQxZGY1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdSQ1BCYXJlUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgU09BUEJpbmRpbmdSQ1BCYXJlUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNPQVBCaW5kaW5nVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAic3R5bGUiLCBTdHlsZS5SUEMpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB1c2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAidXNlIiwgVXNlLkxJVEVSQUwpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBwYXJhbWV0ZXJTdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJwYXJhbWV0ZXJTdHlsZSIsIFBhcmFtZXRlclN0eWxlLkJBUkUpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHN0eWxlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodXNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlQW5ub3RhdGlvbihhc3QsIFNPQVBCaW5kaW5nLmNsYXNzLCBTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIAotICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUEJpbmRpbmdSUENCYXJlUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkSW1wb3J0RWRpdChjb21waWxhdGlvblVuaXQsIFNPQVBCaW5kaW5nLmNsYXNzLCB0ZXh0RmlsZUNoYW5nZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRBbm5vdGF0aW9uVG9UeXBlKHNvdXJjZSwgY29tcGlsYXRpb25Vbml0LCByZXdyaXRlciwgCi0gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbiwgdGV4dEZpbGVDaGFuZ2UpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5TT0FQQklORElOR19SUENfTk9fQkFSRV9QQVJBTUVURVJfU1RZTEUsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdSUENFbmNvZGVkUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdSUENFbmNvZGVkUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE3MGZkMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nUlBDRW5jb2RlZFJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFNPQVBCaW5kaW5nUlBDRW5jb2RlZFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTT0FQQmluZGluZ1ZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHN0eWxlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInN0eWxlIiwgU3R5bGUuUlBDKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdXNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInVzZSIsIFVzZS5FTkNPREVEKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAicGFyYW1ldGVyU3R5bGUiLCBQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzdHlsZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHVzZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUFubm90YXRpb24oYXN0LCBTT0FQQmluZGluZy5jbGFzcywgU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCAKLSAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUEJpbmRpbmdSUENFbmNvZGVkUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkSW1wb3J0RWRpdChjb21waWxhdGlvblVuaXQsIFNPQVBCaW5kaW5nLmNsYXNzLCB0ZXh0RmlsZUNoYW5nZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRBbm5vdGF0aW9uVG9UeXBlKHNvdXJjZSwgY29tcGlsYXRpb25Vbml0LCByZXdyaXRlciwgCi0gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbiwgdGV4dEZpbGVDaGFuZ2UpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5TT0FQQklORElOR19SUENfRU5DT0RFRF9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nUlBDU3R5bGVPbk1ldGhvZFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nUlBDU3R5bGVPbk1ldGhvZFJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZDA0OTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ1JQQ1N0eWxlT25NZXRob2RSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFNPQVBCaW5kaW5nUlBDU3R5bGVPbk1ldGhvZFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTT0FQQmluZGluZ1ZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHN0eWxlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInN0eWxlIiwgU3R5bGUuUlBDKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdXNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInVzZSIsIFVzZS5MSVRFUkFMKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAicGFyYW1ldGVyU3R5bGUiLCBQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzdHlsZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHVzZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUFubm90YXRpb24oYXN0LCBTT0FQQmluZGluZy5jbGFzcywgU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCAKLSAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUEJpbmRpbmdSUENTdHlsZU9uTWV0aG9kc1J1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRJbXBvcnRFZGl0KGNvbXBpbGF0aW9uVW5pdCwgU09BUEJpbmRpbmcuY2xhc3MsIHRleHRGaWxlQ2hhbmdlLCB0cnVlKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb25Ub01ldGhvZChzb3VyY2UsIGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiwgdGV4dEZpbGVDaGFuZ2UpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5TT0FQQklORElOR19OT19SUENfU1RZTEVfT05fTUVUSE9EUywKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2RDaGVja0ZvcldlYlNlcnZpY2VSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2RDaGVja0ZvcldlYlNlcnZpY2VSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDJkZjVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYk1ldGhvZENoZWNrRm9yV2ViU2VydmljZVJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgb3BlcmF0aW9uVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgIm9wZXJhdGlvbk5hbWUiLCAibXlNZXRob2QiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgYWN0aW9uVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJhY3Rpb24iLAotICAgICAgICAgICAgICAgICJ1cm46TXlNZXRob2QiKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChvcGVyYXRpb25WYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChhY3Rpb25WYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlQW5ub3RhdGlvbihhc3QsIFdlYk1ldGhvZC5jbGFzcywgV2ViTWV0aG9kLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwKLSAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgU3RyaW5nIG15TWV0aG9kKCkgeyIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJNZXRob2RDaGVja0ZvcldlYlNlcnZpY2VSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15TWV0aG9kIiwgbmV3IFN0cmluZ1swXSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRJbXBvcnRFZGl0KGNvbXBpbGF0aW9uVW5pdCwgV2ViTWV0aG9kLmNsYXNzLCB0ZXh0RmlsZUNoYW5nZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRBbm5vdGF0aW9uVG9NZXRob2Qoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24sIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX09OTFlfU1VQUE9SVEVEX09OX0NMQVNTRVNfV0lUSF9XRUJTRVJWSUNFLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2RFeGNsdWRlUnVsZU9uSW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kRXhjbHVkZVJ1bGVPbkltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YzMzM2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2RFeGNsdWRlUnVsZU9uSW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYk1ldGhvZEV4Y2x1ZGVSdWxlT25JbXBsVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG9wZXJhdGlvblZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJvcGVyYXRpb25OYW1lIiwgIm15TWV0aG9kIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGFjdGlvblZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAiYWN0aW9uIiwKLSAgICAgICAgICAgICAgICAidXJuOk15TWV0aG9kIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGV4Y2x1ZGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlQm9vbGVhbk1lbWJlclZhbHVlUGFpcihhc3QsICJleGNsdWRlIiwKLSAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG9wZXJhdGlvblZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKGFjdGlvblZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKGV4Y2x1ZGVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlQW5ub3RhdGlvbihhc3QsIFdlYk1ldGhvZC5jbGFzcywgV2ViTWV0aG9kLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwKLSAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJAV2ViU2VydmljZShuYW1lPVwiTXlDbGFzc1wiKVxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0cHVibGljIFN0cmluZyBteU1ldGhvZCgpIHsiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxuXHRcdHJldHVybiBcInR4dFwiO1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViTWV0aG9kLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbMF0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkSW1wb3J0RWRpdChjb21waWxhdGlvblVuaXQsIFdlYk1ldGhvZC5jbGFzcywgdGV4dEZpbGVDaGFuZ2UsIHRydWUpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkQW5ub3RhdGlvblRvTWV0aG9kKHNvdXJjZSwgY29tcGlsYXRpb25Vbml0LCByZXdyaXRlciwgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLCB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9FWENMVURFX1NQRUNJRklFRF9OT19PVEhFUl9BVFRSSUJVVEVTX0FMTE9XRUQsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZEV4Y2x1ZGVSdWxlT25TRUlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZEV4Y2x1ZGVSdWxlT25TRUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NTcxZjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2RFeGNsdWRlUnVsZU9uU0VJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kRXhjbHVkZVJ1bGVPblNFSVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBleGNsdWRlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUJvb2xlYW5NZW1iZXJWYWx1ZVBhaXIoYXN0LCAiZXhjbHVkZSIsCi0gICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChleGNsdWRlVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUFubm90YXRpb24oYXN0LCBXZWJNZXRob2QuY2xhc3MsIFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksCi0gICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiQFdlYlNlcnZpY2UobmFtZT1cIk15SW50ZXJmYWNlXCIpXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBpbnRlcmZhY2UgTXlDbGFzcyB7XG5cblx0cHVibGljIFN0cmluZyBteU1ldGhvZCgpO1xufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYk1ldGhvZEV4Y2x1ZGVSdWxlT25JbnRlcmZhY2UoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEltcG9ydEVkaXQoY29tcGlsYXRpb25Vbml0LCBXZWJNZXRob2QuY2xhc3MsIHRleHRGaWxlQ2hhbmdlLCB0cnVlKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb25Ub01ldGhvZChzb3VyY2UsIGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiwgdGV4dEZpbGVDaGFuZ2UpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfRVhDTFVERV9OT1RfQUxMT1dFRF9PTl9TRUksCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9GaW5hbE1vZGlmaWVyUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9GaW5hbE1vZGlmaWVyUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0ZDU2ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vRmluYWxNb2RpZmllclJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYk1ldGhvZE5vRmluYWxNb2RpZmllclJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RXZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGVUZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTWV0aG9kIGdldE1ldGhvZFRvVGVzZXQoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteUZpbmFsTWV0aG9kIiwgbmV3IFN0cmluZ1swXSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfTk9fRklOQUxfTU9ESUZJRVJfQUxMT1dFRDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9QYWNrYWdlUHJpdmF0ZU1ldGhvZFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vUGFja2FnZVByaXZhdGVNZXRob2RSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGU4ZWIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9QYWNrYWdlUHJpdmF0ZU1ldGhvZFJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYk1ldGhvZE5vUGFja2FnZVByaXZhdGVNZXRob2RSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0V2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1ldGhvZCBnZXRNZXRob2RUb1Rlc2V0KCkgewotICAgICAgICByZXR1cm4gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlQYWNrYWdlUHJpdmF0ZU1ldGhvZCIsIG5ldyBTdHJpbmdbMF0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX09OTFlfT05fUFVCTElDX01FVEhPRFM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vUHJpdmF0ZU1ldGhvZFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vUHJpdmF0ZU1ldGhvZFJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MjQxYzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb1ByaXZhdGVNZXRob2RSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJNZXRob2ROb1ByaXZhdGVNZXRob2RSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0V2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1ldGhvZCBnZXRNZXRob2RUb1Rlc2V0KCkgewotICAgICAgICByZXR1cm4gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlQcml2YXRlTWV0aG9kIiwgbmV3IFN0cmluZ1swXSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfT05MWV9PTl9QVUJMSUNfTUVUSE9EUzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9Qcm90ZWN0ZWRNZXRob2RSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb1Byb3RlY3RlZE1ldGhvZFJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNTgzNTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb1Byb3RlY3RlZE1ldGhvZFJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYk1ldGhvZE5vUHJvdGVjdGVkTWV0aG9kUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFdlYk1ldGhvZFB1YmxpY1N0YXRpY0ZpbmFsUnVsZVRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElNZXRob2QgZ2V0TWV0aG9kVG9UZXNldCgpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15UHJvdGVjdGVkTWV0aG9kIiwgbmV3IFN0cmluZ1swXSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfT05MWV9PTl9QVUJMSUNfTUVUSE9EUzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9TdGF0aWNNb2RpZmllclJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vU3RhdGljTW9kaWZpZXJSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWFlNTNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9TdGF0aWNNb2RpZmllclJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYk1ldGhvZE5vU3RhdGljTW9kaWZpZXJSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0V2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1ldGhvZCBnZXRNZXRob2RUb1Rlc2V0KCkgewotICAgICAgICByZXR1cm4gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlTdGF0aWNNZXRob2QiLCBuZXcgU3RyaW5nWzBdKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9OT19TVEFUSUNfTU9ESUZJRVJfQUxMT1dFRDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViUGFyYW1Nb2RlSG9sZGVyVHlwZVJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlBhcmFtTW9kZUhvbGRlclR5cGVSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzNkNzdhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViUGFyYW1Nb2RlSG9sZGVyVHlwZVJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlBhcmFtTW9kZUhvbGRlclR5cGVSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG1vZGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgV2ViUGFyYW0uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAibW9kZSIsIE1vZGUuT1VUKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChtb2RlVmFsdWVQYWlyKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlQW5ub3RhdGlvbihhc3QsIFdlYlBhcmFtLmNsYXNzLCBXZWJQYXJhbS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksCi0gICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJAV2ViU2VydmljZShuYW1lPVwiTXlDbGFzc1wiKVxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0cHVibGljIFN0cmluZyBteU1ldGhvZChTdHJpbmcgcGFyYW0pIHsiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxuXHRcdHJldHVybiBcInR4dFwiO1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlBhcmFtTW9kZUhvbGRlclR5cGVSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkSW1wb3J0RWRpdChjb21waWxhdGlvblVuaXQsIFdlYlBhcmFtLmNsYXNzLCB0ZXh0RmlsZUNoYW5nZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyID0gQW5ub3RhdGlvblV0aWxzLmdldE1ldGhvZFBhcmFtZXRlcihjb21waWxhdGlvblVuaXQsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgMTI4KTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb25Ub01ldGhvZFBhcmFtZXRlcihzb3VyY2UsIGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kLCBhbm5vdGF0aW9uLCB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICAvLyByZWZyZXNoCi0gICAgICAgICAgICBwYXJhbWV0ZXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TWV0aG9kUGFyYW1ldGVyKEFubm90YXRpb25VdGlscy5nZXRBU1RQYXJzZXIobWV0aG9kCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDb21waWxhdGlvblVuaXQoKSwgZmFsc2UpLCBtZXRob2QsIDE1Nik7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQocGFyYW1ldGVyLCBhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCUEFSQU1fTU9ERV9PVVRfSU5PVVRfSE9MREVSX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Y2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZURlZmF1bHRQdWJsaWNDb25zdHJ1Y3RvclJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VEZWZhdWx0UHVibGljQ29uc3RydWN0b3JSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzBiOWZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZURlZmF1bHRQdWJsaWNDb25zdHJ1Y3RvclJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VEZWZhdWx0UHVibGljQ29uc3RydWN0b3JSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgIm5hbWUiLCAiTXlDbGFzcyIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBwb3J0TmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAicG9ydE5hbWUiLAotICAgICAgICAgICAgICAgICJNeUNsYXNzUG9ydCIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzZXJ2aWNlTmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJzZXJ2aWNlTmFtZSIsICJNeUNsYXNzU2VydmljZSIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAidGFyZ2V0TmFtZXNwYWNlIiwgImh0dHA6Ly9leGFtcGxlLmNvbS8iKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChuYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocG9ydE5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzZXJ2aWNlTmFtZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcywgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksCi0gICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0cHVibGljIE15Q2xhc3MoU3RyaW5nIGFyZykge1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZURlZmF1bHRQdWJsaWNDb25zdHJ1Y3RvclJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmFkZEltcG9ydEVkaXQoY29tcGlsYXRpb25Vbml0LCBXZWJTZXJ2aWNlLmNsYXNzLCB0ZXh0RmlsZUNoYW5nZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRBbm5vdGF0aW9uVG9UeXBlKHNvdXJjZSwgY29tcGlsYXRpb25Vbml0LCByZXdyaXRlciwgCi0gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbiwgdGV4dEZpbGVDaGFuZ2UpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0RFRkFVTFRfUFVCTElDX0NPTlNUUlVDVE9SLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VOb0Fic3RyYWN0TW9kaWZpZXJSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlTm9BYnN0cmFjdE1vZGlmaWVyUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwODMyNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VOb0Fic3RyYWN0TW9kaWZpZXJSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VOb0Fic3RyYWN0TW9kaWZpZXJSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZVB1YmxpY0Fic3RyYWN0RmluYWxSdWxlVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNeUNsYXNzIHtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyBTdHJpbmcgbXlNZXRob2QoKSB7IiArICJcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VOb0ZpbmFsTW9kaWZlclJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VOb0ZpbmFsTW9kaWZlclJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYzkxZjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlTm9GaW5hbE1vZGlmZXJSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VOb0ZpbmFsTW9kaWZlclJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlUHVibGljQWJzdHJhY3RGaW5hbFJ1bGVUZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGZpbmFsIGNsYXNzIE15Q2xhc3Mge1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0cHVibGljIFN0cmluZyBteU1ldGhvZCgpIHsiICsgIlxuXHRcdHJldHVybiBcInR4dFwiO1xuXHR9XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VOb0ZpbmFsaXplTWV0aG9kUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZU5vRmluYWxpemVNZXRob2RSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmVmNGE2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZU5vRmluYWxpemVNZXRob2RSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlTm9GaW5hbGl6ZU1ldGhvZFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAibmFtZSIsICJNeUNsYXNzIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHBvcnROYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJwb3J0TmFtZSIsCi0gICAgICAgICAgICAgICAgIk15Q2xhc3NQb3J0Iik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHNlcnZpY2VOYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgInNlcnZpY2VOYW1lIiwgIk15Q2xhc3NTZXJ2aWNlIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJ0YXJnZXROYW1lc3BhY2UiLCAiaHR0cDovL2V4YW1wbGUuY29tLyIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChwb3J0TmFtZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHNlcnZpY2VOYW1lVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUFubm90YXRpb24oYXN0LCBXZWJTZXJ2aWNlLmNsYXNzLCBXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwKLSAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgdm9pZCBmaW5hbGl6ZSgpIHtcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VOb0ZpbmFsaXplTWV0aG9kUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuYWRkSW1wb3J0RWRpdChjb21waWxhdGlvblVuaXQsIFdlYlNlcnZpY2UuY2xhc3MsIHRleHRGaWxlQ2hhbmdlLCB0cnVlKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb25Ub1R5cGUoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLCAKLSAgICAgICAgICAgICAgICAgICAgc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uLCB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfT1ZFUlJJREVfRklOQUxJWkUsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vRW5kcG9pbnRJbnRlcmZhY2VSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9FbmRwb2ludEludGVyZmFjZVJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNDZhMDQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9FbmRwb2ludEludGVyZmFjZVJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTRUlOb0VuZHBvaW50SW50ZXJmYWNlUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBuYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJuYW1lIiwgIk15Q2xhc3MiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgZW5kcG9pbnRJbnRlcmZhY2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAiZW5kcG9pbnRJbnRlcmZhY2UiLCAiTXlJbnRlcmZhY2UiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsIAotICAgICAgICAgICAgICAgICJ0YXJnZXROYW1lc3BhY2UiLCAiaHR0cDovL2V4YW1wbGUuY29tLyIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChlbmRwb2ludEludGVyZmFjZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcywgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksCi0gICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgaW50ZXJmYWNlIE15SW50ZXJmYWNlIHtcblxuXHRwdWJsaWMgU3RyaW5nIG15ZU1ldGhvZCgpO1xuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlJbnRlcmZhY2UuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlU0VJTm9FbmRwb2ludEludGVyZmFjZVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkSW1wb3J0RWRpdChjb21waWxhdGlvblVuaXQsIFdlYlNlcnZpY2UuY2xhc3MsIHRleHRGaWxlQ2hhbmdlLAotICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb25Ub1R5cGUoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLCAKLSAgICAgICAgICAgICAgICAgICAgc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uLCB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5EUE9JTlRJTlRFUkZBQ0VfU0VJLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb09uZXdheVJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb09uZXdheVJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNzc5N2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9PbmV3YXlSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU0VJTm9PbmV3YXlSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZVNFSVJ1bGUgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVBbm5vdGF0aW9uKGFzdCwgT25ld2F5LmNsYXNzLCBPbmV3YXkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZVNFSVByZXNlbnROb09uZXdheVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE9uZXdheS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibWV0aG9kT25lIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEltcG9ydEVkaXQoY29tcGlsYXRpb25Vbml0LCBPbmV3YXkuY2xhc3MsIHRleHRGaWxlQ2hhbmdlLCB0cnVlKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb25Ub01ldGhvZChzb3VyY2UsIGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiwgdGV4dEZpbGVDaGFuZ2UpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fT05FV0FZLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1BvcnROYW1lUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vUG9ydE5hbWVSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGRiYjhmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vUG9ydE5hbWVSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU0VJTm9Qb3J0TmFtZVJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAibmFtZSIsICJNeUNsYXNzIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAKLSAgICAgICAgICAgICAgICAidGFyZ2V0TmFtZXNwYWNlIiwgImh0dHA6Ly9leGFtcGxlLmNvbS8iKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcG9ydE5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgInBvcnROYW1lIiwgCi0gICAgICAgICJNeUNsYXNzUG9ydCIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChwb3J0TmFtZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcywgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksCi0gICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgaW50ZXJmYWNlIE15SW50ZXJmYWNlIHtcblxuXHRwdWJsaWMgU3RyaW5nIG15ZU1ldGhvZCgpO1xuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlJbnRlcmZhY2UuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlU0VJTm9Qb3J0TmFtZVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkSW1wb3J0RWRpdChjb21waWxhdGlvblVuaXQsIFdlYlNlcnZpY2UuY2xhc3MsIHRleHRGaWxlQ2hhbmdlLCB0cnVlKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb25Ub1R5cGUoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLCAKLSAgICAgICAgICAgICAgICAgICAgc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uLCB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfUE9SVE5BTUVfU0VJLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1NPQVBCaW5kaW5nUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vU09BUEJpbmRpbmdSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTJhMTE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vU09BUEJpbmRpbmdSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTRUlOb1NPQVBCaW5kaW5nUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VTRUlSdWxlIHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlQW5ub3RhdGlvbihhc3QsIFNPQVBCaW5kaW5nLmNsYXNzLCBTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb1NPQVBCaW5kaW5nT25NZXRob2RSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkSW1wb3J0RWRpdChjb21waWxhdGlvblVuaXQsIFNPQVBCaW5kaW5nLmNsYXNzLCB0ZXh0RmlsZUNoYW5nZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRBbm5vdGF0aW9uVG9NZXRob2Qoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24sIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1NPQVBCSU5ESU5HLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vU09BUEJpbmRpbmdPblR5cGVSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRJbXBvcnRFZGl0KGNvbXBpbGF0aW9uVW5pdCwgU09BUEJpbmRpbmcuY2xhc3MsIHRleHRGaWxlQ2hhbmdlLCB0cnVlKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb25Ub1R5cGUoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLCAKLSAgICAgICAgICAgICAgICAgICAgc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uLCB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19TT0FQQklORElORywKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIAotICAgIAotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1NlcnZpY2VOYW1lUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vU2VydmljZU5hbWVSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTIxMDAzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vU2VydmljZU5hbWVSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU0VJTm9TZXJ2aWNlTmFtZVJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAibmFtZSIsICJNeUNsYXNzIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJ0YXJnZXROYW1lc3BhY2UiLCAiaHR0cDovL2V4YW1wbGUuY29tLyIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzZXJ2aWNlTmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJzZXJ2aWNlTmFtZSIsICJNeUNsYXNzU2VydmljZSIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzZXJ2aWNlTmFtZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcywgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksCi0gICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgaW50ZXJmYWNlIE15SW50ZXJmYWNlIHtcblxuXHRwdWJsaWMgU3RyaW5nIG15ZU1ldGhvZCgpO1xuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlJbnRlcmZhY2UuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VTRUlOb1NlcnZpY2VOYW1lUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRJbXBvcnRFZGl0KGNvbXBpbGF0aW9uVW5pdCwgV2ViU2VydmljZS5jbGFzcywgdGV4dEZpbGVDaGFuZ2UsIHRydWUpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkQW5ub3RhdGlvblRvVHlwZShzb3VyY2UsIGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsIAotICAgICAgICAgICAgICAgICAgICBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb24sIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9TRVJWSUNFTkFNRV9TRUksCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vV2ViTWV0aG9kUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vV2ViTWV0aG9kUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI1ZjRkMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1dlYk1ldGhvZFJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTRUlOb1dlYk1ldGhvZFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlU0VJUnVsZSB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUFubm90YXRpb24oYXN0LCBXZWJNZXRob2QuY2xhc3MsIFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlU0VJUHJlc2VudE5vV2ViTWV0aG9kUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViTWV0aG9kLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRJbXBvcnRFZGl0KGNvbXBpbGF0aW9uVW5pdCwgV2ViTWV0aG9kLmNsYXNzLCB0ZXh0RmlsZUNoYW5nZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRBbm5vdGF0aW9uVG9NZXRob2Qoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24sIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQk1FVEhPRFMsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vV2ViUGFyYW1SdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9XZWJQYXJhbVJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5M2Y3ZDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9XZWJQYXJhbVJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVNFSU5vV2ViUGFyYW1SdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZVNFSVJ1bGUgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVBbm5vdGF0aW9uKGFzdCwgV2ViUGFyYW0uY2xhc3MsIFdlYlBhcmFtLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VTRUlQcmVzZW50Tm9XZWJQYXJhbVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJtZXRob2RPbmUiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkSW1wb3J0RWRpdChjb21waWxhdGlvblVuaXQsIFdlYlBhcmFtLmNsYXNzLCB0ZXh0RmlsZUNoYW5nZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyID0gQW5ub3RhdGlvblV0aWxzLmdldE1ldGhvZFBhcmFtZXRlcihjb21waWxhdGlvblVuaXQsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgMjUwKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb25Ub01ldGhvZFBhcmFtZXRlcihzb3VyY2UsIGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kLCBhbm5vdGF0aW9uLCB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICAvLyByZWZyZXNoCi0gICAgICAgICAgICBwYXJhbWV0ZXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TWV0aG9kUGFyYW1ldGVyKEFubm90YXRpb25VdGlscy5nZXRBU1RQYXJzZXIobWV0aG9kCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDb21waWxhdGlvblVuaXQoKSwgZmFsc2UpLCBtZXRob2QsIDI3OCk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQocGFyYW1ldGVyLCBhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQlBBUkFNLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9XZWJSZXN1bHRSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9XZWJSZXN1bHRSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDk0YjU3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vV2ViUmVzdWx0UnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVNFSU5vV2ViUmVzdWx0UnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VTRUlSdWxlIHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlQW5ub3RhdGlvbihhc3QsIFdlYlJlc3VsdC5jbGFzcywgV2ViUmVzdWx0LmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VTRUlQcmVzZW50Tm9XZWJSZXN1bHRSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJSZXN1bHQuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15TWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEltcG9ydEVkaXQoY29tcGlsYXRpb25Vbml0LCBXZWJSZXN1bHQuY2xhc3MsIHRleHRGaWxlQ2hhbmdlLCB0cnVlKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb25Ub01ldGhvZChzb3VyY2UsIGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiwgdGV4dEZpbGVDaGFuZ2UpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fV0VCUkVTVUxULAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlV2ViU2VydmljZVByb3ZpZGVyQ29FeGlzdFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM1YTJiYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlV2ViU2VydmljZVByb3ZpZGVyQ29FeGlzdFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcywgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7XG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7XG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkBXZWJTZXJ2aWNlUHJvdmlkZXJcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3MgaW1wbGVtZW50cyBQcm92aWRlcjxTb3VyY2U+IHtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyBTb3VyY2UgaW52b2tlKFNvdXJjZSBhcmcwKSB7IiArICJcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZVdlYlNlcnZpY2VQcm92aWRlckNvRXhpc3RSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEltcG9ydEVkaXQoY29tcGlsYXRpb25Vbml0LCBXZWJTZXJ2aWNlLmNsYXNzLCB0ZXh0RmlsZUNoYW5nZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRBbm5vdGF0aW9uVG9UeXBlKHNvdXJjZSwgY29tcGlsYXRpb25Vbml0LCByZXdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uLCB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfV0VCU0VSVklDRVBST1ZJREVSX0NPTUJJTkFUSU9OLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWJzdHJhY3RBbm5vdGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0Fic3RyYWN0QW5ub3RhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3ZjUxNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWJzdHJhY3RBbm5vdGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuQVNUUmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlBlcmZvcm1DaGFuZ2VPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFubm90YXRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByb3RlY3RlZCBUZXN0SmF2YVByb2plY3QgdGVzdEphdmFQcm9qZWN0OwotICAgIHByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZTsKLSAgICBwcm90ZWN0ZWQgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdDsKLSAgICBwcm90ZWN0ZWQgQVNUIGFzdDsKLSAgICBwcm90ZWN0ZWQgQVNUUmV3cml0ZSByZXdyaXRlcjsKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBhbm5vdGF0aW9uOwotICAgIHByb3RlY3RlZCBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZTsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0SmF2YVByb2plY3QgPSBuZXcgVGVzdEphdmFQcm9qZWN0KCJKYXZhUHJvamVjdCIpOwotICAgICAgICB0ZXN0SmF2YVByb2plY3Quc2V0QXV0b0J1aWxkaW5nKGlzQXV0b0J1aWxkaW5nRW5hYmxlZCgpKTsKLSAgICAgICAgdGVzdEphdmFQcm9qZWN0LmVuYWJsZUFubm90YXRpb25Qcm9jZXNzaW5nKGlzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkpOwotCi0gICAgICAgIHNvdXJjZSA9IHRlc3RKYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoZ2V0UGFja2FnZU5hbWUoKSwgZ2V0Q2xhc3NOYW1lKCksIGdldENsYXNzQ29udGVudHMoKSk7Ci0KLSAgICAgICAgY29tcGlsYXRpb25Vbml0ID0gQW5ub3RhdGlvblV0aWxzLmdldEFTVFBhcnNlcihzb3VyY2UsIGZhbHNlKTsKLSAgICAgICAgYXN0ID0gY29tcGlsYXRpb25Vbml0LmdldEFTVCgpOwotICAgICAgICByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKGFzdCk7Ci0gICAgICAgIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHRleHRGaWxlQ2hhbmdlID0gQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVRleHRGaWxlQ2hhbmdlKCJBQyIsIChJRmlsZSkgc291cmNlLmdldFJlc291cmNlKCkpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0F1dG9CdWlsZGluZ0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENsYXNzTmFtZSgpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgQ2hhbmdlIGNoYW5nZSkgewotICAgICAgICBpZiAoY2hhbmdlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNoYW5nZS5pbml0aWFsaXplVmFsaWRhdGlvbkRhdGEobW9uaXRvcik7Ci0KLSAgICAgICAgUGVyZm9ybUNoYW5nZU9wZXJhdGlvbiBjaGFuZ2VPcGVyYXRpb24gPSBuZXcgUGVyZm9ybUNoYW5nZU9wZXJhdGlvbihjaGFuZ2UpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjaGFuZ2VPcGVyYXRpb24ucnVuKG1vbml0b3IpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBjZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hhbmdlT3BlcmF0aW9uLmNoYW5nZUV4ZWN1dGVkKCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RKYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9GaWVsZFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9GaWVsZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzNDJhZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvRmllbGRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotCi1wdWJsaWMgY2xhc3MgQWRkQW5ub3RhdGlvblRvRmllbGRUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgcmV0dXJuICJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG5wdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0c3RhdGljIFN0cmluZyBzZXJ2aWNlO1xuXG59IjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB3c2RsTG9jYXRpb25WYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAid3NkbExvY2F0aW9uIiwgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4My9TZXJ2aWNlUHJvamVjdC9zZXJ2aXZlcy9NeVNlcnZpY2U/V1NETCIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHdzZGxMb2NhdGlvblZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZVJlZi5jbGFzcywgV2ViU2VydmljZVJlZi5jbGFzcy5nZXRTaW1wbGVOYW1lKCksCi0gICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZEFubm90YXRpb25Ub0ZpZWxkKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJTZXJ2aWNlUmVmLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSUZpZWxkIGZpZWxkID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldEZpZWxkKCJzZXJ2aWNlIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGZpZWxkKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEltcG9ydEVkaXQoY29tcGlsYXRpb25Vbml0LCBXZWJTZXJ2aWNlUmVmLmNsYXNzLCB0ZXh0RmlsZUNoYW5nZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRBbm5vdGF0aW9uVG9GaWVsZChzb3VyY2UsIGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsIGZpZWxkLCBhbm5vdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KGZpZWxkLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9NZXRob2RQYXJhbWV0ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvTWV0aG9kUGFyYW1ldGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjcxYzM3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9NZXRob2RQYXJhbWV0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRBbm5vdGF0aW9uVG9NZXRob2RQYXJhbWV0ZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJDYWxjdWxhdG9yLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIENhbGN1bGF0b3Ige1xuXG5cdHB1YmxpYyBpbnQgYWRkKGludCBpLCBpbnQgaykgeyIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXG5cdFx0cmV0dXJuIGkgKyBrO1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAibmFtZSIsICJpIik7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobmFtZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVBbm5vdGF0aW9uKGFzdCwgV2ViUGFyYW0uY2xhc3MsIFdlYlBhcmFtLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwKLSAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQW5ub3RhdGlvblRvTWV0aG9kUGFyYW1ldGVyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgiYWRkIiwgbmV3IFN0cmluZ1tdIHsgIkkiLCAiSSIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRJbXBvcnRFZGl0KGNvbXBpbGF0aW9uVW5pdCwgV2ViUGFyYW0uY2xhc3MsIHRleHRGaWxlQ2hhbmdlLCB0cnVlKTsKLQotICAgICAgICAgICAgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TWV0aG9kUGFyYW1ldGVyKGNvbXBpbGF0aW9uVW5pdCwgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICA2NSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRBbm5vdGF0aW9uVG9NZXRob2RQYXJhbWV0ZXIoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLCBwYXJhbWV0ZXIsCi0gICAgICAgICAgICAgICAgICAgIG1ldGhvZCwgYW5ub3RhdGlvbiwgdGV4dEZpbGVDaGFuZ2UpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgLy8gcmVmcmVzaAotICAgICAgICAgICAgcGFyYW1ldGVyID0gQW5ub3RhdGlvblV0aWxzLmdldE1ldGhvZFBhcmFtZXRlcihBbm5vdGF0aW9uVXRpbHMuZ2V0QVNUUGFyc2VyKG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAuZ2V0Q29tcGlsYXRpb25Vbml0KCksIGZhbHNlKSwgbWV0aG9kLCA5Myk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQocGFyYW1ldGVyLCBhbm5vdGF0aW9uKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9NZXRob2RUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvTWV0aG9kVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDEyMzA2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9NZXRob2RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotCi1wdWJsaWMgY2xhc3MgQWRkQW5ub3RhdGlvblRvTWV0aG9kVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiQ2FsY3VsYXRvci5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yIHtcblxuXHRwdWJsaWMgaW50IGFkZChpbnQgaSwgaW50IGspIHsiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxuXHRcdHJldHVybiBpICsgaztcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG9wZXJhdGlvblZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJvcGVyYXRpb25OYW1lIiwgImFkZCIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG9wZXJhdGlvblZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVBbm5vdGF0aW9uKGFzdCwgV2ViTWV0aG9kLmNsYXNzLCBXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLAotICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbm5vdGF0aW9uVG9NZXRob2QoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgiYWRkIiwgbmV3IFN0cmluZ1tdIHsgIkkiLCAiSSIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRJbXBvcnRFZGl0KGNvbXBpbGF0aW9uVW5pdCwgV2ViTWV0aG9kLmNsYXNzLCB0ZXh0RmlsZUNoYW5nZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRBbm5vdGF0aW9uVG9NZXRob2Qoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24sIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9UeXBlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub1R5cGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYmYxZmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub1R5cGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRBbm5vdGF0aW9uVG9UeXBlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiQ2FsY3VsYXRvci5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yIHtcblxuXHRwdWJsaWMgaW50IGFkZChpbnQgaSwgaW50IGspIHsiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxuXHRcdHJldHVybiBpICsgaztcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUKLSAgICAgICAgICAgICAgICAuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgIm5hbWUiLCAiQ2FsY3VsYXRvciIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAidGFyZ2V0TmFtZXNwYWNlIiwgSkRUVXRpbHMuZ2V0VGFyZ2V0TmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKGdldFBhY2thZ2VOYW1lKCkpKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcG9ydE5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgInBvcnROYW1lIiwKLSAgICAgICAgICAgICAgICAiQ2FsY3VsYXRvclBvcnQiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc2VydmljZU5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAic2VydmljZU5hbWUiLCAiQ2FsY3VsYXRvclNlcnZpY2UiKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChuYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocG9ydE5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzZXJ2aWNlTmFtZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcywgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksCi0gICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZEFubm90YXRpb25Ub1R5cGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkSW1wb3J0RWRpdChjb21waWxhdGlvblVuaXQsIFdlYlNlcnZpY2UuY2xhc3MsIHRleHRGaWxlQ2hhbmdlLAotICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb25Ub1R5cGUoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLCAKLSAgICAgICAgICAgICAgICAgICAgc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uLCB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvSkFYV1NDb3JlVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvSkFYV1NDb3JlVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMGEwYjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0pBWFdTQ29yZVRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpBWFdTQ29yZVRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYV1NDb3JlVGVzdFN1aXRlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBKQVhXU0NvcmVUZXN0U3VpdGUoKSB7Ci0gICAgICAgIHN1cGVyKCJKQVgtV1MgQ29yZSBUZXN0cyIpOwotICAgICAgICBhZGRUZXN0U3VpdGUoQWRkQW5ub3RhdGlvblRvVHlwZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoUmVtb3ZlQW5ub3RhdGlvbkZyb21UeXBlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShBZGRBbm5vdGF0aW9uVG9GaWVsZFRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoUmVtb3ZlQW5ub3RhdGlvbkZyb21GaWVsZFRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoQWRkQW5ub3RhdGlvblRvTWV0aG9kVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShSZW1vdmVBbm5vdGF0aW9uRnJvbU1ldGhvZFRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoQWRkQW5ub3RhdGlvblRvTWV0aG9kUGFyYW1ldGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShSZW1vdmVBbm5vdGF0aW9uRnJvbU1ldGhvZFBhcmFtZXRlclRlc3QuY2xhc3MpOyAgICAgICAgCi0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tRmllbGRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21GaWVsZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDliYjYzYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21GaWVsZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUmVmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVBbm5vdGF0aW9uRnJvbUZpZWxkVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVJlZjtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0QFdlYlNlcnZpY2VSZWYoKVxuXHRzdGF0aWMgU3RyaW5nIHNlcnZpY2U7XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUFubm90YXRpb24oYXN0LCBXZWJTZXJ2aWNlUmVmLmNsYXNzLCBXZWJTZXJ2aWNlUmVmLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwKLSAgICAgICAgICAgICAgICBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbkZyb21GaWVsZCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViU2VydmljZVJlZi5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElGaWVsZCBmaWVsZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGaWVsZCgic2VydmljZSIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChmaWVsZCk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoZmllbGQsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLnJlbW92ZUFubm90YXRpb25Gcm9tRmllbGQoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLCBmaWVsZCwgYW5ub3RhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoZmllbGQsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kUGFyYW1ldGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kUGFyYW1ldGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjkyOGYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVBbm5vdGF0aW9uRnJvbU1ldGhvZFBhcmFtZXRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLQotcHVibGljIGNsYXNzIFJlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kUGFyYW1ldGVyVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiQ2FsY3VsYXRvci5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIENhbGN1bGF0b3Ige1xuXG5cdHB1YmxpYyBpbnQgYWRkKEBXZWJQYXJhbShuYW1lPVwiaVwiKSIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW50IGksIGludCBrKSB7XG5cdFx0cmV0dXJuIGkgKyBrO1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVBbm5vdGF0aW9uKGFzdCwgV2ViUGFyYW0uY2xhc3MsIFdlYlBhcmFtLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kUGFyYW1ldGVyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgiYWRkIiwgbmV3IFN0cmluZ1tdIHsgIkkiLCAiSSIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyID0gQW5ub3RhdGlvblV0aWxzLmdldE1ldGhvZFBhcmFtZXRlcihjb21waWxhdGlvblVuaXQsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgOTMpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHBhcmFtZXRlciwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMucmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2RQYXJhbWV0ZXIoc291cmNlLCByZXdyaXRlciwgcGFyYW1ldGVyLCBhbm5vdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICAvLyByZWZyZXNoCi0gICAgICAgICAgICBwYXJhbWV0ZXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TWV0aG9kUGFyYW1ldGVyKEFubm90YXRpb25VdGlscy5nZXRBU1RQYXJzZXIobWV0aG9kCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDb21waWxhdGlvblVuaXQoKSwgZmFsc2UpLCBtZXRob2QsIDkzKTsKLQotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQocGFyYW1ldGVyLCBhbm5vdGF0aW9uKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2RUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYmY2MGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLQotcHVibGljIGNsYXNzIFJlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiQ2FsY3VsYXRvci5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yIHtcblxuXHRAV2ViTWV0aG9kXG5cdHB1YmxpYyBpbnQgYWRkKGludCBpLCBpbnQgaykgeyIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXG5cdFx0cmV0dXJuIGkgKyBrO1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVBbm5vdGF0aW9uKGFzdCwgV2ViTWV0aG9kLmNsYXNzLCBXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2QoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgiYWRkIiwgbmV3IFN0cmluZ1tdIHsgIkkiLCAiSSIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5yZW1vdmVBbm5vdGF0aW9uRnJvbU1ldGhvZChzb3VyY2UsIGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsIG1ldGhvZCwgYW5ub3RhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVBbm5vdGF0aW9uRnJvbVR5cGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21UeXBlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzY2ZjYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVBbm5vdGF0aW9uRnJvbVR5cGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVBbm5vdGF0aW9uRnJvbVR5cGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkBXZWJTZXJ2aWNlKG5hbWU9XCJNeUNsYXNzXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwiTXlJbnRlcmZhY2VcIiwgIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJ0YXJnZXROYW1lc3BhY2U9XCJodHRwOi8vZXhhbXBsZS5jb20vXCIsIHBvcnROYW1lPVwiTXlDbGFzc1BvcnRcIiwgIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJzZXJ2aWNlTmFtZT1cIk15Q2xhc3NTZXJ2aWNlXCIpXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyBTdHJpbmcgbXlNZXRob2QoKSB7IiArICJcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcywgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uRnJvbVR5cGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMucmVtb3ZlQW5ub3RhdGlvbkZyb21UeXBlKHNvdXJjZSwgY29tcGlsYXRpb25Vbml0LCByZXdyaXRlciwgCi0gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbiwgdGV4dEZpbGVDaGFuZ2UpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9UZXN0SmF2YVByb2plY3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9UZXN0SmF2YVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwYjViOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvVGVzdEphdmFQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS51dGlsLkFwdENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgVGVzdEphdmFQcm9qZWN0IGV4dGVuZHMgVGVzdFByb2plY3QgewotICAgIHByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotICAgIAotICAgIHB1YmxpYyBUZXN0SmF2YVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKHByb2plY3ROYW1lKTsKLSAgICAgICAgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgYWRkUHJvamVjdE5hdHVyZShnZXRQcm9qZWN0KCksIEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0KLSAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ldyBJQ2xhc3NwYXRoRW50cnlbMF0sIG51bGwpOwotCi0gICAgICAgIGNyZWF0ZVNvdXJjZUZvbGRlcigpOwotICAgICAgICBhZGRUb0NsYXNzcGF0aChqYXZhUHJvamVjdCwgZ2V0SlJFQ29udGFpbmVyRW50cnkoKSk7Ci0gICAgICAgIGNyZWF0ZU91dHB1dEZvbGRlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRBdXRvQnVpbGRpbmcoYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGRlc2NyaXB0aW9uLnNldEF1dG9CdWlsZGluZyhhdXRvQnVpbGQpOwotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBlbmFibGVBbm5vdGF0aW9uUHJvY2Vzc2luZyhib29sZWFuIGVuYWJsZSkgewotICAgICAgICBBcHRDb25maWcuc2V0RW5hYmxlZChqYXZhUHJvamVjdCwgZW5hYmxlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnkgZ2V0SlJFQ29udGFpbmVyRW50cnkoKSB7Ci0gICAgICAgIElWTUluc3RhbGwgZGVmYXVsdFZNSW5zdGFsbCA9IEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKTsKLSAgICAgICAgaWYgKGRlZmF1bHRWTUluc3RhbGwgIT0gbnVsbCAmJiBpc0phdmE2T3JHcmVhdGVySlJFKGRlZmF1bHRWTUluc3RhbGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdEpSRUNvbnRhaW5lckVudHJ5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElWTUluc3RhbGxUeXBlW10gaW5zdGFsbFR5cGVzID0gSmF2YVJ1bnRpbWUuZ2V0Vk1JbnN0YWxsVHlwZXMoKTsKLSAgICAgICAgZm9yIChJVk1JbnN0YWxsVHlwZSBpbnN0YWxsVHlwZSA6IGluc3RhbGxUeXBlcykgewotICAgICAgICAgICAgSVZNSW5zdGFsbFtdIHZtSW5zdGFsbHMgPSBpbnN0YWxsVHlwZS5nZXRWTUluc3RhbGxzKCk7Ci0gICAgICAgICAgICBmb3IgKElWTUluc3RhbGwgdm1JbnN0YWxsIDogdm1JbnN0YWxscykgewotICAgICAgICAgICAgICAgIGlmIChpc0phdmE2T3JHcmVhdGVySlJFKHZtSW5zdGFsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KEphdmFSdW50aW1lLm5ld0pSRUNvbnRhaW5lclBhdGgoaW5zdGFsbFR5cGUuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bUluc3RhbGwuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdEpSRUNvbnRhaW5lckVudHJ5KCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0phdmE2T3JHcmVhdGVySlJFKElWTUluc3RhbGwgdm1JbnN0YWxsKSB7Ci0gICAgICAgIGlmICh2bUluc3RhbGwgaW5zdGFuY2VvZiBJVk1JbnN0YWxsMikgewotICAgICAgICAgICAgSVZNSW5zdGFsbDIgdm1JbnN0YWxsMiA9IChJVk1JbnN0YWxsMikgdm1JbnN0YWxsOwotICAgICAgICAgICAgaWYgKHZtSW5zdGFsbDIuZ2V0SmF2YVZlcnNpb24oKS5jb21wYXJlVG8oSmF2YUNvcmUuVkVSU0lPTl8xXzYpID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRlbnRzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KG5hbWUsIGNvbnRlbnRzLCBmYWxzZSwgbW9uaXRvcik7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSVBhY2thZ2VGcmFnbWVudCBnZXRQYWNrYWdlRnJhZ21lbnQoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKS5jcmVhdGVQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUsIHRydWUsIG1vbml0b3IpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0gICAgICAgIHJldHVybiBnZXRKYXZhUHJvamVjdCgpLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjIikpOyAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTb3VyY2VGb2xkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElGb2xkZXIgc3JjRGlyID0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjIik7Ci0gICAgICAgIG1rZGlycyhzcmNEaXIpOyAgICAKLSAgICAgICAgYWRkVG9DbGFzc3BhdGgoamF2YVByb2plY3QsIEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KHNyY0Rpci5nZXRGdWxsUGF0aCgpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZU91dHB1dEZvbGRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUZvbGRlciBvdXRwdXREaXIgPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJiaW4iKTsKLSAgICAgICAgbWtkaXJzKG91dHB1dERpcik7Ci0gICAgICAgIGdldEphdmFQcm9qZWN0KCkuc2V0T3V0cHV0TG9jYXRpb24ob3V0cHV0RGlyLmdldEZ1bGxQYXRoKCksIG1vbml0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiBqYXZhUHJvamVjdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkVG9DbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkgY2xhc3NwYXRoRW50cnkpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElDbGFzc3BhdGhFbnRyeVtdIGN1cnJlbnRDbGFzc3BhdGhFbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0gICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGhFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtjdXJyZW50Q2xhc3NwYXRoRW50cmllcy5sZW5ndGggKyAxXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY3VycmVudENsYXNzcGF0aEVudHJpZXMsIDAsIG5ld0NsYXNzcGF0aEVudHJpZXMsIDAsIAotICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3NwYXRoRW50cmllcy5sZW5ndGgpOwotICAgICAgICAgICAgbmV3Q2xhc3NwYXRoRW50cmllc1tjdXJyZW50Q2xhc3NwYXRoRW50cmllcy5sZW5ndGhdID0gY2xhc3NwYXRoRW50cnk7Ci0gICAgICAgICAgICBqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoRW50cmllcywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIGptZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1Rlc3RQcm9qZWN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvVGVzdFByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ0NjI4Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvVGVzdFByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UHJvamVjdCB7Ci0gICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQotICAgIHByaXZhdGUgSVByb2plY3QgdGVzdFByb2plY3Q7Ci0gICAgCi0gICAgcHVibGljIFRlc3RQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgdGVzdFByb2plY3QgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICB0ZXN0UHJvamVjdC5jcmVhdGUobW9uaXRvcik7Ci0gICAgICAgIHRlc3RQcm9qZWN0Lm9wZW4obW9uaXRvcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gdGVzdFByb2plY3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFByb2plY3ROYXR1cmUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIG5hdHVyZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVByb2plY3REZXNjcmlwdGlvbiBwcm9qZWN0RGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBwcmV2aW91c05hdHVyZXMgPSBwcm9qZWN0RGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2aW91c05hdHVyZXMubGVuZ3RoICsgMV07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHByZXZpb3VzTmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMCwgcHJldmlvdXNOYXR1cmVzLmxlbmd0aCk7Ci0gICAgICAgICAgICBuZXdOYXR1cmVzW3ByZXZpb3VzTmF0dXJlcy5sZW5ndGhdID0gbmF0dXJlOwotICAgICAgICAgICAgcHJvamVjdERlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLSAgICAgICAgICAgIHByb2plY3Quc2V0RGVzY3JpcHRpb24ocHJvamVjdERlc2NyaXB0aW9uLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgY2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgbWtkaXJzKGZpbmFsIElGb2xkZXIgZm9sZGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBpZiAoZm9sZGVyLmdldFBhcmVudCgpIGluc3RhbmNlb2YgSUZvbGRlcikgewotICAgICAgICAgICAgICAgIG1rZGlycygoSUZvbGRlcikgZm9sZGVyLmdldFBhcmVudCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMWE0MzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzUzNjc1Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZTA0ODRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jTW9uIEp1bCAyMCAxNToyNTozMSBFRVNUIDIwMDkNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OWJiNjg3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wDQotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMA0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMNCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4NCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyDQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41DQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24sDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscywNCi0gb3JnLmptb2NrLA0KLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwNCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLA0KLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLA0KLSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLA0KLSBvcmcuZWNsaXBzZS51aS5pZGUsDQotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLA0KLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LA0KLSBvcmcuanVuaXQsDQotIG9yZy5lY2xpcHNlLmpkdC51aSwNCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24NCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5kb20sDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMuZG9tLnZhbGlkYXRpb24sDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMubmF2aWdhdG9yLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLm5hdmlnYXRvci5hY3Rpb25zDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmI3YWNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5BdWd1c3QgMjAsIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNjODhlZmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcDQotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWM0NTFhZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLUJ1bmRsZS1OYW1lLjA9RE9NIEludGVncmF0aW9uIFRlc3RzIChJbmN1YmF0aW9uKQ0KLUJ1bmRsZS1WZW5kb3IuMD1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvZG9tL0FsbFRlc3RzU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvZG9tL0FsbFRlc3RzU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzRjYTQ1OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL2RvbS9BbGxUZXN0c1N1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMuZG9tOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5kb20udmFsaWRhdGlvbi5Eb21WYWxpZGF0aW9uSGVscGVyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5kb20udmFsaWRhdGlvbi5Eb21WYWxpZGF0aW9uTWFuYWdlclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMubmF2aWdhdG9yLkRPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5uYXZpZ2F0b3IuRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5uYXZpZ2F0b3IuRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnlUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLm5hdmlnYXRvci5XZWJTZXJ2aWNlRGVjb3JhdG9yVGVzdDsNCi0NCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHNTdWl0ZQ0KLXsNCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0Jew0KLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOw0KLQ0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnlUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShEb21WYWxpZGF0aW9uSGVscGVyVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRG9tVmFsaWRhdGlvbk1hbmFnZXJUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlRGVjb3JhdG9yVGVzdC5jbGFzcyk7DQotCQkNCi0JCXJldHVybiBzdWl0ZTsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL2RvbS92YWxpZGF0aW9uL0RvbVZhbGlkYXRpb25IZWxwZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL2RvbS92YWxpZGF0aW9uL0RvbVZhbGlkYXRpb25IZWxwZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5OWQ1YzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9kb20vdmFsaWRhdGlvbi9Eb21WYWxpZGF0aW9uSGVscGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLmRvbS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnZhbGlkYXRpb24uRG9tVmFsaWRhdGlvbkhlbHBlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NET01SdW50aW1lRXh0ZW5zaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2s7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdEVqYjNQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3Q7DQotDQotLyoqDQotICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIERvbVZhbGlkYXRpb25IZWxwZXJ9Lg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQ0KLXB1YmxpYyBjbGFzcyBEb21WYWxpZGF0aW9uSGVscGVyVGVzdCBleHRlbmRzIE1vY2tPYmplY3RUZXN0Q2FzZSANCi17DQotCXByaXZhdGUgRG9tVmFsaWRhdGlvbkhlbHBlciBoZWxwZXI7DQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsNCi0JCWhlbHBlciA9IG5ldyBEb21WYWxpZGF0aW9uSGVscGVyKCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3REb21WYWxpZGF0aW9uSGVscGVyKCkgewkJDQotCQlhc3NlcnRUcnVlKGhlbHBlci5pc1JlZ2lzdGVyZWQoIndlYlNlcnZpY2VQcm9qZWN0IikpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRXZWJTZXJ2aWNlUHJvamVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJVGVzdEVqYjNQcm9qZWN0IGVqYlByb2plY3QgPSBuZXcgVGVzdEVqYjNQcm9qZWN0KCJFamJQcm9qZWN0Iik7DQotCQlUZXN0UHJvamVjdCB0ZXN0UHJvamVjdCA9IG5ldyBUZXN0UHJvamVjdChlamJQcm9qZWN0LmdldFByb2plY3QoKSk7DQotCQlJUGFja2FnZUZyYWdtZW50IHBhY2sgPSB0ZXN0UHJvamVjdC5nZXRTb3VyY2VGb2xkZXIoKS5jcmVhdGVQYWNrYWdlRnJhZ21lbnQoIm9yZy5lbGNpcHNlLnRlc3QiLCB0cnVlLCBudWxsKTsNCi0JCXRlc3RQcm9qZWN0LmNyZWF0ZVR5cGUocGFjaywgIlNlaS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZSBwdWJsaWMgaW50ZXJmYWNlIFNlaSB7fSIpOw0KLQkJDQotCQloZWxwZXIuc2V0UHJvamVjdCh0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJYXNzZXJ0Tm90TnVsbCgiRE9NIHByb2plY3Qgbm90IHJldHJpZXZlZCIsIGhlbHBlci5nZXRXZWJTZXJ2aWNlUHJvamVjdCgib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5qZWU1IikpOw0KLQkJDQotCQl0cnkgew0KLQkJCXRlc3RQcm9qZWN0LmRpc3Bvc2UoKTsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBfKSB7CQ0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0V2ViU2VydmljZVByb2plY3RET01Mb2FkaW5nQ2FuY2VsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIA0KLQl7DQotCQlmaW5hbCBNb2NrPElXc0RPTVJ1bnRpbWVFeHRlbnNpb24+IGV4dE1vY2sgPSBtb2NrKElXc0RPTVJ1bnRpbWVFeHRlbnNpb24uY2xhc3MpOw0KLQkJZXh0TW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJnZXRET00iKS53aWxsKHRocm93RXhjZXB0aW9uKG5ldyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbigiIiwgIiIpKSk7DQotCQloZWxwZXIgPSBuZXcgRG9tVmFsaWRhdGlvbkhlbHBlcigpIHsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBnZXREb21SdW50aW1lKGZpbmFsIFN0cmluZyBkb21JZCkgew0KLQkJCQlyZXR1cm4gZXh0TW9jay5wcm94eSgpOw0KLQkJCX0NCi0JCX07DQotCQlhc3NlcnROdWxsKCJUaGUgaGVscGVyIHJldHVybmVkIGRvbSBpbnN0YW5jZSIsIGhlbHBlci5nZXRXZWJTZXJ2aWNlUHJvamVjdCgic29tZS5kb20iKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9kb20vdmFsaWRhdGlvbi9Eb21WYWxpZGF0aW9uTWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvZG9tL3ZhbGlkYXRpb24vRG9tVmFsaWRhdGlvbk1hbmFnZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY4ZDlmOGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9kb20vdmFsaWRhdGlvbi9Eb21WYWxpZGF0aW9uTWFuYWdlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMuZG9tLnZhbGlkYXRpb247DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlRGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JU0VJQ2hpbGRMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JV2ViU2VydmljZUNoaWxkTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi52YWxpZGF0aW9uLkRvbVZhbGlkYXRpb25IZWxwZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udmFsaWRhdGlvbi5Eb21WYWxpZGF0aW9uTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5JRG9tVmFsaWRhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLklXYWl0Q29uZGl0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmFzc2VydGlvbnMuQXNzZXJ0aW9uczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5hc3NlcnRpb25zLkNvbmRpdGlvbkNoZWNrRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdEVqYjNQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5kb20udmFsaWRhdGlvbi5Eb21WYWxpZGF0aW9uQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwudGV4dC5KYXhXc1V0aWxNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5GaWxlVXRpbHM7DQotDQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpDQotcHVibGljIGNsYXNzIERvbVZhbGlkYXRpb25NYW5hZ2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlIA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdTVF9WQUxJREFUSU9OX1hQID0gIm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvciI7DQotDQotCXB1YmxpYyB2b2lkIHRlc3RSZWdpc3RlcmVkKCkNCi0Jew0KLQkJZmluYWwgSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChXU1RfVkFMSURBVElPTl9YUCk7DQotCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbigib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi53c1ZhbGlkYXRvciIpOw0KLQkJYXNzZXJ0Tm90TnVsbChleHRlbnNpb24pOw0KLQkJDQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGZpbmRFbGVtZW50KGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSwgInZhbGlkYXRvciIpOw0KLQkJZWxlbWVudCA9IGZpbmRFbGVtZW50KGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKSwgInJ1biIpOw0KLQkJYXNzZXJ0RXF1YWxzKERvbVZhbGlkYXRpb25NYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIikpOw0KLQl9DQotCQ0KLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBmaW5kRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgW10gY29uZmlnRWxlbWVudHMsIFN0cmluZyBuYW1lKSANCi0Jew0KLQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA6IGNvbmZpZ0VsZW1lbnRzKSB7DQotCQkJaWYgKGNvbmZpZ0VsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgew0KLQkJCQlyZXR1cm4gY29uZmlnRWxlbWVudDsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQ0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVDYWxsZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCVRlc3RFamIzUHJvamVjdCBlamJQcm9qZWN0ID0gbmV3IFRlc3RFamIzUHJvamVjdCgiRWpiUHJvamVjdCIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7DQotCQlUZXN0UHJvamVjdCB0ZXN0UHJvamVjdCA9IG5ldyBUZXN0UHJvamVjdChlamJQcm9qZWN0LmdldFByb2plY3QoKSk7DQotCQlJUGFja2FnZUZyYWdtZW50IHBhY2sgPSB0ZXN0UHJvamVjdC5nZXRTb3VyY2VGb2xkZXIoKS5jcmVhdGVQYWNrYWdlRnJhZ21lbnQoIm9yZy5lY2xpcHNlLnRlc3QiLCB0cnVlLCBudWxsKTsNCi0JCXRlc3RQcm9qZWN0LmNyZWF0ZVR5cGUocGFjaywgIlNlaS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZSBwdWJsaWMgaW50ZXJmYWNlIFNlaSB7fSIpOw0KLQkJDQotCQlEb21WYWxpZGF0aW9uSGVscGVyIGhlbHBlciA9IG5ldyBEb21WYWxpZGF0aW9uSGVscGVyKCk7DQotCQloZWxwZXIuc2V0UHJvamVjdCh0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkNCi0JCU15RG9tVmFsaWRhdGlvbk1hbmFnZXIgbWFuYWdlciA9IG5ldyBNeURvbVZhbGlkYXRpb25NYW5hZ2VyKCJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmplZTUiKTsNCi0JCW1hbmFnZXIudmFsaWRhdGUoaGVscGVyLCBudWxsKTsNCi0JCWFzc2VydFRydWUobWFuYWdlci52YWxpZGF0aW9uQ2FsbGVkKTsNCi0JCQ0KLQkJbWFuYWdlciA9IG5ldyBNeURvbVZhbGlkYXRpb25NYW5hZ2VyKCJzYW1wbGUubm90LmV4aXN0aW5nIik7DQotCQltYW5hZ2VyLnZhbGlkYXRlKGhlbHBlciwgbnVsbCk7DQotCQlhc3NlcnRGYWxzZShtYW5hZ2VyLnZhbGlkYXRpb25DYWxsZWQpOw0KLQl9DQotCQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQ0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVDbGVhbnNVcEVycm9yTWFya2VycygpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgVGVzdFByb2plY3QgdGVzdFByb2plY3QgPSBjcmVhdGVQcm9qZWN0KCk7DQotCQlJVHlwZSBzZWlUeXBlID0gdGVzdFByb2plY3QuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSgib3JnLmVjbGlwc2UudGVzdC5TZWkiKTsNCi0JCXNlaVR5cGUuZ2V0UmVzb3VyY2UoKS5jcmVhdGVNYXJrZXIoRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5NQVJLRVJfSUQpOw0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKERvbVZhbGlkYXRpb25Db25zdGFudHMuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIG1hcmtlcnMubGVuZ3RoKTsNCi0JCQ0KLQkJRG9tVmFsaWRhdGlvbkhlbHBlciBoZWxwZXIgPSBuZXcgRG9tVmFsaWRhdGlvbkhlbHBlcigpOw0KLQkJaGVscGVyLnNldFByb2plY3QodGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKTsJCQ0KLQkJTXlEb21WYWxpZGF0aW9uTWFuYWdlciBtYW5hZ2VyID0gbmV3IE15RG9tVmFsaWRhdGlvbk1hbmFnZXIoIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uamVlNSIpOw0KLQkJbWFuYWdlci52YWxpZGF0ZShoZWxwZXIsIG51bGwpOwkNCi0JCQ0KLQkJbWFya2VycyA9IHNlaVR5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhEb21WYWxpZGF0aW9uQ29uc3RhbnRzLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygwLCBtYXJrZXJzLmxlbmd0aCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RSZWZyZXNoVHJlZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJSVdlYlNlcnZpY2Ugd3MgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpOw0KLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotDQotCQlJV2ViTWV0aG9kIHdtID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYk1ldGhvZCgpOw0KLQkJd20uZ2V0UGFyYW1ldGVycygpLmFkZChEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViUGFyYW0oKSk7DQotDQotCQlzZWkuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5hZGQod3MpOw0KLQkJc2VpLmdldFdlYk1ldGhvZHMoKS5hZGQod20pOw0KLQkJDQotCQlJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0KCk7IA0KLQkJd3NQcm9qZWN0LmdldFdlYlNlcnZpY2VzKCkuYWRkKHdzKTsNCi0JCXdzUHJvamVjdC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuYWRkKHNlaSk7DQotCQkNCi0JCWZpbmFsIFNldDxPYmplY3Q+IGVsZW1lbnRzID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOw0KLQkJRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKCkgDQotCQl7CQkJDQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIHZvaWQgZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkIChPYmplY3QgZWxlbWVudCkgew0KLQkJCQllbGVtZW50cy5hZGQoZWxlbWVudC5nZXRDbGFzcygpLmdldEludGVyZmFjZXMoKVswXSk7DQotCQkJfQkNCi0JCX07DQotDQotCQlSdW5uYWJsZSByZWZyZXNoID0gbmV3IE15RG9tVmFsaWRhdGlvbk1hbmFnZXIoIiIpLmdldFJlZnJlc2hSdW5uYWJsZShsYWJlbFByb3ZpZGVyLCB3c1Byb2plY3QpOw0KLQkJcmVmcmVzaC5ydW4oKTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZShlbGVtZW50cy5jb250YWlucyhJV2ViU2VydmljZVByb2plY3QuY2xhc3MpKTsNCi0JCWFzc2VydFRydWUoZWxlbWVudHMuY29udGFpbnMoSVdlYlNlcnZpY2VDaGlsZExpc3QuY2xhc3MpKTsNCi0JCWFzc2VydFRydWUoZWxlbWVudHMuY29udGFpbnMoSVNFSUNoaWxkTGlzdC5jbGFzcykpOw0KLQkJYXNzZXJ0VHJ1ZShlbGVtZW50cy5jb250YWlucyhJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzKSk7CQkNCi0JCWFzc2VydFRydWUoZWxlbWVudHMuY29udGFpbnMoSVdlYlNlcnZpY2UuY2xhc3MpKTsNCi0JCWFzc2VydFRydWUoZWxlbWVudHMuY29udGFpbnMoSVdlYk1ldGhvZC5jbGFzcykpOw0KLQkJYXNzZXJ0VHJ1ZShlbGVtZW50cy5jb250YWlucyhJV2ViUGFyYW0uY2xhc3MpKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvbkZyYW1ld29ya1RyaWdnZXJzVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgVGVzdEVqYjNQcm9qZWN0IGVqYlByb2plY3QgPSBuZXcgVGVzdEVqYjNQcm9qZWN0KCJFamJQcm9qZWN0IiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsNCi0JCWZpbmFsIFRlc3RQcm9qZWN0IHRlc3RQcm9qZWN0ID0gbmV3IFRlc3RQcm9qZWN0KGVqYlByb2plY3QuZ2V0UHJvamVjdCgpKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgcGFjayA9IHRlc3RQcm9qZWN0LmdldFNvdXJjZUZvbGRlcigpLmNyZWF0ZVBhY2thZ2VGcmFnbWVudCgib3JnLmVjbGlwc2UudGVzdCIsIHRydWUsIG51bGwpOw0KLQkJZmluYWwgSVR5cGUgd3NUeXBlID0gdGVzdFByb2plY3QuY3JlYXRlVHlwZShwYWNrLCAiV3MuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlRlc3RcIikgcHVibGljIGNsYXNzIFdzIHt9Iik7DQotCQl0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgbnVsbCk7DQotCQkNCi0JCWJvb2xlYW4gYXV0b0J1aWxkID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCkuaXNBdXRvQnVpbGRpbmcoKTsNCi0JCXRyeSB7DQotCQkJc2V0QXV0b0J1aWxkKGZhbHNlKTsNCi0JCQlzZXRDb250ZW50cyh3c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIl5eXlwiKSBwdWJsaWMgY2xhc3MgV3Mge30iKTsNCi0JCQl0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgbnVsbCk7DQotCQkJQXNzZXJ0aW9ucy53YWl0QXNzZXJ0KG5ldyBJV2FpdENvbmRpdGlvbigpIHsNCi0JCQkJcHVibGljIGJvb2xlYW4gY2hlY2tDb25kaXRpb24oKSB0aHJvd3MgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24gew0KLQkJCQkJdHJ5IHsNCi0JCQkJCQlJTWFya2VyW10gbWFya2Vycz0gd3NUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQkJCQkJZm9yKElNYXJrZXIgbSA6IG1hcmtlcnMpDQotCQkJCQkJew0KLQkJCQkJCQlpZigobS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkgPT0gbnVsbCkgfHwgKG0uZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkgPT0gbnVsbCkpDQotCQkJCQkJCXsNCi0JCQkJCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJCQkJfQ0KLQkJCQkJCQlpZigoSW50ZWdlciltLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSA9PSBJTWFya2VyLlNFVkVSSVRZX0VSUk9SIHx8IEpheFdzVXRpbE1lc3NhZ2VzLldzZGxOYW1lc1ZhbGlkYXRvcl9JbnZhbGlkTkNOYW1lMi5lcXVhbHMobS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSkpDQotCQkJCQkJCXsNCi0JCQkJCQkJCXJldHVybiB0cnVlOw0KLQkJCQkJCQl9DQotCQkJCQkJfQ0KLQkJCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCQkJCXRocm93IG5ldyBDb25kaXRpb25DaGVja0V4Y2VwdGlvbihlKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0sIA0KLQkJCSJFeHBlY3RlZCBlcnJvciBtYXJrZXIgd2FzIG5vdCBmb3VuZCIpOw0KLQkJfQ0KLQkJZmluYWxseSB7DQotCQkJc2V0QXV0b0J1aWxkKGF1dG9CdWlsZCk7DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRzKElDb21waWxhdGlvblVuaXQgY3UsIFN0cmluZyBjb250ZW50cykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBTdHJpbmcgY29udGVudFRvU2V0ID0gInBhY2thZ2UgIitjdS5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpKyI7XG4iK2NvbnRlbnRzOw0KLQkJRmlsZVV0aWxzLmdldEluc3RhbmNlKCkuc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudChjdSwgY29udGVudFRvU2V0LCB0cnVlLCBudWxsKTsNCi0JfQ0KLQkJDQotCXByaXZhdGUgdm9pZCBzZXRBdXRvQnVpbGQoYm9vbGVhbiBhdXRvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0RGVzY3JpcHRpb24oKTsNCi0JCWRlc2Muc2V0QXV0b0J1aWxkaW5nKGF1dG8pOw0KLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnNldERlc2NyaXB0aW9uKGRlc2MpOw0KLQl9DQotCQ0KLQlwcml2YXRlIFRlc3RQcm9qZWN0IGNyZWF0ZVByb2plY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCVRlc3RFamIzUHJvamVjdCBlamJQcm9qZWN0ID0gbmV3IFRlc3RFamIzUHJvamVjdCgiRWpiUHJvamVjdCIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7DQotCQlUZXN0UHJvamVjdCB0ZXN0UHJvamVjdCA9IG5ldyBUZXN0UHJvamVjdChlamJQcm9qZWN0LmdldFByb2plY3QoKSk7DQotCQlJUGFja2FnZUZyYWdtZW50IHBhY2sgPSB0ZXN0UHJvamVjdC5nZXRTb3VyY2VGb2xkZXIoKS5jcmVhdGVQYWNrYWdlRnJhZ21lbnQoIm9yZy5lY2xpcHNlLnRlc3QiLCB0cnVlLCBudWxsKTsNCi0JCXRlc3RQcm9qZWN0LmNyZWF0ZVR5cGUocGFjaywgIlNlaS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShlbmRwb2ludEludGVyZmFjZT1cIlwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaSB7fSIpOw0KLQkJDQotCQlyZXR1cm4gdGVzdFByb2plY3Q7DQotCX0NCi0JDQotCXByb3RlY3RlZCBjbGFzcyBNeURvbVZhbGlkYXRpb25NYW5hZ2VyIGV4dGVuZHMgRG9tVmFsaWRhdGlvbk1hbmFnZXINCi0Jew0KLQkJcHVibGljIGJvb2xlYW4gdmFsaWRhdGlvbkNhbGxlZDsNCi0JCXByaXZhdGUgU3RyaW5nIGRvbUlkOw0KLQkJDQotCQlwdWJsaWMgTXlEb21WYWxpZGF0aW9uTWFuYWdlcihTdHJpbmcgZG9tSWQpDQotCQl7DQotCQkJdGhpcy5kb21JZCA9IGRvbUlkOyANCi0JCX0NCi0JCQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJRG9tVmFsaWRhdG9yPiBnZXRWYWxpZGF0b3JzKCkNCi0JCXsNCi0JCQlJRG9tVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBJRG9tVmFsaWRhdG9yKCkNCi0JCQl7DQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0U3VwcG9ydGVkRG9tUnVudGltZSgpIHsNCi0JCQkJCXJldHVybiBkb21JZDsNCi0JCQkJfQ0KLQ0KLQkJCQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShFT2JqZWN0IG9iamVjdCkgew0KLQkJCQkJdmFsaWRhdGlvbkNhbGxlZCA9IHRydWU7DQotCQkJCQlyZXR1cm4gbnVsbDsNCi0JCQl9fTsNCi0JCQkNCi0JCQlMaXN0PElEb21WYWxpZGF0b3I+IHZhbGlkYXRvcnMgPSBuZXcgQXJyYXlMaXN0PElEb21WYWxpZGF0b3I+KCk7DQotCQkJdmFsaWRhdG9ycy5hZGQodmFsaWRhdG9yKTsNCi0JCQkNCi0JCQlyZXR1cm4gdmFsaWRhdG9yczsNCi0JCX0NCi0JCQ0KLQkJcHVibGljIFJlZnJlc2hSdW5uYWJsZSBnZXRSZWZyZXNoUnVubmFibGUoRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QpDQotCQl7DQotCQkJcmV0dXJuIG5ldyBSZWZyZXNoUnVubmFibGUobGFiZWxQcm92aWRlciwgd3NQcm9qZWN0KTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZDllZmI0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkRPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JTG9hZGluZ1dzUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSVNFSUNoaWxkTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSVdlYlNlcnZpY2VDaGlsZExpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklMb2FkaW5nV3NQcm9qZWN0LklMb2FkaW5nQ2FuY2VsZWQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklMb2FkaW5nV3NQcm9qZWN0LklMb2FkaW5nRHVtbXk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NET01SdW50aW1lRXh0ZW5zaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3RzVXRpbHM7DQotDQotcHVibGljIGNsYXNzIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgVGVzdFByb2plY3QgdGVzdFByajE7IA0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMxOw0KLQkNCi0JcHJpdmF0ZSBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0Ow0KLQkNCi0JcHJvdGVjdGVkIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgdGFyZ2V0UmVzb3VyY2U7DQotCXByb3RlY3RlZCBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBhZGFwdGVyRmFjdG9yeTsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJaWYodGVzdFByajE9PW51bGwpDQotCQl7DQotCQkJSVByb2plY3QgZWpiUHJvamVjdCA9IFRlc3RQcm9qZWN0c1V0aWxzLmNyZWF0ZUVqYjNQcm9qZWN0KCJET01DbnRQcm92VGVzdFByb2plY3QxIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsNCi0JCQl0ZXN0UHJqMSA9IG5ldyBUZXN0UHJvamVjdChlamJQcm9qZWN0LmdldFByb2plY3QoKSk7DQotCQkJdGVzdFByajEuY3JlYXRlU291cmNlRm9sZGVyKCJzcmMiKTsNCi0JCQltb2RlbFN5bmMxID0gdGVzdFByajEuY3JlYXRlUGFja2FnZSgib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMxIik7DQotCQkJdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiU2VpMS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpMU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkxe1xuIiArDQotCQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2QobmFtZT1cInBhcmVudE1ldGhvZFwiKSBwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aE5vQXJnc0luUGFyZW50KCk7XG4iICsNCi0JCQkJCSJ9Iik7DQotCQkJdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiU2VpMi5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpMk5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkyIGV4dGVuZHMgU2VpMSB7XG4iICsNCi0JCQkJCSJAamF2YXguandzLldlYk1ldGhvZChuYW1lPVwidm9pZE1ldGhvZFdpdGhBcmdzXCIpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoQXJncyhAamF2YXguandzLldlYlBhcmFtKG5hbWU9XCJwYXJhbTFcIikgamF2YS51dGlsLkxpc3Q8U3RyaW5nPiBwYXJhbTEpO1xuIiArDQotCQkJCQkifSIpOw0KLQkJCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIldTMS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMU5hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuU2VpMlwiKSBwdWJsaWMgY2xhc3MgV1MxIHt9Iik7DQotCQkJdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiV1MyLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MyTmFtZVwiKSBwdWJsaWMgY2xhc3MgV1MyIHt9Iik7DQotCQl9DQotCQkNCi0JCXRhcmdldFJlc291cmNlID0gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpKTsNCi0JCXRhcmdldFJlc291cmNlLmxvYWQobnVsbCk7DQotCQlJdGVyYXRvcjxJV2ViU2VydmljZVByb2plY3Q+IHdzUHJvamVjdHMgPSB0YXJnZXRSZXNvdXJjZS5nZXRET00oKS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5pdGVyYXRvcigpOw0KLQkJDQotCQl3aGlsZSh3c1Byb2plY3RzLmhhc05leHQoKSkNCi0JCXsNCi0JCQlJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qID0gd3NQcm9qZWN0cy5uZXh0KCk7DQotCQkJDQotCQkJaWYod3NQcm9qLmdldE5hbWUoKS5lcXVhbHModGVzdFByajEuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSkpDQotCQkJew0KLQkJCQl0aGlzLndzUHJvamVjdCA9IHdzUHJvajsNCi0JCQl9DQotCQl9DQotCQkJCQ0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLndzUHJvamVjdCk7DQotCQkNCi0JCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKCkgDQotCQl7DQotCQkJQE92ZXJyaWRlDQotCQkJcHJvdGVjdGVkIElXZWJTZXJ2aWNlUHJvamVjdCBnZXRXc1Byb2plY3QoZmluYWwgSURPTSBkb20sIGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsNCi0JCQkJcmV0dXJuIHdzUHJvamVjdDsNCi0JCQl9DQotCQl9Ow0KLQkJDQotCQl0YXJnZXRSZXNvdXJjZS5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0UmVzb3VyY2Uuc3RvcFN5bmNocm9uaXppbmcoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKCkgDQotCXsNCi0JCWFzc2VydE5vdE51bGwoYWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlckZhY3RvcnkoKSk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXJGYWN0b3J5KCkgaW5zdGFuY2VvZiBEb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSANCi0Jew0KLQkJYWRhcHRlckZhY3RvcnkgPSBuZXcgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIobmV3IERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXJGYWN0b3J5KCkpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyRmFjdG9yeSgpIGluc3RhbmNlb2YgRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDaGlsZHJlbkxpc3RzT2JqZWN0KCkgDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChjaGlsZHJlbik7DQotCQlhc3NlcnRFcXVhbHMoY2hpbGRyZW4ubGVuZ3RoLCAxKTsNCi0JCWFzc2VydFRydWUoY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBJV2ViU2VydmljZVByb2plY3QpOw0KLQkJDQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChjaGlsZHJlbik7DQotCQlhc3NlcnRFcXVhbHMoY2hpbGRyZW4ubGVuZ3RoLCAyKTsNCi0JCWFzc2VydFRydWUoY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KTsNCi0JCWFzc2VydFRydWUoY2hpbGRyZW5bMV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCk7DQotCQkNCi0JCU9iamVjdFtdIHNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoc0VJcyk7DQotCQlhc3NlcnRFcXVhbHMoMywgc0VJcy5sZW5ndGgpOw0KLQkJYXNzZXJ0VHJ1ZShzRUlzWzBdIGluc3RhbmNlb2YgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7DQotCQlhc3NlcnRUcnVlKHNFSXNbMV0gaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsNCi0JCWFzc2VydFRydWUoc0VJc1syXSBpbnN0YW5jZW9mIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOw0KLQkJDQotCQlPYmplY3RbXSB3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblsxXSk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwod1NzKTsNCi0JCWFzc2VydEVxdWFscyh3U3MubGVuZ3RoLCAyKTsNCi0JCWFzc2VydFRydWUod1NzWzBdIGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpOw0KLQkJYXNzZXJ0VHJ1ZSh3U3NbMV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RIYXNDaGlsZHJlbk9iamVjdCgpIA0KLQl7DQotCQkvLyBJV2ViU2VydmljZVByb2plY3QNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihjaGlsZHJlblswXSkpOw0KLQkJDQotCQkvLyBJU0VJQ2hpbGRMaXN0ICYgSVdlYlNlcnZpY2VDaGlsZExpc3QNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQkJDQotCQlhc3NlcnRUcnVlKGFkYXB0ZXJGYWN0b3J5Lmhhc0NoaWxkcmVuKGNoaWxkcmVuWzBdKSk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXJGYWN0b3J5Lmhhc0NoaWxkcmVuKGNoaWxkcmVuWzFdKSk7DQotCQkNCi0JCS8vIG51bGwgcGFyYW1ldGVyDQotCQlhc3NlcnRGYWxzZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihudWxsKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDaGlsZHJlbklXZWJTZXJ2aWNlKCkNCi0Jew0KLQkJSVdlYlNlcnZpY2Ugd3MgPSBmaW5kV3MoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMS5XUzEiKTsNCi0JCWFzc2VydE5vdE51bGwod3MpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbih3cykpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHdzKS5sZW5ndGgpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih3cylbMF0gaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsNCi0JCQ0KLQkJLy8gY2hlY2sgaWYgYWRhcHRlZCBvbmx5IG9uY2UNCi0JCURPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIG90aGVyRmFjdG9yeSA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpOw0KLQkJb3RoZXJGYWN0b3J5LmdldENoaWxkcmVuKHdzKTsNCi0JCWFzc2VydEVxdWFscygyLCB3cy5lQWRhcHRlcnMoKS5zaXplKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hpbGRyZW5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkNCi0Jew0KLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBmaW5kU2VpKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuU2VpMiIpOw0KLQkJYXNzZXJ0Tm90TnVsbChzZWkpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihzZWkpKTsNCi0JCWFzc2VydEVxdWFscygyLCBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihzZWkpLmxlbmd0aCk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHNlaSlbMF0gaW5zdGFuY2VvZiBJV2ViTWV0aG9kKTsNCi0JCURPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIG90aGVyRmFjdG9yeSA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpOw0KLQkJb3RoZXJGYWN0b3J5LmdldENoaWxkcmVuKHNlaSk7DQotCQlhc3NlcnRFcXVhbHMoMiwgc2VpLmVBZGFwdGVycygpLnNpemUoKSk7DQotCQkNCi0JCUlXZWJTZXJ2aWNlIHdzID0gZmluZFdzKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuV1MyIik7DQotCQlhc3NlcnROb3ROdWxsKHdzKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXJGYWN0b3J5Lmhhc0NoaWxkcmVuKHdzLmdldFNlcnZpY2VFbmRwb2ludCgpKSk7DQotCQlhc3NlcnRFcXVhbHMoMCwgYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4od3MuZ2V0U2VydmljZUVuZHBvaW50KCkpLmxlbmd0aCk7DQotCQkvLyBjaGVjayBpZiBhZGFwdGVkIG9ubHkgb25jZQ0KLQkJb3RoZXJGYWN0b3J5LmdldENoaWxkcmVuKHdzLmdldFNlcnZpY2VFbmRwb2ludCgpKTsNCi0JCWFzc2VydEVxdWFscygyLCB3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKS5lQWRhcHRlcnMoKS5zaXplKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hpbGRyZW5XZWJNZXRob2QoKQ0KLQl7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IGZpbmRTZWkoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMS5TZWkyIik7DQotCQlhc3NlcnROb3ROdWxsKHNlaSk7DQotCQkNCi0JCUlXZWJNZXRob2QgbWV0aG9kID0gZmluZE1ldGhvZChzZWksICJ2b2lkTWV0aG9kV2l0aEFyZ3MiKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsJDQotCQlhc3NlcnRUcnVlKGFkYXB0ZXJGYWN0b3J5Lmhhc0NoaWxkcmVuKG1ldGhvZCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKG1ldGhvZCkubGVuZ3RoKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4obWV0aG9kKVswXSBpbnN0YW5jZW9mIElXZWJQYXJhbSk7DQotCQkNCi0JCSBtZXRob2QgPSBmaW5kTWV0aG9kKHNlaSwgInZvaWRNZXRob2RXaXRoTm9BcmdzSW5QYXJlbnQiKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXJGYWN0b3J5Lmhhc0NoaWxkcmVuKG1ldGhvZCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDAsIGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKG1ldGhvZCkubGVuZ3RoKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hpbGRyZW5XZWJQYXJhbSgpDQotCXsNCi0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gZmluZFNlaSgib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMxLlNlaTIiKTsNCi0JCWFzc2VydE5vdE51bGwoc2VpKTsNCi0JCQ0KLQkJSVdlYk1ldGhvZCBtZXRob2QgPSBmaW5kTWV0aG9kKHNlaSwgInZvaWRNZXRob2RXaXRoQXJncyIpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlckZhY3RvcnkuaGFzQ2hpbGRyZW4obWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkpKTsNCi0JCWFzc2VydEVxdWFscygwLCBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihtZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKSkubGVuZ3RoKTsNCi0JfQ0KLQkNCi0JDQotCXByaXZhdGUgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBmaW5kU2VpKGZpbmFsIFN0cmluZyBpbXBsTmFtZSkNCi0Jew0KLQkJZm9yKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpIDogd3NQcm9qZWN0LmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSkgDQotCQl7DQotCQkJaWYoc2VpLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKGltcGxOYW1lKSkgew0KLQkJCQlyZXR1cm4gc2VpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0JDQotCQ0KLQlwcml2YXRlIElXZWJTZXJ2aWNlIGZpbmRXcyhmaW5hbCBTdHJpbmcgaW1wbE5hbWUpDQotCXsNCi0JCWZvcihJV2ViU2VydmljZSB3cyA6IHdzUHJvamVjdC5nZXRXZWJTZXJ2aWNlcygpKSANCi0JCXsNCi0JCQlpZih3cy5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhpbXBsTmFtZSkpIHsNCi0JCQkJcmV0dXJuIHdzOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0JDQotCQ0KLQlwcml2YXRlIElXZWJNZXRob2QgZmluZE1ldGhvZChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUpIA0KLQl7DQotCQlmb3IoSVdlYk1ldGhvZCBtZXRob2QgOiBzZWkuZ2V0V2ViTWV0aG9kcygpKSANCi0JCXsNCi0JCQlpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhtZXRob2ROYW1lKSkgew0KLQkJCQlyZXR1cm4gbWV0aG9kOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotLy8JcHVibGljIHZvaWQgdGVzdE5vdGlmeUNoYW5nZWQoKQ0KLS8vCXsNCi0vLwkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOw0KLS8vCQkNCi0vLwkJdHJ5DQotLy8JCXsNCi0vLwkJCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIlNlaTMuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTNOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMyB7fSIpOw0KLS8vCQkJdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiV1MzLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MzTmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMS5TZWkzXCIpIHB1YmxpYyBjbGFzcyBXUzMge30iKTsNCi0vLwkJfQ0KLS8vCQljYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSkNCi0vLwkJew0KLS8vCQkJZmFpbChlLnRvU3RyaW5nKCkpOw0KLS8vCQl9DQotLy8JCQ0KLS8vCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0vLwkJDQotLy8JCU9iamVjdFtdIHNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotLy8JCQ0KLS8vCQlhc3NlcnRFcXVhbHMoc0VJcy5sZW5ndGgsIDMpOw0KLS8vCQkNCi0vLwkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMV0pOw0KLS8vCQkNCi0vLwkJYXNzZXJ0RXF1YWxzKHdTcy5sZW5ndGgsIDMpOw0KLS8vCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRXU1Byb2plY3QoKQ0KLQl7DQotCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpOw0KLQkJDQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7DQotCQlhc3NlcnROb3ROdWxsKGNoaWxkcmVuKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldFdzUHJvamVjdERvbU5vdExvYWRlZCgpDQotCXsNCi0JCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKCkgew0KLQkJCUBPdmVycmlkZQ0KLQkJCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3QgZ2V0V3NQcm9qZWN0KGZpbmFsIElET00gZG9tLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7DQotCQkJCXJldHVybiBudWxsOw0KLQkJCX0NCi0JCX07DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgY2hpbGRyZW4ubGVuZ3RoKTsNCi0JCWFzc2VydFRydWUoY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBJTG9hZGluZ1dzUHJvamVjdCk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0JCWFzc2VydEVxdWFscygxLCBjaGlsZHJlbi5sZW5ndGgpOw0KLQkJYXNzZXJ0VHJ1ZShjaGlsZHJlblswXSBpbnN0YW5jZW9mIElMb2FkaW5nRHVtbXkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0V3NQcm9qZWN0Q2hpbGRzRG9tTG9hZE5vdENhbmNlbGVkKCkNCi0Jew0KLQkJSUxvYWRpbmdXc1Byb2plY3QgbG9hZGluZ1Byb2plY3QgPSBuZXcgSUxvYWRpbmdXc1Byb2plY3QoKSB7DQotCQkJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7IHJldHVybiBudWxsOyB9DQotCQkJcHVibGljIGJvb2xlYW4gaXNMb2FkQ2FuY2VsZWQoKSB7cmV0dXJuIGZhbHNlO30NCi0JCX07DQotCQkJDQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGxvYWRpbmdQcm9qZWN0KTsNCi0JCWFzc2VydEVxdWFscygxLCBjaGlsZHJlbi5sZW5ndGgpOw0KLQkJYXNzZXJ0VHJ1ZShjaGlsZHJlblswXSBpbnN0YW5jZW9mIElMb2FkaW5nRHVtbXkpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRXc1Byb2plY3RDaGlsZHNEb21Mb2FkQ2FuY2VsZWQoKQ0KLQl7DQotCQlJTG9hZGluZ1dzUHJvamVjdCBsb2FkaW5nUHJvamVjdCA9IG5ldyBJTG9hZGluZ1dzUHJvamVjdCgpIHsNCi0JCQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsgcmV0dXJuIG51bGw7IH0NCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRDYW5jZWxlZCgpIHtyZXR1cm4gdHJ1ZTt9DQotCQl9Ow0KLQkJCQ0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihsb2FkaW5nUHJvamVjdCk7DQotCQlhc3NlcnRFcXVhbHMoMSwgY2hpbGRyZW4ubGVuZ3RoKTsNCi0JCWFzc2VydFRydWUoY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBJTG9hZGluZ0NhbmNlbGVkKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3VwcG9ydGluZ1J1bnRpbWUoKQ0KLQl7DQotCQlET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlck15IHByb3ZpZGVyID0gbmV3IERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyTXkoKTsNCi0JCUlXc0RPTVJ1bnRpbWVFeHRlbnNpb24gcnVudGltZSA9IHByb3ZpZGVyLmdldFN1cHBvcnRpbmdSdW50aW1lKHRlc3RQcmoxLmdldFByb2plY3QoKSk7DQotCQlhc3NlcnROb3ROdWxsKHJ1bnRpbWUpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgY2xhc3MgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXJNeSBleHRlbmRzIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyDQotCXsNCi0JCUBPdmVycmlkZQ0KLQkJcHVibGljIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZ2V0U3VwcG9ydGluZ1J1bnRpbWUoZmluYWwgSVByb2plY3QgcHJvamVjdCkgew0KLQkJCXJldHVybiBzdXBlci5nZXRTdXBwb3J0aW5nUnVudGltZShwcm9qZWN0KTsNCi0JCX0NCi0JfTsNCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNTQ4NzYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMubmF2aWdhdG9yOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkRPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdHNVdGlsczsNCi0NCi1wdWJsaWMgY2xhc3MgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgVGVzdFByb2plY3QgdGVzdFByajE7IA0KLQkNCi0JcHJvdGVjdGVkIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgdGFyZ2V0UmVzb3VyY2U7DQotCXByb3RlY3RlZCBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBhZGFwdGVyRmFjdG9yeTsNCi0JcHJvdGVjdGVkIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOw0KLQkNCi0JcHJpdmF0ZSBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0Ow0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiANCi0Jew0KLQkJaWYodGVzdFByajE9PW51bGwpDQotCQl7DQotCQkJSVByb2plY3QgZWpiUHJvamVjdCA9IFRlc3RQcm9qZWN0c1V0aWxzLmNyZWF0ZUVqYjNQcm9qZWN0KCJET01MYmxQcm92VGVzdFByb2plY3QxIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsNCi0JCQl0ZXN0UHJqMSA9IG5ldyBUZXN0UHJvamVjdChlamJQcm9qZWN0LmdldFByb2plY3QoKSk7DQotCQkJdGVzdFByajEuY3JlYXRlU291cmNlRm9sZGVyKCJzcmMiKTsNCi0JCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYzEgPSB0ZXN0UHJqMS5jcmVhdGVQYWNrYWdlKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEiKTsNCi0JCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJTZWkxLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkxTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTF7XG4iICsNCi0JCQkJCSJAamF2YXguandzLldlYk1ldGhvZChuYW1lPVwicGFyZW50TWV0aG9kXCIpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzSW5QYXJlbnQoKTtcbiIgKw0KLQkJCQkJIn0iKTsNCi0JCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJTZWkyLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkyTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTIgZXh0ZW5kcyBTZWkxIHtcbiIgKw0KLQkJCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKG5hbWU9XCJ3ZWJNZXRob2RcIikgcHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NOb3RJblBhcmVudCgpO1xuIiArDQotCQkJCQkifSIpOw0KLQkJCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIldTMS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMU5hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuU2VpMlwiKSBwdWJsaWMgY2xhc3MgV1MxIHt9Iik7DQotCQkJdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiV1MyLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MyTmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMS5TZWkyXCIpIHB1YmxpYyBjbGFzcyBXUzIge30iKTsNCi0JCX0NCi0JCQ0KLQkJdGFyZ2V0UmVzb3VyY2UgPSBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSkpOw0KLQkJdGFyZ2V0UmVzb3VyY2UubG9hZChudWxsKTsNCi0JCUl0ZXJhdG9yPElXZWJTZXJ2aWNlUHJvamVjdD4gd3NQcm9qZWN0cyA9IHRhcmdldFJlc291cmNlLmdldERPTSgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpLml0ZXJhdG9yKCk7DQotCQkNCi0JCXdoaWxlKHdzUHJvamVjdHMuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCUlXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2ogPSB3c1Byb2plY3RzLm5leHQoKTsNCi0JCQkNCi0JCQlpZih3c1Byb2ouZ2V0TmFtZSgpLmVxdWFscyh0ZXN0UHJqMS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKSkNCi0JCQl7DQotCQkJCXRoaXMud3NQcm9qZWN0ID0gd3NQcm9qOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLndzUHJvamVjdCk7DQotCQkNCi0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKCk7DQotCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpIA0KLQkJew0KLQkJCUBPdmVycmlkZQ0KLQkJCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3QgZ2V0V3NQcm9qZWN0KGZpbmFsIElET00gZG9tLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7DQotCQkJCXJldHVybiB3c1Byb2plY3Q7DQotCQkJfQkJCQ0KLQkJfTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW1hZ2VPYmplY3QoKSANCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoY2hpbGRyZW5bMF0pKTsNCi0NCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoY2hpbGRyZW5bMF0pKTsNCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXRJbWFnZShjaGlsZHJlblsxXSkpOw0KLQkJDQotCQlPYmplY3RbXSBzRUlzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uoc0VJc1swXSkpOw0KLQkJDQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UobnVsbCksIGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uoc0VJc1swXSkpOw0KLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldEltYWdlKHRlc3RQcmoxKSwgbGFiZWxQcm92aWRlci5nZXRJbWFnZShzRUlzWzBdKSk7DQotCQkNCi0JCU9iamVjdFtdIHdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzFdKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldEltYWdlKHdTc1swXSkpOw0KLQkJDQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UobnVsbCksIGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uod1NzWzBdKSk7DQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UodGVzdFByajEpLCBsYWJlbFByb3ZpZGVyLmdldEltYWdlKHdTc1swXSkpOw0KLQkJDQotCQlPYmplY3RbXSB3ZWJNZXRob2RzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oc0VJc1swXSk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXRJbWFnZSh3ZWJNZXRob2RzWzBdKSk7DQotCQkNCi0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXRJbWFnZShudWxsKSwgbGFiZWxQcm92aWRlci5nZXRJbWFnZSh3ZWJNZXRob2RzWzBdKSk7DQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UodGVzdFByajEpLCBsYWJlbFByb3ZpZGVyLmdldEltYWdlKHdlYk1ldGhvZHNbMF0pKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGV4dE9iamVjdCgpIA0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXRUZXh0KGNoaWxkcmVuWzBdKSk7DQotDQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldFRleHQoY2hpbGRyZW5bMF0pKTsNCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXRUZXh0KGNoaWxkcmVuWzFdKSk7DQotCQkNCi0JCU9iamVjdFtdIHNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXRUZXh0KHNFSXNbMF0pKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldFRleHQobnVsbCksIGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChzRUlzWzBdKSk7DQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dCh0ZXN0UHJqMSksIGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChzRUlzWzBdKSk7DQotCQkNCi0JCU9iamVjdFtdIHdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzFdKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldFRleHQod1NzWzBdKSk7DQotCQkNCi0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXRUZXh0KG51bGwpLCBsYWJlbFByb3ZpZGVyLmdldFRleHQod1NzWzBdKSk7DQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dCh0ZXN0UHJqMSksIGxhYmVsUHJvdmlkZXIuZ2V0VGV4dCh3U3NbMF0pKTsNCi0JCQ0KLQkJT2JqZWN0W10gd2ViTWV0aG9kcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHNFSXNbMF0pOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dCh3ZWJNZXRob2RzWzBdKSk7DQotCQkNCi0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXRUZXh0KG51bGwpLCBsYWJlbFByb3ZpZGVyLmdldFRleHQod2ViTWV0aG9kc1swXSkpOw0KLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldFRleHQodGVzdFByajEpLCBsYWJlbFByb3ZpZGVyLmdldFRleHQod2ViTWV0aG9kc1swXSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVzY3JpcHRpb24oKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbihjaGlsZHJlblswXSkpOw0KLQ0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbihjaGlsZHJlblswXSkpOw0KLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKGNoaWxkcmVuWzFdKSk7DQotCQkNCi0JCU9iamVjdFtdIHNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbihzRUlzWzBdKSk7DQotCQkNCi0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbihudWxsKSwgbGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbihzRUlzWzBdKSk7DQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24odGVzdFByajEpLCBsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKHNFSXNbMF0pKTsNCi0JCQ0KLQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMV0pOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24od1NzWzBdKSk7DQotCQkNCi0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbihudWxsKSwgbGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbih3U3NbMF0pKTsNCi0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbih0ZXN0UHJqMSksIGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24od1NzWzBdKSk7DQotCQkNCi0JCU9iamVjdFtdIHdlYk1ldGhvZHMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihzRUlzWzBdKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKHdlYk1ldGhvZHNbMF0pKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKG51bGwpLCBsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKHdlYk1ldGhvZHNbMF0pKTsNCi0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbih0ZXN0UHJqMSksIGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24od2ViTWV0aG9kc1swXSkpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL0RPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3ZjkxMTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMubmF2aWdhdG9yOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkRPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgDQotew0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWRhcHRlcigpIA0KLQl7DQotCQlET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSBwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5ID0gbmV3IERPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5KCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwocHJvcGVydHlBZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyKHByb3BlcnR5QWRhcHRlckZhY3RvcnksIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyLmNsYXNzKSk7DQotCQlhc3NlcnROdWxsKHByb3BlcnR5QWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcihwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LCBJV2ViU2VydmljZS5jbGFzcykpOw0KLQkJYXNzZXJ0VHJ1ZShwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIocHJvcGVydHlBZGFwdGVyRmFjdG9yeSwgSVByb3BlcnR5U291cmNlUHJvdmlkZXIuY2xhc3MpIGluc3RhbmNlb2YgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpOw0KLQkJYXNzZXJ0VHJ1ZShwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIocHJvcGVydHlBZGFwdGVyRmFjdG9yeSwgRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkuY2xhc3MpIGluc3RhbmNlb2YgRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBZGFwdGVyTGlzdCgpIA0KLQl7DQotCQlET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSBwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5ID0gbmV3IERPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5KCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwocHJvcGVydHlBZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyTGlzdCgpKTsNCi0JCWFzc2VydEVxdWFscyhwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXJMaXN0KCkubGVuZ3RoLCAxKTsNCi0JCWFzc2VydEVxdWFscyhwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXJMaXN0KClbMF0sIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmNsYXNzKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldEFkYXB0ZXJVc2VzU2FtZUZhY3RvcnkoKQ0KLQl7DQotCQlET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSBwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5ID0gbmV3IERPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5KCk7DQotCQlPYmplY3QgYWRhcHRlcjEgPSBwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIocHJvcGVydHlBZGFwdGVyRmFjdG9yeSwgSVByb3BlcnR5U291cmNlUHJvdmlkZXIuY2xhc3MpOw0KLQkJYXNzZXJ0Tm90TnVsbChhZGFwdGVyMSk7DQotCQlPYmplY3QgYWRhcHRlcjIgPSBwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIocHJvcGVydHlBZGFwdGVyRmFjdG9yeSwgSVByb3BlcnR5U291cmNlUHJvdmlkZXIuY2xhc3MpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyMT09YWRhcHRlcjIpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL1dlYlNlcnZpY2VEZWNvcmF0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9XZWJTZXJ2aWNlRGVjb3JhdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZmM5NWY0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL1dlYlNlcnZpY2VEZWNvcmF0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLm5hdmlnYXRvcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JU0VJQ2hpbGRMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JV2ViU2VydmljZUNoaWxkTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuV2ViU2VydmljZVByb2JsZW1zRGVjb3JhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5XZWJTZXJ2aWNlUHJvYmxlbXNEZWNvcmF0b3IuU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Eb21VdGlsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZG9tLnZhbGlkYXRpb24uRG9tVmFsaWRhdGlvbkNvbnN0YW50czsNCi0NCi0vKioNCi0gKiBUZXN0cyBmb3Ige0BsaW5rIFdlYlNlcnZpY2VEZWNvcmF0b3J9IGNsYXNzDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRGVjb3JhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIA0KLXsNCi0JcHJpdmF0ZSBUZXN0V2ViU2VydmljZURlY29yYXRvciBkZWNvcmF0b3IgPSBuZXcgVGVzdFdlYlNlcnZpY2VEZWNvcmF0b3IoKTs7DQotCXByaXZhdGUgVGVzdFByb2plY3QgdGVzdFByb2plY3Q7DQotCXByaXZhdGUgSVR5cGUgc2VpVHlwZTsNCi0JcHJpdmF0ZSBJVHlwZSB3c1R5cGU7DQotCQ0KLQlwcml2YXRlIERvbVV0aWwgZG9tVXRpbCA9IERvbVV0aWwuSU5TVEFOQ0U7DQotCXByaXZhdGUgSVdlYlNlcnZpY2Ugd3M7DQotCXByaXZhdGUgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWk7DQotCXByaXZhdGUgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdDsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRlc3RQcm9qZWN0ID0gbmV3IFRlc3RQcm9qZWN0KCk7DQotCQl0ZXN0UHJvamVjdC5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOw0KLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrID0gdGVzdFByb2plY3QuY3JlYXRlUGFja2FnZSgidGVzdCIpOw0KLQkJc2VpVHlwZSA9IHRlc3RQcm9qZWN0LmNyZWF0ZVR5cGUocGFjaywgIlNlaS5qYXZhIiwgInB1YmxpYyBpbnRlcmZhY2UgU2VpIHt9Iik7DQotCQkNCi0JCXNlaSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0JCXNlaS5lU2V0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sIHNlaVR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQ0KLQkJd3NUeXBlID0gdGVzdFByb2plY3QuY3JlYXRlVHlwZShwYWNrLCAiV3MuamF2YSIsICJwdWJsaWMgY2xhc3MgV3Mge30iKTsNCi0JCXdzID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2UoKTsNCi0JCXdzLmVTZXQoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiwgd3NUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCQ0KLQkJd3NQcm9qZWN0ID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0KCk7DQotCQl3c1Byb2plY3QuZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FLCB0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsNCi0JCXdzUHJvamVjdC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuYWRkKHNlaSk7DQotCQl3c1Byb2plY3QuZ2V0V2ViU2VydmljZXMoKS5hZGQod3MpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3REZWZpbmVTZXZlcml0eUZvck9iamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQl7DQotCQlhc3NlcnRFcXVhbHMoU2V2ZXJpdHkuT0ssIGRlY29yYXRvci5kZWZpbmVTZXZlcml0eShuZXcgSW50ZWdlcigxKSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmaW5lU2V2ZXJpdHlGb3JQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gDQotCXsNCi0JCWFzc2VydEVxdWFscyhTZXZlcml0eS5PSywgZGVjb3JhdG9yLmRlZmluZVNldmVyaXR5KHdzUHJvamVjdCkpOw0KLQkJDQotCQlJTWFya2VyIG1hcmtlciA9IHNlaVR5cGUuZ2V0UmVzb3VyY2UoKS5jcmVhdGVNYXJrZXIoRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5NQVJLRVJfSUQpOw0KLQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsJCQ0KLQkJYXNzZXJ0RXF1YWxzKFNldmVyaXR5LkVSUk9SLCBkZWNvcmF0b3IuZGVmaW5lU2V2ZXJpdHkod3NQcm9qZWN0KSk7DQotDQotCQlzZWlUeXBlLmdldFJlc291cmNlKCkuZGVsZXRlTWFya2VycyhEb21WYWxpZGF0aW9uQ29uc3RhbnRzLk1BUktFUl9JRCwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKFNldmVyaXR5Lk9LLCBkZWNvcmF0b3IuZGVmaW5lU2V2ZXJpdHkod3NQcm9qZWN0KSk7DQotDQotCQltYXJrZXIgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuY3JlYXRlTWFya2VyKERvbVZhbGlkYXRpb25Db25zdGFudHMuTUFSS0VSX0lEKTsNCi0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7DQotCQlhc3NlcnRFcXVhbHMoU2V2ZXJpdHkuRVJST1IsIGRlY29yYXRvci5kZWZpbmVTZXZlcml0eSh3c1Byb2plY3QpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdERlZmluZVNldmVyaXR5Rm9ySVNFSUNoaWxkTGlzdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQl7DQotCQlBZGFwdGVyIGFkYXB0ZXIgPSBDdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdCh3c1Byb2plY3QsIElTRUlDaGlsZExpc3QuY2xhc3MpOw0KLQkJYXNzZXJ0RXF1YWxzKFNldmVyaXR5Lk9LLCBkZWNvcmF0b3IuZGVmaW5lU2V2ZXJpdHkoYWRhcHRlcikpOwkNCi0JCQ0KLQkJSU1hcmtlciBtYXJrZXIgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuY3JlYXRlTWFya2VyKERvbVZhbGlkYXRpb25Db25zdGFudHMuTUFSS0VSX0lEKTsNCi0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7DQotCQkNCi0JCWFzc2VydEVxdWFscyhTZXZlcml0eS5FUlJPUiwgZGVjb3JhdG9yLmRlZmluZVNldmVyaXR5KGFkYXB0ZXIpKTsJCQkNCi0JCQ0KLQkJYWRhcHRlciA9IEN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdzUHJvamVjdCwgSVdlYlNlcnZpY2VDaGlsZExpc3QuY2xhc3MpOw0KLQkJYXNzZXJ0RXF1YWxzKFNldmVyaXR5Lk9LLCBkZWNvcmF0b3IuZGVmaW5lU2V2ZXJpdHkoYWRhcHRlcikpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3REZWZpbmVTZXZlcml0eUZvcklXZWJTZXJ2aWNlQ2hpbGRMaXN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gDQotCXsNCi0JCUFkYXB0ZXIgYWRhcHRlciA9IEN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdzUHJvamVjdCwgSVdlYlNlcnZpY2VDaGlsZExpc3QuY2xhc3MpOw0KLQkJYXNzZXJ0RXF1YWxzKFNldmVyaXR5Lk9LLCBkZWNvcmF0b3IuZGVmaW5lU2V2ZXJpdHkoYWRhcHRlcikpOwkNCi0JCQ0KLQkJSU1hcmtlciBtYXJrZXIgPSB3c1R5cGUuZ2V0UmVzb3VyY2UoKS5jcmVhdGVNYXJrZXIoRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5NQVJLRVJfSUQpOw0KLQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKFNldmVyaXR5LkVSUk9SLCBkZWNvcmF0b3IuZGVmaW5lU2V2ZXJpdHkoYWRhcHRlcikpOwkJCQ0KLQkJDQotCQlhZGFwdGVyID0gQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQod3NQcm9qZWN0LCBJU0VJQ2hpbGRMaXN0LmNsYXNzKTsNCi0JCWFzc2VydEVxdWFscyhTZXZlcml0eS5PSywgZGVjb3JhdG9yLmRlZmluZVNldmVyaXR5KGFkYXB0ZXIpKTsJCQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdERlZmluZVNldmVyaXR5SVdlYlNlcnZpY2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlhc3NlcnRFcXVhbHMoU2V2ZXJpdHkuT0ssIGRlY29yYXRvci5kZWZpbmVTZXZlcml0eSh3cykpOw0KLQkJDQotCQlJTWFya2VyIG1hcmtlciA9IHdzVHlwZS5nZXRSZXNvdXJjZSgpLmNyZWF0ZU1hcmtlcihEb21WYWxpZGF0aW9uQ29uc3RhbnRzLk1BUktFUl9JRCk7DQotCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoU2V2ZXJpdHkuRVJST1IsIGRlY29yYXRvci5kZWZpbmVTZXZlcml0eSh3cykpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmaW5lU2V2ZXJpdHlJV2ViU2VydmljZVdyb25nU2VpKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJSU1hcmtlciBtYXJrZXIgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuY3JlYXRlTWFya2VyKERvbVZhbGlkYXRpb25Db25zdGFudHMuTUFSS0VSX0lEKTsNCi0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7DQotDQotCQlhc3NlcnRFcXVhbHMoU2V2ZXJpdHkuT0ssIGRlY29yYXRvci5kZWZpbmVTZXZlcml0eSh3cykpOw0KLQ0KLQkJc2VpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuYWRkKHdzKTsNCi0JCWFzc2VydEVxdWFscyhTZXZlcml0eS5FUlJPUiwgZGVjb3JhdG9yLmRlZmluZVNldmVyaXR5KHdzKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3REZWZpbmVTZXZlcml0eVNlaSgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWFzc2VydEVxdWFscyhTZXZlcml0eS5PSywgZGVjb3JhdG9yLmRlZmluZVNldmVyaXR5KHNlaSkpOw0KLQkJDQotCQlJTWFya2VyIG1hcmtlciA9IHNlaVR5cGUuZ2V0UmVzb3VyY2UoKS5jcmVhdGVNYXJrZXIoRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5NQVJLRVJfSUQpOw0KLQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsNCi0JCWFzc2VydEVxdWFscyhTZXZlcml0eS5FUlJPUiwgZGVjb3JhdG9yLmRlZmluZVNldmVyaXR5KHNlaSkpOw0KLQkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3REZWZpbmVTZXZlcml0eVNlaVdyb25nTWV0aG9kKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJYXNzZXJ0RXF1YWxzKFNldmVyaXR5Lk9LLCBkZWNvcmF0b3IuZGVmaW5lU2V2ZXJpdHkoc2VpKSk7DQotCQkNCi0JCUlXZWJNZXRob2Qgd2ViTWV0aG9kID0gY3JlYXRlTWV0aG9kKHRydWUpOw0KLQkJSU1hcmtlciBtYXJrZXIgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuY3JlYXRlTWFya2VyKERvbVZhbGlkYXRpb25Db25zdGFudHMuTUFSS0VSX0lEKTsNCi0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7CQkNCi0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5JTVBMRU1FTlRBVElPTiwgZG9tVXRpbC5jYWxjVW5pcXVlSW1wbCh3ZWJNZXRob2QpKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKFNldmVyaXR5LkVSUk9SLCBkZWNvcmF0b3IuZGVmaW5lU2V2ZXJpdHkoc2VpKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3REZWZpbmVTZXZlcml0eVNlaVdyb25nUGFyYW0oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlhc3NlcnRFcXVhbHMoU2V2ZXJpdHkuT0ssIGRlY29yYXRvci5kZWZpbmVTZXZlcml0eShzZWkpKTsNCi0JCQ0KLQkJSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSBjcmVhdGVNZXRob2QodHJ1ZSk7DQotCQlJTWFya2VyIG1hcmtlciA9IHNlaVR5cGUuZ2V0UmVzb3VyY2UoKS5jcmVhdGVNYXJrZXIoRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5NQVJLRVJfSUQpOw0KLQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsJCQ0KLQkJbWFya2VyLnNldEF0dHJpYnV0ZShEb21WYWxpZGF0aW9uQ29uc3RhbnRzLklNUExFTUVOVEFUSU9OLCBkb21VdGlsLmNhbGNVbmlxdWVJbXBsKHdlYk1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApKSk7DQotCQkNCi0JCWFzc2VydEVxdWFscyhTZXZlcml0eS5FUlJPUiwgZGVjb3JhdG9yLmRlZmluZVNldmVyaXR5KHNlaSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmaW5lU2V2ZXJpdHlFT2JqZWN0SVJlc291cmNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gDQotCXsJCQ0KLQkJSU1hcmtlciBtYXJrZXIgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuY3JlYXRlTWFya2VyKERvbVZhbGlkYXRpb25Db25zdGFudHMuTUFSS0VSX0lEKTsNCi0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7CQkNCi0JCWFzc2VydEVxdWFscyhTZXZlcml0eS5FUlJPUiwgZGVjb3JhdG9yLmRlZmluZVNldmVyaXR5KHNlaSwgc2VpVHlwZS5nZXRSZXNvdXJjZSgpKSk7DQotDQotCQlhc3NlcnRFcXVhbHMoU2V2ZXJpdHkuRVJST1IsIGRlY29yYXRvci5kZWZpbmVTZXZlcml0eSh3c1Byb2plY3QsIHRlc3RQcm9qZWN0LmdldFByb2plY3QoKSkpOw0KLQ0KLQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcpOw0KLQkJYXNzZXJ0RXF1YWxzKFNldmVyaXR5LldBUk5JTkcsIGRlY29yYXRvci5kZWZpbmVTZXZlcml0eShzZWksIHNlaVR5cGUuZ2V0UmVzb3VyY2UoKSkpOw0KLQ0KLQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0lORk8pOw0KLQkJYXNzZXJ0RXF1YWxzKFNldmVyaXR5Lk9LLCBkZWNvcmF0b3IuZGVmaW5lU2V2ZXJpdHkoc2VpLCBzZWlUeXBlLmdldFJlc291cmNlKCkpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNSZWxldmFudEZvck1ldGhvZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IGNyZWF0ZU1ldGhvZChmYWxzZSk7DQotCQkNCi0JCUlNYXJrZXIgbWFya2VyID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmNyZWF0ZU1hcmtlcihEb21WYWxpZGF0aW9uQ29uc3RhbnRzLk1BUktFUl9JRCk7DQotCQltYXJrZXIuc2V0QXR0cmlidXRlKERvbVZhbGlkYXRpb25Db25zdGFudHMuSU1QTEVNRU5UQVRJT04sIGRvbVV0aWwuY2FsY1VuaXF1ZUltcGwod2ViTWV0aG9kKSk7DQotCQlhc3NlcnRUcnVlKGRlY29yYXRvci5pc1JlbGV2YW50Rm9yTWV0aG9kKHdlYk1ldGhvZCwgbWFya2VyKSk7DQotCQltYXJrZXIuc2V0QXR0cmlidXRlKERvbVZhbGlkYXRpb25Db25zdGFudHMuSU1QTEVNRU5UQVRJT04sICJvdGhlciIpOw0KLQkJYXNzZXJ0RmFsc2UoZGVjb3JhdG9yLmlzUmVsZXZhbnRGb3JNZXRob2Qod2ViTWV0aG9kLCBtYXJrZXIpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNSZWxldmFudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQl7DQotCQlJTWFya2VyIG1hcmtlciA9IHNlaVR5cGUuZ2V0UmVzb3VyY2UoKS5jcmVhdGVNYXJrZXIoRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5NQVJLRVJfSUQpOw0KLQkJYXNzZXJ0RmFsc2UoZGVjb3JhdG9yLmlzUmVsZXZhbnQoImltcGwiLCBtYXJrZXIpKTsNCi0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5JTVBMRU1FTlRBVElPTiwgImltcGwiKTsNCi0JCWFzc2VydFRydWUoZGVjb3JhdG9yLmlzUmVsZXZhbnQoImltcGwiLCBtYXJrZXIpKTsNCi0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5JTVBMRU1FTlRBVElPTiwgImltcGwiKTsNCi0JCWFzc2VydEZhbHNlKGRlY29yYXRvci5pc1JlbGV2YW50KCJuZXdJbXBsIiwgbWFya2VyKSk7CQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzUmVsZXZhbnRGb3IoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0Jew0KLQkJSU1hcmtlciBtYXJrZXIgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuY3JlYXRlTWFya2VyKERvbVZhbGlkYXRpb25Db25zdGFudHMuTUFSS0VSX0lEKTsNCi0JCWFzc2VydFRydWUoZGVjb3JhdG9yLmlzUmVsZXZhbnRGb3Ioc2VpLCBtYXJrZXIpKTsNCi0JCUlXZWJNZXRob2Qgd2ViTWV0aG9kID0gY3JlYXRlTWV0aG9kKGZhbHNlKTsNCi0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5JTVBMRU1FTlRBVElPTiwgZG9tVXRpbC5jYWxjVW5pcXVlSW1wbCh3ZWJNZXRob2QpKTsNCi0JCWFzc2VydFRydWUoZGVjb3JhdG9yLmlzUmVsZXZhbnRGb3Iod2ViTWV0aG9kLCBtYXJrZXIpKTsNCi0JCXdlYk1ldGhvZCA9IGNyZWF0ZU1ldGhvZCh0cnVlKTsNCi0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5JTVBMRU1FTlRBVElPTiwgZG9tVXRpbC5jYWxjVW5pcXVlSW1wbCh3ZWJNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKSkpOw0KLQkJYXNzZXJ0VHJ1ZShkZWNvcmF0b3IuaXNSZWxldmFudEZvcih3ZWJNZXRob2QsIG1hcmtlcikpOw0KLQkJYXNzZXJ0VHJ1ZShkZWNvcmF0b3IuaXNSZWxldmFudEZvcih3ZWJNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKSwgbWFya2VyKSk7DQotCQltYXJrZXIuc2V0QXR0cmlidXRlKERvbVZhbGlkYXRpb25Db25zdGFudHMuSU1QTEVNRU5UQVRJT04sICJpbXBsIik7DQotCQlhc3NlcnRGYWxzZShkZWNvcmF0b3IuaXNSZWxldmFudEZvcih3ZWJNZXRob2QsIG1hcmtlcikpOw0KLQkJYXNzZXJ0RmFsc2UoZGVjb3JhdG9yLmlzUmVsZXZhbnRGb3Iod2ViTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCksIG1hcmtlcikpOwkJDQotCX0NCi0JDQotCXByaXZhdGUgSVdlYk1ldGhvZCBjcmVhdGVNZXRob2QoYm9vbGVhbiB3aXRoUGFyYW0pIA0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJNZXRob2QoKTsNCi0JCXdlYk1ldGhvZC5lU2V0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sICJtZXRob2QoSSkiKTsNCi0JCQ0KLQkJaWYgKHdpdGhQYXJhbSkgDQotCQl7DQotCQkJZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlBhcmFtKCk7DQotCQkJd2ViUGFyYW0uZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCAiYSIpOw0KLQkJCXdlYk1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuYWRkKHdlYlBhcmFtKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHdlYk1ldGhvZDsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRlc3RXZWJTZXJ2aWNlRGVjb3JhdG9yIGV4dGVuZHMgV2ViU2VydmljZVByb2JsZW1zRGVjb3JhdG9yDQotCXsNCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWxldmFudChmaW5hbCBTdHJpbmcgaW1wbGVtZW50YXRpb24sIGZpbmFsIElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQkJcmV0dXJuIHN1cGVyLmlzUmVsZXZhbnQoaW1wbGVtZW50YXRpb24sIG1hcmtlcik7DQotCQl9DQotCQkNCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWxldmFudEZvcihmaW5hbCBFT2JqZWN0IGVPYmplY3QsIGZpbmFsIElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQkJcmV0dXJuIHN1cGVyLmlzUmVsZXZhbnRGb3IoZU9iamVjdCwgbWFya2VyKTsNCi0JCX0NCi0JCQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlbGV2YW50Rm9yTWV0aG9kKGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kLCBmaW5hbCBJTWFya2VyIG1hcmtlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJCXJldHVybiBzdXBlci5pc1JlbGV2YW50Rm9yTWV0aG9kKHdlYk1ldGhvZCwgbWFya2VyKTsNCi0JCX0NCi0JCQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgU2V2ZXJpdHkgZGVmaW5lU2V2ZXJpdHkoZmluYWwgRU9iamVjdCBlT2JqZWN0LCBmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCQlyZXR1cm4gc3VwZXIuZGVmaW5lU2V2ZXJpdHkoZU9iamVjdCwgcmVzb3VyY2UpOw0KLQkJfQ0KLQkJDQotCQlAT3ZlcnJpZGUNCi0JCXByb3RlY3RlZCBTZXZlcml0eSBkZWZpbmVTZXZlcml0eShmaW5hbCBPYmplY3Qgb2JqKSB7DQotCQkJcmV0dXJuIHN1cGVyLmRlZmluZVNldmVyaXR5KG9iaik7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvYWN0aW9ucy9XU0FjdGlvbkFic3RyYWN0VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvYWN0aW9ucy9XU0FjdGlvbkFic3RyYWN0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OTg0NWM4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL2FjdGlvbnMvV1NBY3Rpb25BYnN0cmFjdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMubmF2aWdhdG9yLmFjdGlvbnM7DQotDQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkRPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JU0VJQ2hpbGRMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JV2ViU2VydmljZUNoaWxkTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9ucy5XU0FjdGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0c1V0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLm5hdmlnYXRvci5OYXZpZ2F0b3JDb250ZW50U2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLmV4dGVuc2lvbnMuQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25WaWV3ZXJTaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuTmF2aWdhdG9yQ29udGVudFNlcnZpY2VGYWN0b3J5Ow0KLQ0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpDQotcHVibGljIGNsYXNzIFdTQWN0aW9uQWJzdHJhY3RUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlIA0KLXsNCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXN0UHJvamVjdCB0ZXN0UHJqMTsgDQotCXByb3RlY3RlZCBzdGF0aWMgVGVzdFByb2plY3QgdGVzdFByajI7IA0KLQlwcm90ZWN0ZWQgc3RhdGljIFRlc3RQcm9qZWN0IHRlc3RQcmozOw0KLQlwcm90ZWN0ZWQgc3RhdGljIFRlc3RQcm9qZWN0IHRlc3RQcmo0Ow0KLQkNCi0JcHJpdmF0ZSBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0MTsNCi0JcHJpdmF0ZSBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0MjsNCi0JcHJpdmF0ZSBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0MzsNCi0JcHJpdmF0ZSBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0NDsNCi0JDQotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYzE7DQotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYzI7DQotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYzM7DQotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYzQ7DQotCQ0KLQlwcm90ZWN0ZWQgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSB0YXJnZXRSZXNvdXJjZTsNCi0JcHJvdGVjdGVkIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5Ow0KLQkNCi0JcHJvdGVjdGVkIFdTQWN0aW9uUHJvdmlkZXIgd3NBY3Rpb25Qcm92ID0gbnVsbDsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJaWYodGVzdFByajE9PW51bGwpDQotCQl7DQotCQkJSVByb2plY3QgZWpiUHJvamVjdCA9IFRlc3RQcm9qZWN0c1V0aWxzLmNyZWF0ZUVqYjNQcm9qZWN0KCJET01XU0FjdGlvblRlc3RQcm9qZWN0MSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7DQotCQkJdGVzdFByajEgPSBuZXcgVGVzdFByb2plY3QoZWpiUHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJCXRlc3RQcmoxLmNyZWF0ZVNvdXJjZUZvbGRlcigic3JjIik7DQotCQkJbW9kZWxTeW5jMSA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMSIpOw0KLQkJCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIlNlaTEuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTFOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMXtcbiIgKw0KLQkJCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJwYXJlbnRNZXRob2RcIikgcHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NJblBhcmVudCgpO1xuIiArDQotCQkJCQkifSIpOw0KLQkJCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIlNlaTIuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTJOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMiBleHRlbmRzIFNlaTEge1xuIiArDQotCQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cIndlYk1ldGhvZFwiKSBwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aE5vQXJnc05vdEluUGFyZW50KCk7XG4iICsNCi0JCQkJCSJ9Iik7DQotCQkJdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiV1MxLmphdmEiLCAiQGphdmF4LmVqYi5TdGF0ZWxlc3NcbiIgKyAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MxTmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMS5TZWkyXCIpIHB1YmxpYyBjbGFzcyBXUzEge30iKTsNCi0JCQkNCi0JCX0NCi0JCQ0KLQkJaWYodGVzdFByajI9PW51bGwpDQotCQl7DQotCQkJSVByb2plY3Qgd2ViUHJvamVjdCA9IFRlc3RQcm9qZWN0c1V0aWxzLmNyZWF0ZVdlYjI1UHJvamVjdCgiRE9NV1NBY3Rpb25UZXN0UHJvamVjdDIiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOw0KLQkJCXRlc3RQcmoyID0gbmV3IFRlc3RQcm9qZWN0KHdlYlByb2plY3QuZ2V0UHJvamVjdCgpKTsNCi0JCQl0ZXN0UHJqMi5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOw0KLQkJCW1vZGVsU3luYzIgPSB0ZXN0UHJqMi5jcmVhdGVQYWNrYWdlKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzIiKTsNCi0JCQl0ZXN0UHJqMi5jcmVhdGVUeXBlKG1vZGVsU3luYzIsICJTZWkxLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkxTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTF7XG4iICsNCi0JCQkJCSJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwicGFyZW50TWV0aG9kXCIpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzSW5QYXJlbnQoKTtcbiIgKw0KLQkJCQkJIn0iKTsNCi0JCQl0ZXN0UHJqMi5jcmVhdGVUeXBlKG1vZGVsU3luYzIsICJTZWkyLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkyTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTIgZXh0ZW5kcyBTZWkxIHtcbiIgKw0KLQkJCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJ3ZWJNZXRob2RcIikgcHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NOb3RJblBhcmVudCgpO1xuIiArDQotCQkJCQkifSIpOw0KLQkJCXRlc3RQcmoyLmNyZWF0ZVR5cGUobW9kZWxTeW5jMiwgIldTMS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMU5hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuU2VpMlwiKSBwdWJsaWMgY2xhc3MgV1MxIHt9Iik7DQotCQl9DQotCQkNCi0JCWlmKHRlc3RQcmozPT1udWxsKQ0KLQkJew0KLQkJCUlQcm9qZWN0IGVqYlByb2plY3QgPSBUZXN0UHJvamVjdHNVdGlscy5jcmVhdGVFamIzUHJvamVjdCgiRE9NV1NBY3Rpb25UZXN0UHJvamVjdDMiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOw0KLQkJCXRlc3RQcmozID0gbmV3IFRlc3RQcm9qZWN0KGVqYlByb2plY3QuZ2V0UHJvamVjdCgpKTsNCi0JCQl0ZXN0UHJqMy5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOw0KLQkJCW1vZGVsU3luYzMgPSB0ZXN0UHJqMy5jcmVhdGVQYWNrYWdlKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzMiKTsNCi0JCQl0ZXN0UHJqMy5jcmVhdGVUeXBlKG1vZGVsU3luYzMsDQotCQkJCQkiV1MxLmphdmEiLA0KLQkJCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiSW1wbGljaXRTZWkxTmFtZVwiKSBwdWJsaWMgY2xhc3MgV1MxIHtcbiINCi0JCQkJCSsgIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJzdXBlclBhcmVudE1ldGhvZFwiKSBwdWJsaWMgdm9pZCBzdXBlclBhcmVudE1ldGhvZCgpIHt9XG4iDQotCQkJCQkrICJ9Iik7DQotCQkJDQotCQkJdGVzdFByajMuY3JlYXRlVHlwZShtb2RlbFN5bmMzLA0KLQkJCQkJIldTMi5qYXZhIiwNCi0JCQkJCSJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIkltcGxpY2l0U2VpMk5hbWVcIikgcHVibGljIGNsYXNzIFdTMiBleHRlbmRzIFdTMSB7XG4iDQotCQkJCQkrICJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwicGFyZW50TWV0aG9kXCIpIHB1YmxpYyB2b2lkIHBhcmVudE1ldGhvZCgpIHt9XG4iDQotCQkJCQkrICJ9Iik7DQotCQkJDQotCQkJdGVzdFByajMuY3JlYXRlVHlwZShtb2RlbFN5bmMzLA0KLQkJCQkJIldTMy5qYXZhIiwNCi0JCQkJCSJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIkltcGxpY2l0U2VpM05hbWVcIikgcHVibGljIGNsYXNzIFdTMyBleHRlbmRzIFdTMiB7XG4iDQotCQkJCQkrICJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwid2ViTWV0aG9kXCIpIHB1YmxpYyB2b2lkIHdlYk1ldGhvZChpbnQgcGFyYW0pIHt9XG4iDQotCQkJCQkrICJ9Iik7DQotCQl9DQotDQotCQlpZih0ZXN0UHJqND09bnVsbCkNCi0JCXsNCi0JCQlJUHJvamVjdCB3ZWJQcm9qZWN0ID0gVGVzdFByb2plY3RzVXRpbHMuY3JlYXRlV2ViMjVQcm9qZWN0KCJET01XU0FjdGlvblRlc3RQcm9qZWN0NCIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7DQotCQkJdGVzdFByajQgPSBuZXcgVGVzdFByb2plY3Qod2ViUHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJCXRlc3RQcmo0LmNyZWF0ZVNvdXJjZUZvbGRlcigic3JjIik7DQotCQkJbW9kZWxTeW5jNCA9IHRlc3RQcmo0LmNyZWF0ZVBhY2thZ2UoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jNCIpOw0KLQkJCXRlc3RQcmo0LmNyZWF0ZVR5cGUobW9kZWxTeW5jNCwNCi0JCQkJCSJXUzEuamF2YSIsDQotCQkJCQkiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJJbXBsaWNpdFNlaTFOYW1lXCIpIHB1YmxpYyBjbGFzcyBXUzEge1xuIg0KLQkJCQkJKyAiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cInN1cGVyUGFyZW50TWV0aG9kXCIpIHB1YmxpYyB2b2lkIHN1cGVyUGFyZW50TWV0aG9kKCkge31cbiINCi0JCQkJCSsgIn0iKTsNCi0JCQkNCi0JCQl0ZXN0UHJqNC5jcmVhdGVUeXBlKG1vZGVsU3luYzQsDQotCQkJCQkiV1MyLmphdmEiLA0KLQkJCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiSW1wbGljaXRTZWkyTmFtZVwiKSBwdWJsaWMgY2xhc3MgV1MyIGV4dGVuZHMgV1MxIHtcbiINCi0JCQkJCSsgIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJwYXJlbnRNZXRob2RcIikgcHVibGljIHZvaWQgcGFyZW50TWV0aG9kKCkge31cbiINCi0JCQkJCSsgIn0iKTsNCi0JCQkNCi0JCQl0ZXN0UHJqNC5jcmVhdGVUeXBlKG1vZGVsU3luYzQsDQotCQkJCQkiV1MzLmphdmEiLA0KLQkJCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiSW1wbGljaXRTZWkzTmFtZVwiKSBwdWJsaWMgY2xhc3MgV1MzIGV4dGVuZHMgV1MyIHtcbiINCi0JCQkJCSsgIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJ3ZWJNZXRob2RcIikgcHVibGljIHZvaWQgd2ViTWV0aG9kKCkge31cbiINCi0JCQkJCSsgIn0iKTsNCi0JCX0NCi0NCi0JCXRhcmdldFJlc291cmNlID0gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpKTsNCi0JCXRhcmdldFJlc291cmNlLmxvYWQobnVsbCk7DQotCQkNCi0JCUl0ZXJhdG9yPElXZWJTZXJ2aWNlUHJvamVjdD4gd3NQcm9qZWN0cyA9IHRhcmdldFJlc291cmNlLmdldERPTSgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpLml0ZXJhdG9yKCk7DQotCQkNCi0JCXdoaWxlKHdzUHJvamVjdHMuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCUlXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgPSB3c1Byb2plY3RzLm5leHQoKTsNCi0JCQkNCi0JCQlpZih3c1Byb2plY3QuZ2V0TmFtZSgpLmVxdWFscyh0ZXN0UHJqMS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKSkNCi0JCQl7DQotCQkJCXRoaXMud3NQcm9qZWN0MSA9IHdzUHJvamVjdDsNCi0JCQl9DQotCQkJZWxzZSBpZih3c1Byb2plY3QuZ2V0TmFtZSgpLmVxdWFscyh0ZXN0UHJqMi5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKSkNCi0JCQl7DQotCQkJCXRoaXMud3NQcm9qZWN0MiA9IHdzUHJvamVjdDsNCi0JCQl9DQotCQkJZWxzZSBpZih3c1Byb2plY3QuZ2V0TmFtZSgpLmVxdWFscyh0ZXN0UHJqMy5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKSkNCi0JCQl7DQotCQkJCXRoaXMud3NQcm9qZWN0MyA9IHdzUHJvamVjdDsNCi0JCQl9DQotCQkJZWxzZSBpZih3c1Byb2plY3QuZ2V0TmFtZSgpLmVxdWFscyh0ZXN0UHJqNC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKSkNCi0JCQl7DQotCQkJCXRoaXMud3NQcm9qZWN0NCA9IHdzUHJvamVjdDsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwodGhpcy53c1Byb2plY3QxKTsNCi0JCWFzc2VydE5vdE51bGwodGhpcy53c1Byb2plY3QyKTsNCi0JCWFzc2VydE5vdE51bGwodGhpcy53c1Byb2plY3QzKTsNCi0JCWFzc2VydE5vdE51bGwodGhpcy53c1Byb2plY3Q0KTsNCi0JCQ0KLQkJYWRhcHRlckZhY3RvcnkgPSBuZXcgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoKSANCi0JCXsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0IGdldFdzUHJvamVjdChmaW5hbCBJRE9NIGRvbSwgZmluYWwgSVByb2plY3QgcHJvamVjdCkgew0KLQkJCQlpZihwcm9qZWN0LmdldE5hbWUoKS5lcXVhbHMod3NQcm9qZWN0MS5nZXROYW1lKCkpKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gd3NQcm9qZWN0MTsNCi0JCQkJfQ0KLQkJCQllbHNlIGlmKHByb2plY3QuZ2V0TmFtZSgpLmVxdWFscyh3c1Byb2plY3QyLmdldE5hbWUoKSkpDQotCQkJCXsNCi0JCQkJCXJldHVybiB3c1Byb2plY3QyOw0KLQkJCQl9DQotCQkJCWVsc2UgaWYocHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHdzUHJvamVjdDMuZ2V0TmFtZSgpKSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIHdzUHJvamVjdDM7DQotCQkJCX0NCi0JCQkJZWxzZSBpZihwcm9qZWN0LmdldE5hbWUoKS5lcXVhbHMod3NQcm9qZWN0NC5nZXROYW1lKCkpKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gd3NQcm9qZWN0NDsNCi0JCQkJfQ0KLQkJCQl0aHJvdyBuZXcganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yKCJwcm9qZWN0ICIgKyBwcm9qZWN0ICsgIm5vdCBmb3VuZCBpbiBET00iKTsNCi0JCQl9CQkJDQotCQl9Ow0KLQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2UgZ2V0V1NGcm9tRWpiUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQkJew0KLQkJCQlPYmplY3RbXSB3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJcmV0dXJuIChJV2ViU2VydmljZSl3U3NbMF07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlIGdldFdTRnJvbVdlYlByb2plY3QoKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoyLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCXJldHVybiAoSVdlYlNlcnZpY2Upd1NzWzBdOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGdldFNFSUV4cEZyb21FamJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJT2JqZWN0W10gc0VJcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlyZXR1cm4gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upc0VJc1swXTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBnZXRTRUlGcm9tVGVzdFByajEoU3RyaW5nIHNlaU5hbWUpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCU9iamVjdFtdIHNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJZm9yKGludCBqaj0wOyBqajxzRUlzLmxlbmd0aDsgamorKykNCi0JCQkJew0KLQkJCQkJaWYoKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNFSXNbampdKS5nZXROYW1lKCkuZXF1YWxzKHNlaU5hbWUpKQ0KLQkJCQkJew0KLQkJCQkJCXJldHVybiAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlzRUlzW2pqXTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV2ViU2VydmljZSBnZXRXU0Zyb21UZXN0UHJqKFRlc3RQcm9qZWN0IHRlc3RQcmosIFN0cmluZyB3c05hbWUpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByai5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCU9iamVjdFtdIHdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlmb3IoaW50IGpqPTA7IGpqPHdTcy5sZW5ndGg7IGpqKyspDQotCQkJCXsNCi0JCQkJCWlmKCgoSVdlYlNlcnZpY2Upd1NzW2pqXSkuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMod3NOYW1lKSkNCi0JCQkJCXsNCi0JCQkJCQlyZXR1cm4gKElXZWJTZXJ2aWNlKXdTc1tqal07DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLS8vCXByb3RlY3RlZCBJV2ViU2VydmljZSBnZXRXU0Zyb21UZXN0UHJqMShTdHJpbmcgd3NOYW1lKQ0KLS8vCXsNCi0vLwkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOw0KLS8vCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0vLw0KLS8vCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0vLwkJew0KLS8vCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotLy8JCQl7DQotLy8JCQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0vLwkJCQkNCi0vLwkJCQlmb3IoaW50IGpqPTA7IGpqPHdTcy5sZW5ndGg7IGpqKyspDQotLy8JCQkJew0KLS8vCQkJCQlpZigoKElXZWJTZXJ2aWNlKXdTc1tqal0pLmdldE5hbWUoKS5lcXVhbHMod3NOYW1lKSkNCi0vLwkJCQkJew0KLS8vCQkJCQkJcmV0dXJuIChJV2ViU2VydmljZSl3U3NbampdOw0KLS8vCQkJCQl9DQotLy8JCQkJfQ0KLS8vCQkJfQ0KLS8vCQl9DQotLy8JCQ0KLS8vCQlyZXR1cm4gbnVsbDsNCi0vLwl9DQotCQ0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBnZXRTRUlGcm9tVGVzdFByajMoU3RyaW5nIHNlaU5hbWUpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajMuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQkJew0KLQkJCQlPYmplY3RbXSB3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJZm9yKGludCBqaj0wOyBqajx3U3MubGVuZ3RoOyBqaisrKQ0KLQkJCQl7DQotCQkJCQlpZigoKElXZWJTZXJ2aWNlKXdTc1tqal0pLmdldFNlcnZpY2VFbmRwb2ludCgpLmdldE5hbWUoKS5lcXVhbHMoc2VpTmFtZSkpDQotCQkJCQl7DQotCQkJCQkJcmV0dXJuICgoSVdlYlNlcnZpY2Upd1NzW2pqXSkuZ2V0U2VydmljZUVuZHBvaW50KCk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBnZXRTRUlFeHBGcm9tV2ViUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajIuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCU9iamVjdFtdIHNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJcmV0dXJuIChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNFSXNbMF07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZ2V0U0VJSW1wRnJvbUVqYlByb2plY3QoKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmozLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCXJldHVybiAoKElXZWJTZXJ2aWNlKXdTc1swXSkuZ2V0U2VydmljZUVuZHBvaW50KCk7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZ2V0U0VJSW1wRnJvbVdlYlByb2plY3QoKQ0KLQl7DQotCQkNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajQuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQkJew0KLQkJCQlPYmplY3RbXSB3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJcmV0dXJuICgoSVdlYlNlcnZpY2Upd1NzWzBdKS5nZXRTZXJ2aWNlRW5kcG9pbnQoKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYk1ldGhvZCBnZXRXU01ldGhvZEluaGVyaXRlZEZyb21FamJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMy5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotCQlPYmplY3RbXSB3U3MgPSBudWxsOw0KLQkJT2JqZWN0W10gd2ViTWV0aG9kcyA9IG51bGw7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3U3MpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHdTcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJV2ViU2VydmljZSl3U3NbaWldKS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMzLldTMyIpKQ0KLQkJCXsNCi0JCQkJd2ViTWV0aG9kcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKCgoSVdlYlNlcnZpY2Upd1NzW2lpXSkuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdlYk1ldGhvZHMpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHdlYk1ldGhvZHMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXSkuZ2V0TmFtZSgpLmVxdWFscygic3VwZXJQYXJlbnRNZXRob2QiKSkNCi0JCQl7DQotCQkJCXJldHVybiAoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYk1ldGhvZCBnZXRXU01ldGhvZEluaGVyaXRlZEZyb21XZWJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqNC5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlPYmplY3RbXSB3U3MgPSBudWxsOw0KLQkJT2JqZWN0W10gd2ViTWV0aG9kcyA9IG51bGw7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3U3MpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHdTcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJV2ViU2VydmljZSl3U3NbaWldKS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmM0LldTMyIpKQ0KLQkJCXsNCi0JCQkJd2ViTWV0aG9kcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKCgoSVdlYlNlcnZpY2Upd1NzW2lpXSkuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdlYk1ldGhvZHMpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHdlYk1ldGhvZHMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXSkuZ2V0TmFtZSgpLmVxdWFscygic3VwZXJQYXJlbnRNZXRob2QiKSkNCi0JCQl7DQotCQkJCXJldHVybiAoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYk1ldGhvZCBnZXRXU01ldGhvZE5vdEluaGVyaXRlZEZyb21FamJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMy5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlPYmplY3RbXSB3U3MgPSBudWxsOw0KLQkJT2JqZWN0W10gd2ViTWV0aG9kcyA9IG51bGw7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3U3MpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHdTcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJV2ViU2VydmljZSl3U3NbaWldKS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMzLldTMyIpKQ0KLQkJCXsNCi0JCQkJd2ViTWV0aG9kcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKCgoSVdlYlNlcnZpY2Upd1NzW2lpXSkuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdlYk1ldGhvZHMpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHdlYk1ldGhvZHMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXSkuZ2V0TmFtZSgpLmVxdWFscygid2ViTWV0aG9kIikpDQotCQkJew0KLQkJCQlyZXR1cm4gKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJNZXRob2QgZ2V0V1NNZXRob2ROb3RJbmhlcml0ZWRGcm9tV2ViUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajQuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJT2JqZWN0W10gd1NzID0gbnVsbDsNCi0JCU9iamVjdFtdIHdlYk1ldGhvZHMgPSBudWxsOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCXdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwod1NzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3U3MubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYlNlcnZpY2Upd1NzW2lpXSkuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jNC5XUzMiKSkNCi0JCQl7DQotCQkJCXdlYk1ldGhvZHMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbigoKElXZWJTZXJ2aWNlKXdTc1tpaV0pLmdldFNlcnZpY2VFbmRwb2ludCgpKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3ZWJNZXRob2RzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3ZWJNZXRob2RzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV0pLmdldE5hbWUoKS5lcXVhbHMoIndlYk1ldGhvZCIpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV2ViTWV0aG9kIGdldFNFSU1ldGhvZEluaGVyaXRlZEZyb21FamJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlPYmplY3RbXSBzRUlzID0gbnVsbDsNCi0JCU9iamVjdFtdIHdlYk1ldGhvZHMgPSBudWxsOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJc0VJcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwoc0VJcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8c0VJcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNFSXNbaWldKS5nZXROYW1lKCkuZXF1YWxzKCJTZWkyTmFtZSIpKQ0KLQkJCXsNCi0JCQkJd2ViTWV0aG9kcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlzRUlzW2lpXSkpOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdlYk1ldGhvZHMpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHdlYk1ldGhvZHMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXSkuZ2V0TmFtZSgpLmVxdWFscygicGFyZW50TWV0aG9kIikpDQotCQkJew0KLQkJCQlyZXR1cm4gKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJNZXRob2QgZ2V0U0VJTWV0aG9kSW5oZXJpdGVkRnJvbVdlYlByb2plY3QoKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoyLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCU9iamVjdFtdIHNFSXMgPSBudWxsOw0KLQkJT2JqZWN0W10gd2ViTWV0aG9kcyA9IG51bGw7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElTRUlDaGlsZExpc3QpDQotCQkJew0KLQkJCQlzRUlzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChzRUlzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTxzRUlzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upc0VJc1tpaV0pLmdldE5hbWUoKS5lcXVhbHMoIlNlaTJOYW1lIikpDQotCQkJew0KLQkJCQl3ZWJNZXRob2RzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNFSXNbaWldKSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwod2ViTWV0aG9kcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8d2ViTWV0aG9kcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldKS5nZXROYW1lKCkuZXF1YWxzKCJwYXJlbnRNZXRob2QiKSkNCi0JCQl7DQotCQkJCXJldHVybiAoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYk1ldGhvZCBnZXRTRUlNZXRob2ROb3RJbmhlcml0ZWRGcm9tRWpiUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJT2JqZWN0W10gc0VJcyA9IG51bGw7DQotCQlPYmplY3RbXSB3ZWJNZXRob2RzID0gbnVsbDsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCXNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHNFSXMpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHNFSXMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlzRUlzW2lpXSkuZ2V0TmFtZSgpLmVxdWFscygiU2VpMk5hbWUiKSkNCi0JCQl7DQotCQkJCXdlYk1ldGhvZHMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbigoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upc0VJc1tpaV0pKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3ZWJNZXRob2RzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3ZWJNZXRob2RzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV0pLmdldE5hbWUoKS5lcXVhbHMoIndlYk1ldGhvZCIpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV2ViTWV0aG9kIGdldFNFSU1ldGhvZE5vdEluaGVyaXRlZEZyb21XZWJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMi5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlPYmplY3RbXSBzRUlzID0gbnVsbDsNCi0JCU9iamVjdFtdIHdlYk1ldGhvZHMgPSBudWxsOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJc0VJcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwoc0VJcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8c0VJcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNFSXNbaWldKS5nZXROYW1lKCkuZXF1YWxzKCJTZWkyTmFtZSIpKQ0KLQkJCXsNCi0JCQkJd2ViTWV0aG9kcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlzRUlzW2lpXSkpOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdlYk1ldGhvZHMpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHdlYk1ldGhvZHMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXSkuZ2V0TmFtZSgpLmVxdWFscygid2ViTWV0aG9kIikpDQotCQkJew0KLQkJCQlyZXR1cm4gKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFdzQWN0aW9uUHJvdmlkZXJXaXRoVHJlZVNlbGVjdGlvbihPYmplY3RbXSBzZWxlY3Rpb24pDQotCXsNCi0JCXdzQWN0aW9uUHJvdiA9IG5ldyBXU0FjdGlvblByb3ZpZGVyKCk7DQotCQkNCi0JCU1vY2s8VHJlZVZpZXdlcj4gdHJlZVZpZXdlciA9IG1vY2soVHJlZVZpZXdlci5jbGFzcyk7DQotCQlDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlIGNBRXh0U2l0ZSA9IGNyZWF0ZUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGVNb2NrKHRyZWVWaWV3ZXIucHJveHkoKSk7DQotDQotCQl3c0FjdGlvblByb3YuaW5pdChjQUV4dFNpdGUpOw0KLQkJDQotCQlUcmVlUGF0aCBwYXRoID0gbmV3IFRyZWVQYXRoKHNlbGVjdGlvbik7DQotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IG5ldyBUcmVlU2VsZWN0aW9uKHBhdGgpOw0KLQkJQWN0aW9uQ29udGV4dCBhY3RDbnQgPSBuZXcgQWN0aW9uQ29udGV4dChzZWwpOw0KLQkJDQotCQl3c0FjdGlvblByb3Yuc2V0Q29udGV4dChhY3RDbnQpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0V3NBY3Rpb25Qcm92aWRlcldpdGhTdHJ1Y3R1cmVkU2VsZWN0aW9uKE9iamVjdFtdIHNlbGVjdGlvbikNCi0Jew0KLQkJd3NBY3Rpb25Qcm92ID0gbmV3IFdTQWN0aW9uUHJvdmlkZXIoKTsNCi0NCi0JCU1vY2s8VHJlZVZpZXdlcj4gdHJlZVZpZXdlciA9IG1vY2soVHJlZVZpZXdlci5jbGFzcyk7DQotCQlDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlIGNBRXh0U2l0ZSA9IGNyZWF0ZUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGVNb2NrKHRyZWVWaWV3ZXIucHJveHkoKSk7DQotDQotCQl3c0FjdGlvblByb3YuaW5pdChjQUV4dFNpdGUpOw0KLQkJDQotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbik7DQotCQlBY3Rpb25Db250ZXh0IGFjdENudCA9IG5ldyBBY3Rpb25Db250ZXh0KHNlbCk7DQotCQkNCi0JCXdzQWN0aW9uUHJvdi5zZXRDb250ZXh0KGFjdENudCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3QgZ2V0V3NQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpDQotCXsNCi0JCUl0ZXJhdG9yPElXZWJTZXJ2aWNlUHJvamVjdD4gd3NQcm9qZWN0cyA9IHRhcmdldFJlc291cmNlLmdldERPTSgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpLml0ZXJhdG9yKCk7DQotCQkNCi0JCXdoaWxlKHdzUHJvamVjdHMuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCUlXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgPSB3c1Byb2plY3RzLm5leHQoKTsNCi0JCQkNCi0JCQlpZih3c1Byb2plY3QuZ2V0TmFtZSgpLmVxdWFscyhwcm9qZWN0LmdldE5hbWUoKSkpDQotCQkJew0KLQkJCQlyZXR1cm4gd3NQcm9qZWN0Ow0KLQkJCX0NCi0JCX0NCi0JCXRocm93IG5ldyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3IoInByb2plY3QgIiArIHByb2plY3QgKyAibm90IGZvdW5kIGluIERPTSIpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZSBjcmVhdGVDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlTW9jayhmaW5hbCBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikNCi0Jew0KLQkJZmluYWwgTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgY29udGVudFNlcnZpY2UgPSAoTmF2aWdhdG9yQ29udGVudFNlcnZpY2UpTmF2aWdhdG9yQ29udGVudFNlcnZpY2VGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZUNvbnRlbnRTZXJ2aWNlKCJteXZpZXdlciIpOw0KLQkJDQotCQkvL0VjbGlwc2UgMy41IGNvbnN0cnVjdG9yIHJlcXVpcmVkIGZvciBXVFAgYnVpbGQNCi0JCXJldHVybiBuZXcgQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZSgibXlleHRlbnNpb25pZCIsICJteXBsdWdpbmlkIiwgKElDb21tb25WaWV3ZXJTaXRlKW1vY2soSUNvbW1vblZpZXdlclNpdGUuY2xhc3MpLnByb3h5KCksIGNvbnRlbnRTZXJ2aWNlLCB2aWV3ZXIpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSUNvbnRyaWJ1dGlvbkl0ZW0gY3JlYXRlQ29udHJpYnV0aW9uSXRlbU1vY2soZmluYWwgU3RyaW5nIGl0ZW1JZCkNCi0Jew0KLQkJTW9jazxJQ29udHJpYnV0aW9uSXRlbT4gY250cmJJdGVtID0gbW9jayhJQ29udHJpYnV0aW9uSXRlbS5jbGFzcyk7DQotCQljbnRyYkl0ZW0uc3R1YnMoKS5tZXRob2QoImdldElkIikud2lsbChyZXR1cm5WYWx1ZShpdGVtSWQpKTsNCi0JCWNudHJiSXRlbS5zdHVicygpLm1ldGhvZCgic2V0UGFyZW50Iikud2lsbChyZXR1cm5WYWx1ZShudWxsKSk7DQotCQljbnRyYkl0ZW0uc3R1YnMoKS5tZXRob2QoImlzRHluYW1pYyIpLndpbGwocmV0dXJuVmFsdWUoZmFsc2UpKTsNCi0JCXJldHVybiBjbnRyYkl0ZW0ucHJveHkoKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIHZvaWQgZmlsbE1lbnVXaXRoQ29udHJpYnV0aW9uSXRlbXMoZmluYWwgTWVudU1hbmFnZXIgbWVudSwgZmluYWwgU3RyaW5nLi4uIGl0ZW1JZHMpDQotCXsNCi0JCWZvcihTdHJpbmcgaWQgOiBpdGVtSWRzKQ0KLQkJew0KLQkJCUlDb250cmlidXRpb25JdGVtIGNudHJiSXRlbSA9IGNyZWF0ZUNvbnRyaWJ1dGlvbkl0ZW1Nb2NrKGlkKTsNCi0JCQltZW51LmFkZChjbnRyYkl0ZW0pOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMWE0MzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWMyNDFhNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlMDQ4NGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI01vbiBKdWwgMjAgMTU6MjU6MzEgRUVTVCAyMDA5DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViNTYwNzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMA0KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjANCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHM7c2luZ2xldG9uOj10cnVlDQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcg0KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbg0KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQ0KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLA0KLSBvcmcuam1vY2ssDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSwNCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsDQotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLA0KLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LA0KLSBvcmcuZWNsaXBzZS51aSwNCi0gb3JnLmVjbGlwc2UudWkuaWRlLA0KLSBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbiwNCi0gb3JnLmp1bml0DQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmFubm90YXRpb25zLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLmFubm90YXRpb24sDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5pbXBsLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLmRlZmF1bHRzLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3RhdGUsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3luYywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS51dGlsLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnZhbGlkYXRpb24sDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy52YWxpZGF0aW9uDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiN2FjZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5BdWd1c3QgMjAsIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYWFlMjQ5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcDQotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcDQotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2OWZhMDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLUJ1bmRsZS1OYW1lLjA9RE9NIFJ1bnRpbWUgVGVzdHMgKEluY3ViYXRpb24pDQotQnVuZGxlLVZlbmRvci4wPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzY5M2I3Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPD9lY2xpcHNlIHZlcnNpb249IjMuNCI/Pg0KLTwhLS0NCi0gICAgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAgIA0KLSAgICBDb250cmlidXRvcnM6DQotICAgICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gLS0+DQotDQotPGZyYWdtZW50Pg0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBpZD0ic3VwcG9ydGVkcnVudGltZXRlc3QiDQotICAgICAgICAgbmFtZT0iVGVzdGluZyINCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmRvbXJ1bnRpbWVzIj4NCi0gICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20uVGVzdFdzRE9NUnVudGltZUV4dGVuc2lvbiIvPg0KLSAgICAgIDxwcm9qZWN0X2ZhY2V0IA0KLSAgICAgIAkgaWQ9ImpzdC53ZWIiDQotICAgICAgCSB2ZXJzaW9uPSIxLjAuMC4wIi8+DQotICAgICAgPHByb2plY3RfZmFjZXQgDQotICAgICAgCSBpZD0idGVzdC5mYWNldCIvPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBpZD0ic3VwcG9ydGVkcnVudGltZXRlc3QxIg0KLSAgICAgICAgIG5hbWU9IlRlc3RpbmcxIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuZG9tcnVudGltZXMiPg0KLSAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5UZXN0V3NET01SdW50aW1lRXh0ZW5zaW9uIi8+DQotICAgICAgPHByb2plY3RfZmFjZXQgDQotICAgICAgCSBpZD0ianN0LndlYmIiDQotICAgICAgCSB2ZXJzaW9uPSIxLjAuMC4wIi8+DQotICAgICAgPHByb2plY3RfZmFjZXQgDQotICAgICAgCSBpZD0idGVzdC5mYWNldHQiLz4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9InN1cHBvcnRlZHJ1bnRpbWV0ZXN0MiINCi0gICAgICAgICBuYW1lPSJUZXN0aW5nMiINCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmRvbXJ1bnRpbWVzIj4NCi0gICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20uV3NET01SdW50aW1lUmVnaXN0cnlUZXN0Ii8+DQotICAgICAgPHByb2plY3RfZmFjZXQgDQotICAgICAgCSBpZD0ianN0LndlYmIiDQotICAgICAgCSB2ZXJzaW9uPSIxLjAuMC4wIi8+DQotICAgICAgPHByb2plY3RfZmFjZXQgDQotICAgICAgCSBpZD0idGVzdC5mYWNldHQiLz4NCi0gICA8L2V4dGVuc2lvbj4NCi08L2ZyYWdtZW50Pg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL0FsbFRlc3RzU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL0FsbFRlc3RzU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzA3ZTNkZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9BbGxUZXN0c1N1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3RvcnlUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbnNUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuYW5ub3RhdGlvbnMuQXJyYXlWYWx1ZUltcGxUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuYW5ub3RhdGlvbnMuQ29tcGxleEFubm90YXRpb25JbXBsVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmFubm90YXRpb25zLlBhcmFtVmFsdWVQYWlySW1wbFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5hbm5vdGF0aW9ucy5RdWFsaWZpZWROYW1lVmFsdWVJbXBsVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5Mb2NhdG9yRXh0cmFjdG9yVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5Xc0RPTVJ1bnRpbWVNYW5hZ2VyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5Xc0RPTVJ1bnRpbWVSZWdpc3RyeVRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3JUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2VUZXN0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5KZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5Qcm9qZWN0QWRkaW5nVGVzdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuV29ya3NwYWNlQ1VGaW5kZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLmFubm90YXRpb24uQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5VGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLmltcGwuQW5ub3RhdGlvbkFkYXB0ZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLmRlZmF1bHRzLk1ldGhvZFByb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5kZWZhdWx0cy5QYXJhbWV0ZXJQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuZGVmYXVsdHMuU2VpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLmRlZmF1bHRzLldzUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIuQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc2VyaWFsaXplci5NZXRob2RTZXJpYWxpemVyQWRhcHRlclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc2VyaWFsaXplci5QYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc2VyaWFsaXplci5TZWlTZXJpYWxpemVyQWRhcHRlclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc2VyaWFsaXplci5TZXJpYWxpemVyQWRhcHRlckZhY3RvcnlUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIuV3NTZXJpYWxpemVyQWRhcHRlclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3RhdGUuTWV0aG9kUHJvcGVydHlTdGF0ZUFkYXB0ZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN0YXRlLlBhcmFtZXRlclByb3BlcnR5U3RhdGVBZGFwdGVyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zdGF0ZS5Qcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnlUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN0YXRlLlNlaVByb3BlcnR5U3RhdGVBZGFwdGVyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zdGF0ZS5Xc1Byb3BlcnR5U3RhdGVBZGFwdGVyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zeW5jLkFic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN5bmMuSW1wbGljaXRTZWlNZXRob2RTeW5jaHJvbml6YXRpb25UZXN0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zeW5jLk1ldGhvZFBhcmFtc1N5bmNocm9uaXphdGlvblRlc3RzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN5bmMuTW9kZWxTeW5jaHJvbml6YXRpb25UZXN0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zeW5jLk9uRXZlbnRNb2RlbFN5bmNyb25pemVyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zeW5jLlNlaU1ldGhvZFN5bmNyb25pemF0aW9uVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zeW5jLlNlaVN5bmNyb25pemF0aW9uVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zeW5jLldzU3luY2hyb25pemF0aW9uVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS51dGlsLkRvbTJSZXNvdXJjZU1hcHBlclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udXRpbC5Eb21VdGlsVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnRUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnZhbGlkYXRpb24uQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS52YWxpZGF0aW9uLkRvbVZhbGlkYXRpb25Db25zdHJhaW50RGVzY3JpcHRvclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udmFsaWRhdGlvbi5Eb21WYWxpZGF0b3JGYWN0b3J5VGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS52YWxpZGF0aW9uLkVuZHBvaW50SXNTZXNzaW9uQmVhbkNvbnN0cmFpbnRUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnZhbGlkYXRpb24uSmF4V3NEb21WYWxpZGF0b3JUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnZhbGlkYXRpb24uU2VpVmFsaWRhdGlvblRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udmFsaWRhdGlvbi5XbVZhbGlkYXRpb25UZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnZhbGlkYXRpb24uV3BWYWxpZGF0aW9uVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS52YWxpZGF0aW9uLldzVmFsaWRhdGlvblRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy52YWxpZGF0aW9uLk1ldGhvZFZhbGlkYXRvclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy52YWxpZGF0aW9uLlJ1bnRpbWVUeXBlVmFsaWRhdG9yVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLnZhbGlkYXRpb24uU2VpVmFsaWRhdG9yVGVzdDsNCi0NCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHNTdWl0ZQ0KLXsNCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0Jew0KLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOw0KLQ0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJ1bnRpbWVUeXBlVmFsaWRhdG9yVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWV0aG9kVmFsaWRhdG9yVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQW5ub3RhdGlvbkZhY3RvcnlUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBbm5vdGF0aW9uc1Rlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBhcmFtVmFsdWVQYWlySW1wbFRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbXBsZXhBbm5vdGF0aW9uSW1wbFRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFF1YWxpZmllZE5hbWVWYWx1ZUltcGxUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBcnJheVZhbHVlSW1wbFRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNlaVZhbGlkYXRvclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFdzRE9NUnVudGltZVJlZ2lzdHJ5VGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoV3NET01SdW50aW1lTWFuYWdlclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERvbVZhbGlkYXRvckZhY3RvcnlUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShEb20yUmVzb3VyY2VNYXBwZXJUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShEb21VdGlsVGVzdC5jbGFzcyk7DQotCQkNCi0JCS8vIERPTSB0ZXN0cw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb25UZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXhXc1dvcmtzcGFjZVJlc291cmNlVGVzdHMuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByb2plY3RBZGRpbmdUZXN0cy5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoV29ya3NwYWNlQ1VGaW5kZXJUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMb2NhdG9yRXh0cmFjdG9yVGVzdC5jbGFzcyk7DQotCQkvLyBET00gc3luYyB0ZXN0cw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXJUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPbkV2ZW50TW9kZWxTeW5jcm9uaXplclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEltcGxpY2l0U2VpTWV0aG9kU3luY2hyb25pemF0aW9uVGVzdHMuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1ldGhvZFBhcmFtc1N5bmNocm9uaXphdGlvblRlc3RzLmNsYXNzKTsJCQ0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1vZGVsU3luY2hyb25pemF0aW9uVGVzdHMuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNlaU1ldGhvZFN5bmNyb25pemF0aW9uVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2VpU3luY3Jvbml6YXRpb25UZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShXc1N5bmNocm9uaXphdGlvblRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yVGVzdC5jbGFzcyk7DQotCQkvLyBzdGF0ZSBhZGFwdGVycyB0ZXN0cw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1ldGhvZFByb3BlcnR5U3RhdGVBZGFwdGVyVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5VGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2VpUHJvcGVydHlTdGF0ZUFkYXB0ZXJUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShXc1Byb3BlcnR5U3RhdGVBZGFwdGVyVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGFyYW1ldGVyUHJvcGVydHlTdGF0ZUFkYXB0ZXJUZXN0LmNsYXNzKTsNCi0JCS8vIHNlcmlhbGl6ZSBhZGFwdGVyIHRlc3RzDQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2VpU2VyaWFsaXplckFkYXB0ZXJUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTZXJpYWxpemVyQWRhcHRlckZhY3RvcnlUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShXc1NlcmlhbGl6ZXJBZGFwdGVyVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXJUZXN0LmNsYXNzKTsNCi0JCS8vIGRlZmF1bHQgdmFsdWVzIGFkYXB0ZXIgdGVzdHMNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNZXRob2RQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFdzUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTZWlQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBhcmFtZXRlclByb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdC5jbGFzcyk7DQotCQkvLyBvdGhlciBhZGFwdGVycyB0ZXN0cw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFubm90YXRpb25BZGFwdGVyVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5VGVzdC5jbGFzcyk7DQotCQkvLyB2YWxpZGF0aW9uIHRlc3RzDQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludFRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERvbVZhbGlkYXRpb25Db25zdHJhaW50RGVzY3JpcHRvclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpheFdzRG9tVmFsaWRhdG9yVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2VpVmFsaWRhdGlvblRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFdzVmFsaWRhdGlvblRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFdtVmFsaWRhdGlvblRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFdwVmFsaWRhdGlvblRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVuZHBvaW50SXNTZXNzaW9uQmVhbkNvbnN0cmFpbnRUZXN0LmNsYXNzKTsNCi0JCQ0KLQkJLy9zdWl0ZS5hZGRUZXN0U3VpdGUoQ0FGV3NkbFRlc3RzLmNsYXNzKTsNCi0JCQ0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZFRlc3QuY2xhc3MpOw0KLQ0KLQkJcmV0dXJuIHN1aXRlOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2Fubm90YXRpb25zL0Fubm90YXRpb25GYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM5YWZlN2MuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLQ0KLS8qKg0KLSAqIEFubm90YXRpb25GYWN0b3J5IGNsYXNzIHRlc3QgY2FzZXMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uRmFjdG9yeVRlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gInNyYyI7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAib3JnLmVjbGlwc2UuZGVtbyI7DQotDQotCXByaXZhdGUgSVR5cGUgZW5kcG9pbnQ7DQotDQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTdHJpbmdWYWx1ZSgpDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotCQlJVmFsdWUgc3RyVmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUiKTsNCi0JCWFzc2VydE5vdE51bGwoc3RyVmFsdWUpOw0KLQkJYXNzZXJ0VHJ1ZShzdHJWYWx1ZS50b1N0cmluZygpLmVxdWFscygidmFsdWUiKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVBhcmFtVmFsdWVQYWlyKCkNCi0Jew0KLQkJSVZhbHVlIHN0clZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlIik7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKG51bGwsIHN0clZhbHVlKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiIiwgbnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJCWZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgDQotCQl7DQotCQl9DQotDQotCQlJUGFyYW1WYWx1ZVBhaXIgdmFsdWVQYWlyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBzdHJWYWx1ZSk7DQotCQlhc3NlcnROb3ROdWxsKHZhbHVlUGFpcik7DQotCQlhc3NlcnRUcnVlKHZhbHVlUGFpci5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgSVZhbHVlKTsNCi0JCWFzc2VydFRydWUodmFsdWVQYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJwYXJhbSIpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQ29tcGxleEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCUlWYWx1ZSBzdHJWYWx1ZTEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUiKTsNCi0JCUlQYXJhbVZhbHVlUGFpciB2YWx1ZVBhaXIxID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBzdHJWYWx1ZTEpOw0KLQ0KLQkJSVZhbHVlIHN0clZhbHVlMiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJ2YWx1ZTEiKTsNCi0JCUlQYXJhbVZhbHVlUGFpciB2YWx1ZVBhaXIyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0xIiwgc3RyVmFsdWUyKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVzID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcGFyYW1WYWx1ZXMuYWRkKHZhbHVlUGFpcjEpOw0KLQkJcGFyYW1WYWx1ZXMuYWRkKHZhbHVlUGFpcjIpOw0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbihudWxsLCBwYXJhbVZhbHVlcyxlbmRwb2ludCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIiIsIG51bGwsIGVuZHBvaW50KTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQkJcHJlcGFyZVByb2plY3QoKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBjYSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm5hbWUiLCBwYXJhbVZhbHVlcyxlbmRwb2ludCk7DQotCQlhc3NlcnROb3ROdWxsKGNhKTsNCi0JCWFzc2VydEVxdWFscyhjYS5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCksIDIpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVWYWx1ZVBhaXIoKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCIiLCBudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZShudWxsLCBudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBcnJheVZhbHVlKCkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQXJyYXlWYWx1ZShudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJSVZhbHVlIHN0clZhbHVlMSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJ2YWx1ZTEiKTsNCi0JCUlWYWx1ZSBzdHJWYWx1ZTIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUyIik7DQotCQlTZXQ8SVZhbHVlPiB2YWx1ZXMgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotCQl2YWx1ZXMuYWRkKHN0clZhbHVlMSk7DQotCQl2YWx1ZXMuYWRkKHN0clZhbHVlMik7DQotCQkNCi0JCQ0KLQkJSVZhbHVlIGFyclZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQXJyYXlWYWx1ZSh2YWx1ZXMpOw0KLQkJYXNzZXJ0Tm90TnVsbChhcnJWYWx1ZSk7DQotCQlhc3NlcnRUcnVlKGFyclZhbHVlLnRvU3RyaW5nKCkuZXF1YWxzKCJbdmFsdWUxLCB2YWx1ZTJdIikpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUobnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCUlWYWx1ZSBxTmFtZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgib3JnLmVjbGlwc2UuZGVtby5UZXN0Iik7DQotCQlhc3NlcnROb3ROdWxsKHFOYW1lKTsNCi0JCWFzc2VydFRydWUocU5hbWUudG9TdHJpbmcoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLmRlbW8uVGVzdCIpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQm9vbGVhblZhbHVlKCkNCi0Jew0KLQkJSVZhbHVlIGJvb2xWYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUJvb2xlYW5WYWx1ZSh0cnVlKTsNCi0JCWFzc2VydE5vdE51bGwoYm9vbFZhbHVlKTsNCi0JCWFzc2VydEVxdWFscyhib29sVmFsdWUudG9TdHJpbmcoKSwgInRydWUiKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbnNGcm9tQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkDQotCXsNCi0JCXByZXBhcmVQcm9qZWN0KCk7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAyKTsNCi0JfQ0KLQ0KLS8vCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uc0Zyb21GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0vLwl7DQotLy8JCXByZXBhcmVQcm9qZWN0KCk7DQotLy8NCi0vLwkJSUZpZWxkIGZpZWxkID0gZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpOw0KLS8vCQlhc3NlcnROb3ROdWxsKGZpZWxkKTsNCi0vLw0KLS8vCQlJQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdHRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKSBnZXRBbm5vdGF0aW9uc0Zyb21GaWVsZChmaWVsZCk7DQotLy8JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOw0KLS8vCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLmxlbmd0aCA9PSAxKTsNCi0vLwl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uc0Zyb21NZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkDQotCXsNCi0JCXByZXBhcmVQcm9qZWN0KCk7DQotDQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgiYW5ub3RhdGVkTWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOzsNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb25zSVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkDQotCXsNCi0JCXByZXBhcmVQcm9qZWN0KCk7DQotDQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChlbmRwb2ludCk7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS4gaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDApOw0KLQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoImFubm90YXRlZE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7DQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IGFubm90YXRpb25zTWV0aG9kID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb25zSVR5cGVTZXRPZlN0cmluZygpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0Jew0KLQkJcHJlcGFyZVByb2plY3QoKTsNCi0NCi0JCVNldDxTdHJpbmc+IHRvUmVtb3ZlID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOw0KLQkJdG9SZW1vdmUuYWRkKCJXZWJTZXJ2aWNlIik7DQotCQl0b1JlbW92ZS5hZGQoIldlYk1ldGhvZCIpOw0KLQ0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnMoZW5kcG9pbnQsIHRvUmVtb3ZlKTsNCi0NCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0NCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gYW5ub3RhdGlvbnNNZXRob2QgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zTWV0aG9kLnNpemUoKSA9PSAwKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbnNJRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkDQotCXsNCi0JCXByZXBhcmVQcm9qZWN0KCk7DQotDQotCQlJRmllbGQgZmllbGQgPSBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIik7DQotCQlhc3NlcnROb3ROdWxsKGZpZWxkKTsNCi0NCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGZpZWxkKTsNCi0NCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAyKTsNCi0NCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gYW5ub3RhdGlvbnNNZXRob2QgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zTWV0aG9kLnNpemUoKSA9PSAxKTsNCi0NCi0vLwkJYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5nZXRBbm5vdGF0aW9uc0Zyb21GaWVsZChmaWVsZCk7DQotLy8JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOw0KLS8vCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLmxlbmd0aCA9PSAwKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbnNJTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQlwcmVwYXJlUHJvamVjdCgpOw0KLQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoImFubm90YXRlZE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7DQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCi0JCUlGaWVsZCBmaWVsZCA9IGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKTsNCi0NCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KG1ldGhvZCk7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMik7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBhbm5vdGF0aW9uc01ldGhvZCA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnNNZXRob2Quc2l6ZSgpPT0gMCk7DQotDQotLy8JCWFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuZ2V0QW5ub3RhdGlvbnNGcm9tRmllbGQoZmllbGQpOw0KLS8vCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0vLwkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5sZW5ndGggPT0gMCk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHByZXBhcmVQcm9qZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludC5zcmMiLCAiRW5kcG9pbnQiKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uc1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2Fubm90YXRpb25zL0Fubm90YXRpb25zVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOTNlMzMzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2Fubm90YXRpb25zL0Fubm90YXRpb25zVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uV3JpdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFubm90YXRpb25JbnNwZWN0b3JJbXBsOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc1Rlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gInNyYyI7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAib3JnLmVjbGlwc2UuZGVtbyI7DQotDQotCXByaXZhdGUgSVR5cGUgZW5kcG9pbnQ7DQotDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsNCi0JCWVuZHBvaW50ID0gY3JlYXRlQ2xhc3MoIkVuZHBvaW50LnNyYyIsICJFbmRwb2ludCIpOw0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZW5kcG9pbnQpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb21wbGV4QW5ub3RhdGlvblFOVmFsdWUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUlWYWx1ZSBxdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZSIpOw0KLQ0KLQkJSVBhcmFtVmFsdWVQYWlyIHB2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBxdik7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXBhcmFtVmFsdWVzLmFkZChwdik7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImphdmF4Lmp3cy5XZWJTZXJ2aWNlIiwgcGFyYW1WYWx1ZXMsIGVuZHBvaW50KTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm5vdGF0aW9uLCBlbmRwb2ludCk7DQotDQotCQlhc3NlcnRUcnVlKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCkuc2l6ZSgpID4gMCk7DQotCX0NCi0NCi0vLwlwdWJsaWMgdm9pZCB0ZXN0QWRkU2luZ2xlRWxlbWVudEFubm90YXRpb25BcnJheVZhbHVlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0vLwl7DQotLy8JCUlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTaW5nbGVFbGVtZW50QW5ub3RhdGlvbigiamF2YXguandzLldlYlNlcnZpY2UiLCBuZXcgU3RyaW5nW10geyAidmFsMSIsICJ2YWwyIiB9KTsNCi0vLwkJYW5ub3RhdGlvbi5hZGRUb0NsYXNzKGVuZHBvaW50KTsNCi0vLw0KLS8vCQlhc3NlcnRUcnVlKEFubm90YXRpb25GYWN0b3J5LmdldEFubm90YXRpb25zRnJvbUNsYXNzKGVuZHBvaW50KS5sZW5ndGggPiAwKTsNCi0vLwl9DQotLy8NCi0vLwlwdWJsaWMgdm9pZCB0ZXN0QWRkU2ltcGxlQW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0vLwl7DQotLy8JCUlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTaW1wbGVBbm5vdGF0aW9uKCJqYXZheC5qd3MuV2ViU2VydmljZSIpOw0KLS8vCQlhbm5vdGF0aW9uLmFkZFRvQ2xhc3MoZW5kcG9pbnQpOw0KLS8vDQotLy8JCWFzc2VydFRydWUoQW5ub3RhdGlvbkZhY3RvcnkuZ2V0QW5ub3RhdGlvbnNGcm9tQ2xhc3MoZW5kcG9pbnQpLmxlbmd0aCA+IDApOw0KLS8vCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgY29tcGxleCBhbm5vdGF0aW9uIGFuZCBhZGRzIGl0IHRvIGNsYXNzLiBUaGUgYW5ub3RhdGlvbiBoYXMgdGhlIGZvcm06DQotCSAqIA0KLQkgKiA8cHJlPg0KLQkgKiAJIEBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSZxdW90O3NlcnZpY2VOYW1lJnF1b3Q7LA0KLQkgKiAJIG5hbWU9JnF1b3Q7cG9ydFR5cGVOYW1lJnF1b3Q7LA0KLQkgKiAJIHRhcmdldE5hbWVzcGFjZT0mcXVvdDtodHRwOi8vZGVtby5zYXAuY29tLyZxdW90OywNCi0JICogCSB3c2RsTG9jYXRpb249JnF1b3Q7aHR0cDovL3dzZGwvdXJsLyZxdW90OywNCi0JICogCSBwb3J0TmFtZT0mcXVvdDtwb3J0TmFtZSZxdW90OywNCi0JICogCSBlbmRwb2ludEludGVyZmFjZT0mcXVvdDtvcmcuZWNsaXBzZS5kZW1vLklTZWkmcXVvdDspDQotCSAqIDwvcHJlPg0KLQkgKiANCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29tcGxleENsYXNzQW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotDQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgInNlcnZpY2VOYW1lIiwgInNlcnZpY2VOYW1lIik7DQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgIm5hbWUiLCAicG9ydFR5cGVOYW1lIik7DQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgInRhcmdldE5hbWVzcGFjZSIsICJodHRwOi8vZGVtby5zYXAuY29tLyIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJ3c2RsTG9jYXRpb24iLCAiaHR0cDovL3dzZGwvdXJsLyIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJwb3J0TmFtZSIsICJwb3J0TmFtZSIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJlbmRwb2ludEludGVyZmFjZSIsICJvcmcuZWNsaXBzZS5kZW1vLklTZWkiKTsNCi0NCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiamF2YXguandzLldlYlNlcnZpY2UiLCBwYXJhbVZhbHVlcywgZW5kcG9pbnQpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubm90YXRpb24sIGVuZHBvaW50KTsNCi0NCi0JCUFubm90YXRpb25JbnNwZWN0b3JJbXBsIGFubm90YXRpb25JbnNwZWN0b3IgPSBuZXcgQW5ub3RhdGlvbkluc3BlY3RvckltcGwoZW5kcG9pbnQpOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IHR5cGVBbm5vdGF0aW9ucyA9IGFubm90YXRpb25JbnNwZWN0b3IuaW5zcGVjdFR5cGUoKTsNCi0JCSAJCQ0KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsNCi0JCWZvciAoSUFubm90YXRpb248SVR5cGU+IHR5cGVBbm5vdGF0aW9uIDogdHlwZUFubm90YXRpb25zKQ0KLQkJew0KLQkJCWlmKHR5cGVBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJXZWJTZXJ2aWNlIikgfHwgdHlwZUFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImphdmF4Lmp3cy5XZWJTZXJ2aWNlIikpDQotCQkJew0KLQkJCQlpZih0eXBlQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgIT0gNikNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIXR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInNlcnZpY2VOYW1lIikuZXF1YWxzKCJzZXJ2aWNlTmFtZSIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighdHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmFtZSIpLmVxdWFscygicG9ydFR5cGVOYW1lIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCF0eXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJ0YXJnZXROYW1lc3BhY2UiKS5lcXVhbHMoImh0dHA6Ly9kZW1vLnNhcC5jb20vIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCF0eXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJ3c2RsTG9jYXRpb24iKS5lcXVhbHMoImh0dHA6Ly93c2RsL3VybC8iKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIXR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInBvcnROYW1lIikuZXF1YWxzKCJwb3J0TmFtZSIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighdHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiZW5kcG9pbnRJbnRlcmZhY2UiKS5lcXVhbHMoIm9yZy5lY2xpcHNlLmRlbW8uSVNlaSIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQ0KLQkJCQlyZXN1bHQgPSB0cnVlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWFzc2VydFRydWUoIkNsYXNzIGlzIG5vdCBhbm5vdGF0ZWQgY29ycmVjdGx5IiwgcmVzdWx0KTsNCi0JCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgY29tcGxleCBhbm5vdGF0aW9uIGFuZCBhZGRzIGl0IHRvIG1ldGhvZCBkZWNsYXJhdGlvbi4gQW5ub3RhdGlvbiBoYXMgdGhlIGZvcm06DQotCSAqIA0KLQkgKiA8cHJlPg0KLQkgKiAgXEBXZWJNZXRob2QoZXhjbHVkZT1mYWxzZSxvcGVyYXRpb25OYW1lPSZxdW90O2Fubm90YXRlZE1ldGhvZCZxdW90OyxhY3Rpb249JnF1b3Q7Z28mcXVvdDspCQ0KLQkgKiA8L3ByZT4NCi0JICogDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbXBsZXhNZXRob2RBbm5vdGF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0NCi0JCUlWYWx1ZSBlbVZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQm9vbGVhblZhbHVlKGZhbHNlKTsNCi0JCXBhcmFtVmFsdWVzLmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJleGNsdWRlIiwgZW1WYWx1ZSkpOw0KLQ0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJvcGVyYXRpb25OYW1lIiwgImFubm90YXRlZE1ldGhvZCIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJhY3Rpb24iLCAiZ28iKTsNCi0NCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJCQkNCi0JCUlBbm5vdGF0aW9uPElNZXRob2Q+IGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJqYXZheC5qd3MuV2ViTWV0aG9kIiwgcGFyYW1WYWx1ZXMsIG1ldGhvZCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5ub3RhdGlvbiwgbWV0aG9kKTsNCi0NCi0JCUFubm90YXRpb25JbnNwZWN0b3JJbXBsIGFubm90YXRpb25JbnNwZWN0b3IgPSBuZXcgQW5ub3RhdGlvbkluc3BlY3RvckltcGwoZW5kcG9pbnQpOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gbWV0aG9kQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uSW5zcGVjdG9yLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCSAJCQ0KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsNCi0JCWZvciAoSUFubm90YXRpb248SU1ldGhvZD4gbWV0aG9kQW5ub3RhdGlvbiA6IG1ldGhvZEFubm90YXRpb25zKQ0KLQkJew0KLQkJCWlmKG1ldGhvZEFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImphdmF4Lmp3cy5XZWJNZXRob2QiKSB8fCBtZXRob2RBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJXZWJNZXRob2QiKSkNCi0JCQl7DQotCQkJCWlmKG1ldGhvZEFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpICE9IDMpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCFtZXRob2RBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImV4Y2x1ZGUiKS5lcXVhbHMoImZhbHNlIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCFtZXRob2RBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm9wZXJhdGlvbk5hbWUiKS5lcXVhbHMoImFubm90YXRlZE1ldGhvZCIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighbWV0aG9kQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhY3Rpb24iKS5lcXVhbHMoImdvIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkgCQkJCQ0KLQkJCQlyZXN1bHQgPSB0cnVlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWFzc2VydFRydWUoIk1ldGhvZCBpcyBub3QgYW5ub3RhdGVkIGNvcnJlY3RseSIsIHJlc3VsdCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgY29tcGxleCBhbm5vdGF0aW9uIGFuZCBhZGRzIGl0IHRvIGEgbWV0aG9kIHBhcmFtZXRlci4gVGhlIGFubm90YXRpb24gaGFzIHRoZSBmb3JtOg0KLQkgKiANCi0JICogPHByZT4NCi0JICogIFxAV2ViUGFyYW0ob3BlcmF0aW9uTmFtZT0mcXVvdDthbm5vdGF0ZWRQYXJhbSZxdW90OywgdGFyZ2V0TmFtZXNwYWNlPSZxdW90O2h0dHA6Ly9kZW1vLnNhcC5jb20vcGFyYW1zLyZxdW90OywgcGFydE5hbWU9JnF1b3Q7cGFydE5hbWUmcXVvdDspDQotCSAqIDwvcHJlPg0KLQkgKiANCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29tcGxleFBhcmFtQW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoImFubm90YXRlZE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7DQotCQlJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gbWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIoImFubm90YXRlZFBhcmFtIik7DQotDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0NCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAiYW5ub3RhdGVkUGFyYW0iLCAicGFyYW0iKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAidGFyZ2V0TmFtZXNwYWNlIiwgImh0dHA6Ly9kZW1vLnNhcC5jb20vcGFyYW1zLyIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJwYXJ0TmFtZSIsICJwYXJ0TmFtZSIpOw0KLQ0KLQkJSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJqYXZheC5qd3MuV2ViUGFyYW0iLCBwYXJhbVZhbHVlcywgdHlwZVBhcmFtZXRlcik7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5ub3RhdGlvbiwgdHlwZVBhcmFtZXRlcik7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGFkZFN0cmluZ1Byb3BlcnR5KFNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVzLCBTdHJpbmcgcHJvcGVydHksIFN0cmluZyB2YWx1ZSkNCi0Jew0KLQkJSVZhbHVlIHBWYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKHZhbHVlKTsNCi0JCUlQYXJhbVZhbHVlUGFpciBwYWlyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZShwcm9wZXJ0eSwgcFZhbHVlKTsNCi0JCXBhcmFtVmFsdWVzLmFkZChwYWlyKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9BcnJheVZhbHVlSW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2Fubm90YXRpb25zL0FycmF5VmFsdWVJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZTJlMjAyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2Fubm90YXRpb25zL0FycmF5VmFsdWVJbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFycmF5VmFsdWVJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5TdHJpbmdWYWx1ZUltcGw7DQotDQotcHVibGljIGNsYXNzIEFycmF5VmFsdWVJbXBsVGVzdCBleHRlbmRzIFRlc3RDYXNlDQotew0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKQ0KLQl7DQotCQlTZXQ8SVZhbHVlPiB2YWx1ZXMxID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJdmFsdWVzMS5jbGVhcigpOw0KLQkJdmFsdWVzMS5hZGQobmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsMSIpKTsNCi0JCUFycmF5VmFsdWVJbXBsIGF2MSA9IG5ldyBBcnJheVZhbHVlSW1wbCh2YWx1ZXMxKTsNCi0JCQ0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzMiA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCXZhbHVlczIuY2xlYXIoKTsNCi0JCXZhbHVlczIuYWRkKG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbDIiKSk7DQotCQlBcnJheVZhbHVlSW1wbCBhdjIgPSBuZXcgQXJyYXlWYWx1ZUltcGwodmFsdWVzMik7DQotDQotCQlhc3NlcnRUcnVlKGF2MS5oYXNoQ29kZSgpICE9IGF2Mi5oYXNoQ29kZSgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlWYWx1ZUltcGwoKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQluZXcgQXJyYXlWYWx1ZUltcGwobnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3QoKQ0KLQl7DQotCQlTZXQ8SVZhbHVlPiB2YWx1ZXMxID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJdmFsdWVzMS5jbGVhcigpOw0KLQkJdmFsdWVzMS5hZGQobmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsMSIpKTsNCi0JCUFycmF5VmFsdWVJbXBsIGF2MSA9IG5ldyBBcnJheVZhbHVlSW1wbCh2YWx1ZXMxKTsNCi0NCi0JCVNldDxJVmFsdWU+IHZhbHVlczIgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotCQl2YWx1ZXMyLmNsZWFyKCk7DQotCQl2YWx1ZXMyLmFkZChuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWwyIikpOw0KLQkJQXJyYXlWYWx1ZUltcGwgYXYyID0gbmV3IEFycmF5VmFsdWVJbXBsKHZhbHVlczIpOw0KLQ0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzMyA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCXZhbHVlczMuY2xlYXIoKTsNCi0JCXZhbHVlczMuYWRkKG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbDEiKSk7DQotCQlBcnJheVZhbHVlSW1wbCBhdjMgPSBuZXcgQXJyYXlWYWx1ZUltcGwodmFsdWVzMyk7DQotDQotCQlhc3NlcnRGYWxzZShhdjEuZXF1YWxzKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKGF2MS5lcXVhbHMoMTIzKSk7DQotCQlhc3NlcnRGYWxzZShhdjEuZXF1YWxzKGF2MikpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShhdjEuZXF1YWxzKGF2MykpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2Fubm90YXRpb25zL0NvbXBsZXhBbm5vdGF0aW9uSW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2Fubm90YXRpb25zL0NvbXBsZXhBbm5vdGF0aW9uSW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzg2NjVmZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9Db21wbGV4QW5ub3RhdGlvbkltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2s7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi0NCi1wdWJsaWMgY2xhc3MgQ29tcGxleEFubm90YXRpb25JbXBsVGVzdCBleHRlbmRzIE1vY2tPYmplY3RUZXN0Q2FzZQ0KLXsJDQotCXByaXZhdGUgTW9jazxJVHlwZT4gdHlwZUVsZW1lbnQgPSBtb2NrKElUeXBlLmNsYXNzKTsNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpDQotCXsNCi0JCUlWYWx1ZSB2YWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJ2YWx1ZSIpOw0KLQkJSVBhcmFtVmFsdWVQYWlyIHB2cCA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgdmFsdWUpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwYXJhbVZhbHVlcy5hZGQocHZwKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uMSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImFubm90YXRpb25OYW1lIiwgcGFyYW1WYWx1ZXMsIHR5cGVFbGVtZW50LnByb3h5KCkpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24yID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiYW5ub3RhdGlvbk5hbWUyIiwgcGFyYW1WYWx1ZXMsdHlwZUVsZW1lbnQucHJveHkoKSk7DQotDQotCQlhc3NlcnRUcnVlKGFubm90YXRpb24xLmhhc2hDb2RlKCkgIT0gYW5ub3RhdGlvbjIuaGFzaENvZGUoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpDQotCXsNCi0JCUlWYWx1ZSB2YWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJ2YWx1ZSIpOw0KLQkJSVBhcmFtVmFsdWVQYWlyIHB2cCA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgdmFsdWUpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwYXJhbVZhbHVlcy5hZGQocHZwKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uMSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImFubm90YXRpb25OYW1lIiwgcGFyYW1WYWx1ZXMsIHR5cGVFbGVtZW50LnByb3h5KCkpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24yID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiYW5ub3RhdGlvbk5hbWUyIiwgcGFyYW1WYWx1ZXMsIHR5cGVFbGVtZW50LnByb3h5KCkpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiYW5ub3RhdGlvbk5hbWUiLCBwYXJhbVZhbHVlcywgdHlwZUVsZW1lbnQucHJveHkoKSk7DQotDQotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uMS5lcXVhbHMoYW5ub3RhdGlvbjIpKTsNCi0JCWFzc2VydEZhbHNlKGFubm90YXRpb24xLmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uMS5lcXVhbHMoMTIzKSk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb24xLmVxdWFscyhhbm5vdGF0aW9uMykpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2Fubm90YXRpb25zL0VuZHBvaW50LnNyYyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2Fubm90YXRpb25zL0VuZHBvaW50LnNyYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODljN2E0MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9FbmRwb2ludC5zcmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9IldTSW1wbEJlYW5TZXJ2aWNlIiwgbmFtZT0iV1NJbXBsQmVhbiIsIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RlbW8vc2FwL2NvbS8iLCBwb3J0TmFtZT0iV1NJbXBsQmVhblBvcnQiKQ0KLUBTdGF0ZWxlc3MNCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnQNCi17DQotCUBNeUFubm90YXRpb24obmFtZT0iZmllbGQxIikNCi0JcHVibGljIFN0cmluZyBmaWVsZDE7DQotCQ0KLQlAV2ViTWV0aG9kKGV4Y2x1ZGU9ZmFsc2Usb3BlcmF0aW9uTmFtZT0idGVzdCIpDQotCXB1YmxpYyB2b2lkIGFubm90YXRlZE1ldGhvZCggQFdlYlBhcmFtKG5hbWU9ImFubm90YXRlZFBhcmFtIikgU3RyaW5nIGFubm90YXRlZFBhcmFtKSANCi0Jew0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2Fubm90YXRpb25zL1BhcmFtVmFsdWVQYWlySW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2Fubm90YXRpb25zL1BhcmFtVmFsdWVQYWlySW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTU2N2VmMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9QYXJhbVZhbHVlUGFpckltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5QYXJhbVZhbHVlUGFpckltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLlN0cmluZ1ZhbHVlSW1wbDsNCi0NCi1wdWJsaWMgY2xhc3MgUGFyYW1WYWx1ZVBhaXJJbXBsVGVzdCBleHRlbmRzIFRlc3RDYXNlDQotew0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKQ0KLQl7DQotCQlJVmFsdWUgdmFsdWUgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWx1ZSIpOw0KLQkJUGFyYW1WYWx1ZVBhaXJJbXBsIHB2cCA9IG5ldyBQYXJhbVZhbHVlUGFpckltcGwoInBhcmFtIiwgdmFsdWUpOw0KLQ0KLQkJSVZhbHVlIHZhbHVlMSA9IG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbHVlMSIpOw0KLQkJUGFyYW1WYWx1ZVBhaXJJbXBsIHB2cDEgPSBuZXcgUGFyYW1WYWx1ZVBhaXJJbXBsKCJwYXJhbTEiLCB2YWx1ZTEpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UocHZwLmhhc2hDb2RlKCkgPT0gcHZwMS5oYXNoQ29kZSgpKTsNCi0JCWFzc2VydEZhbHNlKHB2cC5lcXVhbHMobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2UocHZwLmVxdWFscygxMjMpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0KCkNCi0Jew0KLQkJSVZhbHVlIHZhbHVlID0gbmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsdWUiKTsNCi0JCVBhcmFtVmFsdWVQYWlySW1wbCBwdnAgPSBuZXcgUGFyYW1WYWx1ZVBhaXJJbXBsKCJwYXJhbSIsIHZhbHVlKTsNCi0NCi0JCUlWYWx1ZSB2YWx1ZTEgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWx1ZSIpOw0KLQkJUGFyYW1WYWx1ZVBhaXJJbXBsIHB2cDEgPSBuZXcgUGFyYW1WYWx1ZVBhaXJJbXBsKCJwYXJhbSIsIHZhbHVlMSk7DQotDQotCQlJVmFsdWUgdmFsdWUyID0gbmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsdWUyIik7DQotCQlQYXJhbVZhbHVlUGFpckltcGwgcHZwMiA9IG5ldyBQYXJhbVZhbHVlUGFpckltcGwoInBhcmFtMiIsIHZhbHVlMik7DQotDQotCQlhc3NlcnRUcnVlKHB2cC5lcXVhbHMocHZwMSkpOw0KLQkJYXNzZXJ0RmFsc2UocHZwLmVxdWFscyhwdnAyKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvYW5ub3RhdGlvbnMvUXVhbGlmaWVkTmFtZVZhbHVlSW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2Fubm90YXRpb25zL1F1YWxpZmllZE5hbWVWYWx1ZUltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc3NjczNDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvYW5ub3RhdGlvbnMvUXVhbGlmaWVkTmFtZVZhbHVlSW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi0NCi1wdWJsaWMgY2xhc3MgUXVhbGlmaWVkTmFtZVZhbHVlSW1wbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0NCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkNCi0Jew0KLQkJSVZhbHVlIHF2MSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZTEiKTsNCi0JCUlWYWx1ZSBxdjIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUiKTsNCi0NCi0JCWFzc2VydEZhbHNlKHF2MS5oYXNoQ29kZSgpID09IHF2Mi5oYXNoQ29kZSgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0KCkNCi0Jew0KLQkJSVZhbHVlIHF2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lIik7DQotCQlJVmFsdWUgcXYxID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lMSIpOw0KLQkJSVZhbHVlIHF2MiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZSIpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UocXYuZXF1YWxzKHF2MSkpOw0KLQkJYXNzZXJ0VHJ1ZShxdi5lcXVhbHMocXYyKSk7DQotCQlhc3NlcnRGYWxzZShxdi5lcXVhbHMobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2UocXYuZXF1YWxzKDEyMykpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9Mb2NhdG9yRXh0cmFjdG9yVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL0xvY2F0b3JFeHRyYWN0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0MzYyZmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL0xvY2F0b3JFeHRyYWN0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb207DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5Mb2NhdG9yRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JTG9jYXRvcjsNCi0NCi0vKioNCi0gKiBUZXN0cyBmb3Ige0BsaW5rIExvY2F0b3JFeHRyYWN0b3J9DQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBMb2NhdG9yRXh0cmFjdG9yVGVzdCAgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0JcHJpdmF0ZSBUZXN0UHJvamVjdCB0ZXN0UHJvamVjdDsNCi0JcHJpdmF0ZSBJVHlwZSB3c1R5cGU7DQotCXByaXZhdGUgSVdlYlNlcnZpY2Ugd3M7DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJdGVzdFByb2plY3QgPSBuZXcgVGVzdFByb2plY3QoKTsNCi0JCQ0KLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrID0gdGVzdFByb2plY3QuY3JlYXRlUGFja2FnZSgidGVzdC5sb2NhdG9yLmV4dHJhY3RvciIpOw0KLQkJd3NUeXBlID0gdGVzdFByb2plY3QuY3JlYXRlVHlwZShwYWNrLCAiV3MuamF2YSIsICJwdWJsaWMgY2xhc3MgV3Mge1xuIiArDQotCQkJCSIJcHVibGljIHZvaWQgdGVzdCgpIHt9XG4gIiArDQotCQkJCSJ9Iik7CQkNCi0JCQ0KLQkJSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdCgpOw0KLQkJd3NQcm9qZWN0LmVTZXQoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRSwgdGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7DQotCQkNCi0JCXdzID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2UoKTsNCi0JCXdzLmVTZXQoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiwgd3NUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0NCi0JCXdzUHJvamVjdC5nZXRXZWJTZXJ2aWNlcygpLmFkZCh3cyk7CQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEZpbmRGb3JXcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uDQotCXsNCi0JCUlMb2NhdG9yIGxvY2F0b3IgPSBMb2NhdG9yRXh0cmFjdG9yLmdldEluc3RhbmNlKCkuZmluZCh3cyk7DQotCQkNCi0JCWFzc2VydEVxdWFscygzLCBsb2NhdG9yLmdldExpbmVOdW1iZXIoKSk7DQotCQlhc3NlcnRFcXVhbHMoNDYsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCWFzc2VydEVxdWFscygyLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vVGVzdFdzRE9NUnVudGltZUV4dGVuc2lvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL1Rlc3RXc0RPTVJ1bnRpbWVFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjc3NTFmZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vVGVzdFdzRE9NUnVudGltZUV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NET01SdW50aW1lRXh0ZW5zaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RvbUxvYWRMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5qbW9jay5Nb2NrOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0V3NET01SdW50aW1lRXh0ZW5zaW9uIGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlIGltcGxlbWVudHMgSVdzRE9NUnVudGltZUV4dGVuc2lvbiANCi17DQotCXB1YmxpYyBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7DQotCQ0KLQlwdWJsaWMgdm9pZCBjcmVhdGVET00oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSANCi0Jew0KLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsNCi0JfQ0KLQkNCi0JcHVibGljIElET00gZ2V0RE9NKCkNCi0Jew0KLQkJTW9jayBpdGVyID0gbmV3IE1vY2soSXRlcmF0b3IuY2xhc3MpOw0KLQkJaXRlci5leHBlY3RzKGF0TGVhc3RPbmNlKCkpLm1ldGhvZCgiaGFzTmV4dCIpLndpbGwocmV0dXJuVmFsdWUoZmFsc2UpKTsNCi0JCSgoSXRlcmF0b3I8Pz4paXRlci5wcm94eSgpKS5oYXNOZXh0KCk7DQotCQlNb2NrIGVMaXN0ID0gbmV3IE1vY2soRUxpc3QuY2xhc3MpOw0KLQkJZUxpc3QuZXhwZWN0cyhhdExlYXN0T25jZSgpKS5tZXRob2QoIml0ZXJhdG9yIikud2lsbChyZXR1cm5WYWx1ZShpdGVyLnByb3h5KCkpKTsNCi0JCSgoRUxpc3Q8Pz4pZUxpc3QucHJveHkoKSkuaXRlcmF0b3IoKTsNCi0JCU1vY2sgZG9tID0gbmV3IE1vY2soSURPTS5jbGFzcyk7DQotCQlkb20uZXhwZWN0cyhhdExlYXN0T25jZSgpKS5tZXRob2QoImdldFdlYlNlcnZpY2VQcm9qZWN0cyIpLndpbGwocmV0dXJuVmFsdWUoZUxpc3QucHJveHkoKSkpOw0KLQkJKChJRE9NKWRvbS5wcm94eSgpKS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKTsNCi0JCXJldHVybiAoSURPTSlkb20ucHJveHkoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBhZGRMb2FkTGlzdGVuZXIoSVdzRG9tTG9hZExpc3RlbmVyIGxpc3RlbmVyKSB7DQotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotCX0NCi0NCi0JcHVibGljIHZvaWQgcmVtb3ZlTG9hZExpc3RlbmVyKElXc0RvbUxvYWRMaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGlzTG9hZENhbmNlbGVkKCkgew0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL1dzRE9NUnVudGltZU1hbmFnZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxNGMwZDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL1dzRE9NUnVudGltZU1hbmFnZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NET01SdW50aW1lRXh0ZW5zaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NUnVudGltZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeS5JV3NET01SdW50aW1lSW5mbzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnJlZ2lzdHJ5LldzRE9NUnVudGltZVJlZ2lzdHJ5Ow0KLQ0KLXB1YmxpYyBjbGFzcyBXc0RPTVJ1bnRpbWVNYW5hZ2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlDQotew0KLQlwcml2YXRlIFdzRE9NUnVudGltZU1hbmFnZXIgdGFyZ2V0Ow0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgDQotCXsNCi0JCXRhcmdldCA9IChXc0RPTVJ1bnRpbWVNYW5hZ2VyKVdzRE9NUnVudGltZU1hbmFnZXIuaW5zdGFuY2UoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldERPTVJ1bnRpbWVGb3JSdW50aW1lSW5mbygpDQotCXsNCi0JCUNvbGxlY3Rpb248SVdzRE9NUnVudGltZUluZm8+IHJlZ2lzdGVyZWRSdW50aW1lcyA9IFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRSdW50aW1lc0luZm8oKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh0YXJnZXQuZ2V0RE9NUnVudGltZShyZWdpc3RlcmVkUnVudGltZXMuaXRlcmF0b3IoKS5uZXh0KCkpKTsNCi0JCQ0KLQkJSVdzRE9NUnVudGltZUV4dGVuc2lvbiBydW50aW1lID0gdGFyZ2V0LmdldERPTVJ1bnRpbWUocmVnaXN0ZXJlZFJ1bnRpbWVzLml0ZXJhdG9yKCkubmV4dCgpKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKHJ1bnRpbWUsIHRhcmdldC5nZXRET01SdW50aW1lKHJlZ2lzdGVyZWRSdW50aW1lcy5pdGVyYXRvcigpLm5leHQoKSkpOw0KLQkJDQotCQlyZWdpc3RlcmVkUnVudGltZXMgPSBXc0RPTVJ1bnRpbWVSZWdpc3RyeS5nZXRSZWdpc3RlcmVkUnVudGltZXNJbmZvKCk7DQotCQkNCi0JCWFzc2VydEVxdWFscyhydW50aW1lLCB0YXJnZXQuZ2V0RE9NUnVudGltZShyZWdpc3RlcmVkUnVudGltZXMuaXRlcmF0b3IoKS5uZXh0KCkpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RE9NUnVudGltZUZvclJ1bnRpbWVJZCgpDQotCXsNCi0JCWFzc2VydE5vdE51bGwodGFyZ2V0LmdldERPTVJ1bnRpbWUoInN1cHBvcnRlZHJ1bnRpbWV0ZXN0IikpOw0KLQkJYXNzZXJ0TnVsbCh0YXJnZXQuZ2V0RE9NUnVudGltZSgidGVzdC5pZCIpKTsNCi0JCWFzc2VydEVxdWFscyh0YXJnZXQuZ2V0RE9NUnVudGltZSgic3VwcG9ydGVkcnVudGltZXRlc3QiKSwgdGFyZ2V0LmdldERPTVJ1bnRpbWUoInN1cHBvcnRlZHJ1bnRpbWV0ZXN0IikpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRE9NUnVudGltZXMoKQ0KLQl7DQotCQl0YXJnZXQuY3JlYXRlRE9NUnVudGltZXMobnVsbCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwodGFyZ2V0LmdldERPTVJ1bnRpbWUoInN1cHBvcnRlZHJ1bnRpbWV0ZXN0IikpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0YXJnZXQuZ2V0RE9NUnVudGltZSgic3VwcG9ydGVkcnVudGltZXRlc3QxIikpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RWFybHlTdGFydHVwKCkNCi0Jew0KLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZkVsZW1lbnRzID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludCgib3JnLmVjbGlwc2UudWkuc3RhcnR1cCIpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPGNvbmZFbGVtZW50cy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Xc0RvbVN0YXJ0dXBQYXJ0aWNpcGFudCIuZXF1YWxzKGNvbmZFbGVtZW50c1tpaV0uZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSkNCi0JCQl7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWZhaWwoIlRoZSBlYXJseSBzdGFydHVwIGZvciBET00gTW9kZWwgaXMgbm90IGRlZmluZWQgISIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVsb2FkRE9NUnVudGltZXMoKQ0KLQl7DQotCQl0YXJnZXQucmVsb2FkRE9NUnVudGltZXMobnVsbCk7DQotCQkNCi0JCUlXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZG9tUnVudGltZSA9IHRhcmdldC5nZXRET01SdW50aW1lKCJzdXBwb3J0ZWRydW50aW1ldGVzdCIpOw0KLQkJSVdzRE9NUnVudGltZUV4dGVuc2lvbiBkb21SdW50aW1lMSA9IHRhcmdldC5nZXRET01SdW50aW1lKCJzdXBwb3J0ZWRydW50aW1ldGVzdDEiKTsNCi0JCQkNCi0JCXRhcmdldC5yZWxvYWRET01SdW50aW1lcyhudWxsKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90U2FtZShkb21SdW50aW1lLHRhcmdldC5nZXRET01SdW50aW1lKFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJ1bnRpbWVJbmZvKCJzdXBwb3J0ZWRydW50aW1ldGVzdCIpLmdldElkKCkpKTsNCi0JCWFzc2VydE5vdFNhbWUoZG9tUnVudGltZTEsdGFyZ2V0LmdldERPTVJ1bnRpbWUoV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UnVudGltZUluZm8oInN1cHBvcnRlZHJ1bnRpbWV0ZXN0MSIpLmdldElkKCkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldERPTVJ1bnRpbWVzKCkNCi0Jew0KLQkJSVdzRE9NUnVudGltZUV4dGVuc2lvbiBkb21SdW50aW1lID0gdGFyZ2V0LmdldERPTVJ1bnRpbWUoInN1cHBvcnRlZHJ1bnRpbWV0ZXN0Iik7CQkNCi0JCWFzc2VydE5vdE51bGwoZG9tUnVudGltZSk7DQotCQlhc3NlcnRUcnVlKGRvbVJ1bnRpbWUgaW5zdGFuY2VvZiBUZXN0V3NET01SdW50aW1lRXh0ZW5zaW9uKTsNCi0JCQ0KLQkJSVdzRE9NUnVudGltZUV4dGVuc2lvbiBkb21SdW50aW1lMSA9IHRhcmdldC5nZXRET01SdW50aW1lKCJzdXBwb3J0ZWRydW50aW1ldGVzdDEiKTsJCQ0KLQkJYXNzZXJ0Tm90TnVsbChkb21SdW50aW1lMSk7DQotCQlhc3NlcnRUcnVlKGRvbVJ1bnRpbWUxIGluc3RhbmNlb2YgVGVzdFdzRE9NUnVudGltZUV4dGVuc2lvbik7CQkNCi0JCQ0KLQkJSVdzRE9NUnVudGltZUV4dGVuc2lvbiBkb21SdW50aW1lMiA9IHRhcmdldC5nZXRET01SdW50aW1lKCJzdXBwb3J0ZWRydW50aW1ldGVzdDIiKTsNCi0JCWFzc2VydE51bGwoZG9tUnVudGltZTIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRE9NUGFzc2VzUHJvZ3Jlc3NNb25pdG9yKCkNCi0Jew0KLQkJTXlXc0RvbVJ1bnRpbWVNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTXlXc0RvbVJ1bnRpbWVNYW5hZ2VyKCk7DQotCQlJV3NET01SdW50aW1lSW5mbyBpbmZvID0gV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UnVudGltZUluZm8oInN1cHBvcnRlZHJ1bnRpbWV0ZXN0MSIpOw0KLQkJTnVsbFByb2dyZXNzTW9uaXRvciBucG0gPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOw0KLQkJSVdzRE9NUnVudGltZUV4dGVuc2lvbiBydEV4ID0gbWFuYWdlci5jcmVhdGVET01SdW50aW1lKGluZm8sIG5wbSk7DQotCQlhc3NlcnRUcnVlKHJ0RXggaW5zdGFuY2VvZiBUZXN0V3NET01SdW50aW1lRXh0ZW5zaW9uKTsNCi0JCWFzc2VydEVxdWFscyhucG0sICgoVGVzdFdzRE9NUnVudGltZUV4dGVuc2lvbilydEV4KS5tb25pdG9yKTsJCQ0KLQl9DQotCQ0KLQlwcml2YXRlIGNsYXNzIE15V3NEb21SdW50aW1lTWFuYWdlciBleHRlbmRzIFdzRE9NUnVudGltZU1hbmFnZXINCi0Jew0KLQkJcHJvdGVjdGVkIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gY3JlYXRlRE9NUnVudGltZShmaW5hbCBJV3NET01SdW50aW1lSW5mbyBydW50aW1lSW5mbywgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZURPTVJ1bnRpbWUocnVudGltZUluZm8sIG1vbml0b3IpOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9Xc0RPTVJ1bnRpbWVSZWdpc3RyeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9Xc0RPTVJ1bnRpbWVSZWdpc3RyeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjZmYzIyOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vV3NET01SdW50aW1lUmVnaXN0cnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwudXRpbC5OYW1lZEV4dGVuc2lvbkluZm87DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeS5JV3NET01SdW50aW1lSW5mbzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnJlZ2lzdHJ5LldzRE9NUnVudGltZVJlZ2lzdHJ5Ow0KLQ0KLXB1YmxpYyBjbGFzcyBXc0RPTVJ1bnRpbWVSZWdpc3RyeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJ1bnRpbWVJbmZvIGV4dGVuZHMgTmFtZWRFeHRlbnNpb25JbmZvIGltcGxlbWVudHMgSVdzRE9NUnVudGltZUluZm8NCi0Jew0KLQkJcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9qZWN0RmFjZXRzOw0KLQkJDQotCQlSdW50aW1lSW5mbyhmaW5hbCBTdHJpbmcgcElkLCBmaW5hbCBTdHJpbmcgcExhYmVsLCBmaW5hbCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9qZWN0RmFjZXRzKQ0KLQkJew0KLQkJCXN1cGVyKHBJZCwgcExhYmVsKTsNCi0JCQkNCi0JCQl0aGlzLnByb2plY3RGYWNldHMgPSBwcm9qZWN0RmFjZXRzOw0KLQkJfQ0KLQkJDQotCQlwdWJsaWMgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPiBnZXRQcm9qZWN0RmFjZXRzKCkNCi0JCXsNCi0JCQlyZXR1cm4gdGhpcy5wcm9qZWN0RmFjZXRzOw0KLQkJfQ0KLSAJfQ0KLQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YW50aWF0ZVJ1bnRpbWUoKSANCi0Jew0KLQkJQ29sbGVjdGlvbjxJV3NET01SdW50aW1lSW5mbz4gcnVudGltZUluZm9zID0gV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UmVnaXN0ZXJlZFJ1bnRpbWVzSW5mbygpOw0KLQkJSXRlcmF0b3I8SVdzRE9NUnVudGltZUluZm8+IHJ1bnRpbWVJbmZvSXRlciA9IHJ1bnRpbWVJbmZvcy5pdGVyYXRvcigpOw0KLQkJDQotCQl3aGlsZShydW50aW1lSW5mb0l0ZXIuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCUlXc0RPTVJ1bnRpbWVJbmZvIHJ1bnRpbWVJbmZvID0gcnVudGltZUluZm9JdGVyLm5leHQoKTsNCi0JCQkNCi0JCQlpZihydW50aW1lSW5mby5nZXRJZCgpLmVxdWFscygic3VwcG9ydGVkcnVudGltZXRlc3QiKQ0KLQkJCQkJfHwgcnVudGltZUluZm8uZ2V0SWQoKS5lcXVhbHMoInN1cHBvcnRlZHJ1bnRpbWV0ZXN0MSIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0Tm90TnVsbChXc0RPTVJ1bnRpbWVSZWdpc3RyeS5pbnN0YW50aWF0ZVJ1bnRpbWUocnVudGltZUluZm8pKTsNCi0JCQkJYXNzZXJ0VHJ1ZShXc0RPTVJ1bnRpbWVSZWdpc3RyeS5pbnN0YW50aWF0ZVJ1bnRpbWUocnVudGltZUluZm8pIGluc3RhbmNlb2YgVGVzdFdzRE9NUnVudGltZUV4dGVuc2lvbik7DQotCQkJfQ0KLQkJCWVsc2UgaWYocnVudGltZUluZm8uZ2V0SWQoKS5lcXVhbHMoInN1cHBvcnRlZHJ1bnRpbWV0ZXN0MiIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0TnVsbChXc0RPTVJ1bnRpbWVSZWdpc3RyeS5pbnN0YW50aWF0ZVJ1bnRpbWUocnVudGltZUluZm8pKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE51bGwoV3NET01SdW50aW1lUmVnaXN0cnkuaW5zdGFudGlhdGVSdW50aW1lKG51bGwpKTsNCi0JCQ0KLQkJUnVudGltZUluZm8gaW5mbyA9IG5ldyBSdW50aW1lSW5mbygiVHN0IiwgImRkZ2ciLCBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpKTsNCi0NCi0JCWFzc2VydE51bGwoV3NET01SdW50aW1lUmVnaXN0cnkuaW5zdGFudGlhdGVSdW50aW1lKGluZm8pKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RmluZEV4dGVuc2lvbigpIA0KLQl7DQotCQlhc3NlcnROb3ROdWxsKFdzRE9NUnVudGltZVJlZ2lzdHJ5LmZpbmRFeHRlbnNpb24oV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UmVnaXN0ZXJlZFJ1bnRpbWVzSW5mbygpLml0ZXJhdG9yKCkubmV4dCgpKSk7DQotCQlhc3NlcnROdWxsKFdzRE9NUnVudGltZVJlZ2lzdHJ5LmZpbmRFeHRlbnNpb24obnVsbCkpOw0KLQkJDQotCQlSdW50aW1lSW5mbyBydW50aW1lSW5mbyA9IG5ldyBSdW50aW1lSW5mbygiVHN0IiwgImRkZ2ciLCBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpKTsNCi0JCWFzc2VydE51bGwoV3NET01SdW50aW1lUmVnaXN0cnkuZmluZEV4dGVuc2lvbihydW50aW1lSW5mbykpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWdpc3RlcmVkUnVudGltZUluZm8oKSANCi0Jew0KLQkJQ29sbGVjdGlvbjxJV3NET01SdW50aW1lSW5mbz4gcnVudGltZUluZm9zID0gV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UmVnaXN0ZXJlZFJ1bnRpbWVzSW5mbygpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHJ1bnRpbWVJbmZvcyk7DQotCQlhc3NlcnRUcnVlKHJ1bnRpbWVJbmZvcy5zaXplKCkgPj0gMyk7DQotCQkNCi0JCUl0ZXJhdG9yPElXc0RPTVJ1bnRpbWVJbmZvPiBydW50aW1lSW5mb0l0ZXIgPSBydW50aW1lSW5mb3MuaXRlcmF0b3IoKTsNCi0JCQ0KLQkJd2hpbGUocnVudGltZUluZm9JdGVyLmhhc05leHQoKSkNCi0JCXsNCi0JCQlJV3NET01SdW50aW1lSW5mbyBydW50aW1lSW5mbyA9IHJ1bnRpbWVJbmZvSXRlci5uZXh0KCk7DQotCQkJDQotCQkJYXNzZXJ0Tm90TnVsbChydW50aW1lSW5mby5nZXRJZCgpKTsNCi0JCQkNCi0JCQlpZihydW50aW1lSW5mby5nZXRJZCgpLmVxdWFscygic3VwcG9ydGVkcnVudGltZXRlc3QiKSkNCi0JCQl7DQotCQkJCWFzc2VydE5vdE51bGwocnVudGltZUluZm8uZ2V0TmFtZSgpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKHJ1bnRpbWVJbmZvLmdldE5hbWUoKSwgIlRlc3RpbmciKTsNCi0JCQkJDQotCQkJCWFzc2VydE5vdE51bGwocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKHJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKS5zaXplKCksIDIpOw0KLQkJCQkNCi0JCQkJYXNzZXJ0VHJ1ZShydW50aW1lSW5mby5nZXRQcm9qZWN0RmFjZXRzKCkuY29udGFpbnNLZXkoImpzdC53ZWIiKSk7DQotCQkJCWFzc2VydFRydWUocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpLmNvbnRhaW5zS2V5KCJ0ZXN0LmZhY2V0IikpOw0KLQkJCQkNCi0JCQkJYXNzZXJ0RmFsc2UocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpLmNvbnRhaW5zS2V5KCJqc3Qud2ViYiIpKTsNCi0JCQkJYXNzZXJ0RmFsc2UocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpLmNvbnRhaW5zS2V5KCJ0ZXN0LmZhY2V0dCIpKTsNCi0JCQkJDQotCQkJCWFzc2VydE5vdE51bGwocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpLmdldCgianN0LndlYiIpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKHJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKS5nZXQoImpzdC53ZWIiKSwgIjEuMC4wLjAiKTsNCi0JCQkJYXNzZXJ0TnVsbChydW50aW1lSW5mby5nZXRQcm9qZWN0RmFjZXRzKCkuZ2V0KCJ0ZXN0LmZhY2V0IikpOw0KLQkJCQkNCi0JCQkJYXNzZXJ0TnVsbChydW50aW1lSW5mby5nZXRQcm9qZWN0RmFjZXRzKCkuZ2V0KCJkdW1teS5mYWNldCIpKTsNCi0JCQl9DQotCQkJZWxzZSBpZihydW50aW1lSW5mby5nZXRJZCgpLmVxdWFscygic3VwcG9ydGVkcnVudGltZXRlc3QxIikpDQotCQkJew0KLQkJCQlhc3NlcnROb3ROdWxsKHJ1bnRpbWVJbmZvLmdldE5hbWUoKSk7DQotCQkJCWFzc2VydEVxdWFscyhydW50aW1lSW5mby5nZXROYW1lKCksICJUZXN0aW5nMSIpOw0KLQkJCQkNCi0JCQkJYXNzZXJ0Tm90TnVsbChydW50aW1lSW5mby5nZXRQcm9qZWN0RmFjZXRzKCkpOw0KLQkJCQlhc3NlcnRFcXVhbHMocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpLnNpemUoKSwgMik7DQotCQkJCQ0KLQkJCQlhc3NlcnRUcnVlKHJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKS5jb250YWluc0tleSgianN0LndlYmIiKSk7DQotCQkJCWFzc2VydFRydWUocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpLmNvbnRhaW5zS2V5KCJ0ZXN0LmZhY2V0dCIpKTsNCi0JCQkJDQotCQkJCWFzc2VydEZhbHNlKHJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKS5jb250YWluc0tleSgianN0LndlYiIpKTsNCi0JCQkJYXNzZXJ0RmFsc2UocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpLmNvbnRhaW5zS2V5KCJ0ZXN0LmZhY2V0IikpOw0KLQkJCQkNCi0JCQkJYXNzZXJ0Tm90TnVsbChydW50aW1lSW5mby5nZXRQcm9qZWN0RmFjZXRzKCkuZ2V0KCJqc3Qud2ViYiIpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKHJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKS5nZXQoImpzdC53ZWJiIiksICIxLjAuMC4wIik7DQotCQkJCWFzc2VydE51bGwocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpLmdldCgidGVzdC5mYWNldHQiKSk7DQotCQkJCQ0KLQkJCQlhc3NlcnROdWxsKHJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKS5nZXQoImR1bW15LmZhY2V0IikpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSdW50aW1lSW5mbygpDQotCXsNCi0JCWFzc2VydE51bGwoV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UnVudGltZUluZm8oInRlc3QuaWQiKSk7DQotCQlhc3NlcnROb3ROdWxsKFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJ1bnRpbWVJbmZvKCJzdXBwb3J0ZWRydW50aW1ldGVzdCIpKTsNCi0JCWFzc2VydE5vdE51bGwoV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UnVudGltZUluZm8oInN1cHBvcnRlZHJ1bnRpbWV0ZXN0MSIpKTsNCi0JCWFzc2VydE51bGwoV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UnVudGltZUluZm8obnVsbCkpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9Db21waWxhdGlvblVuaXRGaW5kZXJDb250cmFjdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9Db21waWxhdGlvblVuaXRGaW5kZXJDb250cmFjdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWRiNGQxZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvQ29tcGlsYXRpb25Vbml0RmluZGVyQ29udHJhY3RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQ29tcGlsYXRpb25Vbml0RmluZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JUHJvamVjdFNlbGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2s7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3Q7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLkNvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLkludm9jYXRpb247DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLlN0dWI7DQotDQotLyoqDQotICogVGhlIHRlc3RzIGluIHRoaXMgY2xhc3MgbWlnaHQgYmUgZXhlY3V0ZWQgaW4gYSBkaXJ0eSB3b3Jrc3BhY2UuIFRodXMgdGhpcyBjbGFzcyBzaG91bGQgYXNzdW1lIHRoYXQgb3RoZXIgcHJvamVjdHMgYXJlIGFscmVhZHkgZXhpc3RpbmcgYW5kIGlnbm9yZSB0aGVtDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKg0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21waWxhdGlvblVuaXRGaW5kZXJDb250cmFjdFRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UNCi17DQotLy8JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0RmluZGVyIHRhcmdldDsNCi0JcHJpdmF0ZSBMaXN0PElQcm9qZWN0U2VsZWN0b3I+IHByb2plY3RTZWxlY3RvcnM7DQotCQ0KLQlwcml2YXRlIElKYXZhTW9kZWwgamF2YU1vZGVsOw0KLQkNCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gZXhpc3RpbmdQcm9qZWN0c05hbWVzOw0KLQkNCi0JcHJvdGVjdGVkIElKYXZhTW9kZWwgamF2YU1vZGVsKCkgew0KLQkJcmV0dXJuIGphdmFNb2RlbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIExpc3Q8SVByb2plY3RTZWxlY3Rvcj4gcHJvamVjdFNlbGVjdG9ycygpIHsNCi0JCXJldHVybiBwcm9qZWN0U2VsZWN0b3JzOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUNvbXBpbGF0aW9uVW5pdEZpbmRlciBjcmVhdGVUYXJnZXQoKTsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsNCi0JCQ0KLQkJamF2YU1vZGVsID0gSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOw0KLQkJcHJvamVjdFNlbGVjdG9ycyA9IG5ldyBBcnJheUxpc3Q8SVByb2plY3RTZWxlY3Rvcj4oKTsNCi0JCWV4aXN0aW5nUHJvamVjdHNOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQkJZm9yIChJUHJvamVjdCBwcmogOiAoSVByb2plY3RbXSlqYXZhTW9kZWwuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCkpDQotCQl7DQotCQkJZXhpc3RpbmdQcm9qZWN0c05hbWVzLmFkZChwcmouZ2V0TmFtZSgpKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9maW5kKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIHsNCi0JDQotCQkNCi0JCWZpbmFsIFRlc3RQcm9qZWN0IHByb2plY3QxID0gbmV3IFRlc3RQcm9qZWN0KCk7DQotCQlwcm9qZWN0MS5jcmVhdGVTb3VyY2VGb2xkZXIoInNvdXJjZUZvbGRlciIpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwZjEgPSBwcm9qZWN0MS5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3QxIik7DQotCQlwcm9qZWN0MS5jcmVhdGVUeXBlKHBmMSwgIkNvbXBpbGF0aW9uVW5pdDEuamF2YSIsICJjbGFzcyBJZ25vcnJlZHt9Iik7DQotCQlwcm9qZWN0MS5jcmVhdGVUeXBlKHBmMSwgIkNvbXBpbGF0aW9uVW5pdDIuamF2YSIsICJjbGFzcyBJZ25vcnJlZHt9Iik7DQotCQlwcm9qZWN0MS5jcmVhdGVUeXBlKHBmMSwgIkNvbXBpbGF0aW9uVW5pdDMuamF2YSIsICJjbGFzcyBJZ25vcnJlZHt9Iik7DQotCQkNCi0JCWZpbmFsIFRlc3RQcm9qZWN0IHByb2plY3QyID0gbmV3IFRlc3RQcm9qZWN0KCk7DQotCQlwcm9qZWN0Mi5jcmVhdGVTb3VyY2VGb2xkZXIoInNvdXJjZUZvbGRlciIpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwZjIgPSBwcm9qZWN0Mi5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3QxIik7DQotCQlwcm9qZWN0Mi5jcmVhdGVUeXBlKHBmMiwgIkNvbXBpbGF0aW9uVW5pdDEuamF2YSIsICJjbGFzcyBJZ25vcnJlZHt9Iik7DQotCQlwcm9qZWN0Mi5jcmVhdGVUeXBlKHBmMiwgIkNvbXBpbGF0aW9uVW5pdDIuamF2YSIsICJjbGFzcyBJZ25vcnJlZHt9Iik7DQotCQkNCi0JCWZpbmFsIFRlc3RQcm9qZWN0IHByb2plY3QzID0gbmV3IFRlc3RQcm9qZWN0KCk7DQotCQlwcm9qZWN0My5jcmVhdGVTb3VyY2VGb2xkZXIoInNvdXJjZUZvbGRlciIpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwZjMgPSBwcm9qZWN0My5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3QzIik7DQotCQlwcm9qZWN0My5jcmVhdGVUeXBlKHBmMywgIkNvbXBpbGF0aW9uVW5pdDEuamF2YSIsICJjbGFzcyBJZ25vcnJlZHt9Iik7DQotCQlwcm9qZWN0My5jcmVhdGVUeXBlKHBmMywgIkNvbXBpbGF0aW9uVW5pdDIuamF2YSIsICJjbGFzcyBJZ25vcnJlZHt9Iik7DQotCQ0KLQkJZmluYWwgSVByb2plY3RTZWxlY3RvciBleGx1ZGVQcm9qZWN0MiA9IG5ldyBJUHJvamVjdFNlbGVjdG9yKCkgew0KLQ0KLQkJCXB1YmxpYyBib29sZWFuIGFwcHJvdmUoSUphdmFQcm9qZWN0IHByaikNCi0JCQl7DQotCQkJCXJldHVybiBwcmouZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMocHJvamVjdDIuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKSB8fCBleGlzdGluZ1Byb2plY3RzTmFtZXMuY29udGFpbnMocHJqLmdldEVsZW1lbnROYW1lKCkpPyBmYWxzZSA6IHRydWU7DQotCQkJfQ0KLQkJCQ0KLQkJfTsNCi0JCQ0KLQkJZmluYWwgSVByb2plY3RTZWxlY3RvciBhZGRtaXRBbGxfZXhjZXB0UHJvamVjdDIgPSBuZXcgSVByb2plY3RTZWxlY3RvcigpIHsNCi0JCQlwdWJsaWMgYm9vbGVhbiBhcHByb3ZlKElKYXZhUHJvamVjdCBwcmopDQotCQkJew0KLQkJCQlyZXR1cm4gcHJqLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHByb2plY3QyLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSkgfHwgZXhpc3RpbmdQcm9qZWN0c05hbWVzLmNvbnRhaW5zKHByai5nZXRFbGVtZW50TmFtZSgpKSA/IGZhbHNlIDogdHJ1ZTsNCi0JCQl9DQotCQl9Ow0KLQkJDQotCQlwcm9qZWN0U2VsZWN0b3JzKCkuYWRkKGV4bHVkZVByb2plY3QyKTsNCi0JCXByb2plY3RTZWxlY3RvcnMoKS5hZGQoYWRkbWl0QWxsX2V4Y2VwdFByb2plY3QyKTsNCi0NCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXRGaW5kZXIgdGFyZ2V0ID0gY3JlYXRlVGFyZ2V0KCk7DQotCQkJDQotCQkNCi0JCWZpbmFsIE1vY2s8SUNvbXBpbGF0aW9uVW5pdEhhbmRsZXI+IG1vY2tDVUhhbmRsZXIgPSBtb2NrKElDb21waWxhdGlvblVuaXRIYW5kbGVyLmNsYXNzKTsNCi0JCQ0KLQkJZmluYWwgU3R1YiBjb25maWd1cmVFeHBlY3RhdGlvbnMgPSBuZXcgU3R1YigpIA0KLQkJew0KLQ0KLQkJCXB1YmxpYyBPYmplY3QgaW52b2tlKEludm9jYXRpb24gYXJnMCkgdGhyb3dzIFRocm93YWJsZQ0KLQkJCXsNCi0JCQkJbW9ja0NVSGFuZGxlci5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJoYW5kbGUiKS53aXRoKHByb2plY3ROYW1lZChwcm9qZWN0MS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpKS5pZCgiY3VDYWxsMSIpOw0KLQkJCQltb2NrQ1VIYW5kbGVyLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImhhbmRsZSIpLndpdGgoY3VOYW1lZChwZjEuZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21waWxhdGlvblVuaXQxLmphdmEiKS5nZXRQYXRoKCkudG9PU1N0cmluZygpKSkuYWZ0ZXIoImN1Q2FsbDEiKS5pZCgiY3VDYWxsMiIpOw0KLQkJCQltb2NrQ1VIYW5kbGVyLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImhhbmRsZSIpLndpdGgoY3VOYW1lZChwZjEuZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21waWxhdGlvblVuaXQyLmphdmEiKS5nZXRQYXRoKCkudG9PU1N0cmluZygpKSkuYWZ0ZXIoImN1Q2FsbDEiKS5pZCgiY3VDYWxsMyIpOw0KLQkJCQltb2NrQ1VIYW5kbGVyLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImhhbmRsZSIpLndpdGgoY3VOYW1lZChwZjEuZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21waWxhdGlvblVuaXQzLmphdmEiKS5nZXRQYXRoKCkudG9PU1N0cmluZygpKSkuYWZ0ZXIoImN1Q2FsbDEiKS5pZCgiY3VDYWxsNCIpOw0KLQkJCQkNCi0JCQkJbW9ja0NVSGFuZGxlci5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJoYW5kbGUiKS53aXRoKHByb2plY3ROYW1lZChwcm9qZWN0My5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpKS5pZCgiY3VDYWxsNSIpOw0KLQkJCQltb2NrQ1VIYW5kbGVyLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImhhbmRsZSIpLndpdGgoY3VOYW1lZChwZjMuZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21waWxhdGlvblVuaXQxLmphdmEiKS5nZXRQYXRoKCkudG9PU1N0cmluZygpKSkuYWZ0ZXIoImN1Q2FsbDUiKS5pZCgiY3VDYWxsNiIpOw0KLQkJCQltb2NrQ1VIYW5kbGVyLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImhhbmRsZSIpLndpdGgoY3VOYW1lZChwZjMuZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21waWxhdGlvblVuaXQyLmphdmEiKS5nZXRQYXRoKCkudG9PU1N0cmluZygpKSkuYWZ0ZXIoImN1Q2FsbDUiKS5pZCgiY3VDYWxsNyIpOw0KLQkJCQltb2NrQ1VIYW5kbGVyLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImZpbmlzaGVkIikud2l0aE5vQXJndW1lbnRzKCkuYWZ0ZXIoImN1Q2FsbDEiKS5hZnRlcigiY3VDYWxsMiIpLmFmdGVyKCJjdUNhbGwzIikuYWZ0ZXIoImN1Q2FsbDQiKS5hZnRlcigiY3VDYWxsNSIpLmFmdGVyKCJjdUNhbGw2IikuYWZ0ZXIoImN1Q2FsbDciKTsNCi0JCQkJcmV0dXJuIG51bGw7DQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyBTdHJpbmdCdWZmZXIgZGVzY3JpYmVUbyhTdHJpbmdCdWZmZXIgYXJnMCkNCi0JCQl7DQotCQkJCXJldHVybiBhcmcwLmFwcGVuZCgiQ29uZmlndXJlIGV4cGVjdGF0aW9ucyBhZnRlciBzdGFydCBpcyBpbnZva2VkIik7DQotCQkJfQ0KLQkJCQ0KLQkJfTsNCi0JCW1vY2tDVUhhbmRsZXIuZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgic3RhcnRlZCIpLndpdGhOb0FyZ3VtZW50cygpLndpbGwoY29uZmlndXJlRXhwZWN0YXRpb25zKTsNCi0JCXRhcmdldC5maW5kKG51bGwsIG1vY2tDVUhhbmRsZXIucHJveHkoKSk7DQotCX0NCi0JDQotCXByaXZhdGUgQ29uc3RyYWludCBwcm9qZWN0TmFtZWQoZmluYWwgU3RyaW5nIHByak5hbWUpIHsNCi0JCXJldHVybiBuZXcgQ29uc3RyYWludCgpIHsNCi0JCQlwdWJsaWMgU3RyaW5nQnVmZmVyIGRlc2NyaWJlVG8oU3RyaW5nQnVmZmVyIGFyZzApDQotCQkJew0KLQkJCQlyZXR1cm4gYXJnMC5hcHBlbmQocHJqTmFtZSk7DQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyBib29sZWFuIGV2YWwoT2JqZWN0IGFyZzApDQotCQkJew0KLQkJCQlpZiAoIShhcmcwIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQl9DQotCQkJCWZpbmFsIElKYXZhUHJvamVjdCBjYXN0ID0gKElKYXZhUHJvamVjdClhcmcwOw0KLQkJCQlyZXR1cm4gcHJqTmFtZS5lcXVhbHMoY2FzdC5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCQl9DQotCQl9Ow0KLQl9DQotCQ0KLQlwcml2YXRlIENvbnN0cmFpbnQgY3VOYW1lZChmaW5hbCBTdHJpbmcgY3VOYW1lKSB7DQotCQlyZXR1cm4gbmV3IENvbnN0cmFpbnQoKSB7DQotCQkJcHVibGljIFN0cmluZ0J1ZmZlciBkZXNjcmliZVRvKFN0cmluZ0J1ZmZlciBhcmcwKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGFyZzAuYXBwZW5kKGN1TmFtZSk7DQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyBib29sZWFuIGV2YWwoT2JqZWN0IGFyZzApDQotCQkJew0KLQkJCQlpZiAoIShhcmcwIGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkpDQotCQkJCXsNCi0JCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJfQ0KLQkJCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGNhc3QgPSAoSUNvbXBpbGF0aW9uVW5pdClhcmcwOw0KLQkJCQlyZXR1cm4gY3VOYW1lLmVxdWFscyhjYXN0LmdldFBhdGgoKS50b09TU3RyaW5nKCkpOw0KLQkJCX0NCi0JCX07DQotCQkJDQotCX0NCi0JDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9Eb21UZXN0VXRpbHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9Eb21UZXN0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWViYjZhOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvRG9tVGVzdFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5GaWxlVXRpbHM7DQotDQotcHVibGljIGNsYXNzIERvbVRlc3RVdGlscw0KLXsNCi0JcHVibGljIElNZXRob2QgZ2V0RXhpc3RpbmdNZXRob2QoSVR5cGUgdHlwZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZy4uLiBhcmdzKQ0KLQl7DQotCQlmaW5hbCBJTWV0aG9kIG0gPSB0eXBlLmdldE1ldGhvZChtZXRob2ROYW1lLCBhcmdzKTsNCi0JCUFzc2VydC5hc3NlcnRUcnVlKG0uZXhpc3RzKCkpOw0KLQkJcmV0dXJuIG07DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0Q29udGVudHMoSUNvbXBpbGF0aW9uVW5pdCBjdSwgU3RyaW5nIGNvbnRlbnRzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIFN0cmluZyBjb250ZW50VG9TZXQgPSAicGFja2FnZSAiK2N1LmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCkrIjtcbiIrY29udGVudHM7DQotCQlGaWxlVXRpbHMuZ2V0SW5zdGFuY2UoKS5zZXRDb21waWxhdGlvblVuaXRDb250ZW50KGN1LCBjb250ZW50VG9TZXQsIHRydWUsIG51bGwpOw0KLQl9DQotCQ0KLQlwdWJsaWMgSVdlYlBhcmFtIGZpbmRQYXJhbShmaW5hbCBJV2ViTWV0aG9kIG1ldGhvZCwgZmluYWwgU3RyaW5nIGltcGxOYW1lKSANCi0Jew0KLQkJZm9yIChJV2ViUGFyYW0gcGFyYW0gOiBtZXRob2QuZ2V0UGFyYW1ldGVycygpKSB7DQotCQkJaWYgKHBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKGltcGxOYW1lKSkgew0KLQkJCQlyZXR1cm4gcGFyYW07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQkNCi0JDQotCQ0KLQlwdWJsaWMgSVdlYk1ldGhvZCBmaW5kV2ViTWV0aG9kQnlOYW1lKGZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpLCBmaW5hbCBTdHJpbmcgbmFtZSkgDQotCXsNCi0JCWZvciAoSVdlYk1ldGhvZCB3ZWJNZXRob2QgOiBzZWkuZ2V0V2ViTWV0aG9kcygpKSB7DQotCQkJaWYod2ViTWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsNCi0JCQkJcmV0dXJuIHdlYk1ldGhvZDsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9CQkNCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL0pheFdzRGVmYXVsdHNDYWxjdWxhdG9yVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL0pheFdzRGVmYXVsdHNDYWxjdWxhdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxM2VlN2JhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9KYXhXc0RlZmF1bHRzQ2FsY3VsYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3JUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlIA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9OQU1FID0gIm1ldGhvZCI7DQotCQ0KLQlwcml2YXRlIE1vY2s8SVdlYk1ldGhvZD4gd2ViTWV0aG9kOw0KLQlwcml2YXRlIEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yIGRlZkNhbGMgPSBuZXcgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IoKTsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpDQotCXsNCi0JCXdlYk1ldGhvZCA9IG1vY2soSVdlYk1ldGhvZC5jbGFzcyk7DQotCQl3ZWJNZXRob2Quc3R1YnMoKS5tZXRob2QoImdldFNvYXBCaW5kaW5nU3R5bGUiKS53aWxsKHJldHVyblZhbHVlKFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQpKTsNCi0JCXdlYk1ldGhvZC5zdHVicygpLm1ldGhvZCgiZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSIpLndpbGwocmV0dXJuVmFsdWUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFKSk7DQotCQl3ZWJNZXRob2Quc3R1YnMoKS5tZXRob2QoImdldE5hbWUiKS53aWxsKHJldHVyblZhbHVlKE1FVEhPRF9OQU1FKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3REZWZpbmVTQlN0eWxlRGVmYXVsdFZhbHVlKCkgDQotCXsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5ULCBkZWZDYWxjLmRlZmluZVNCU3R5bGUobnVsbCkpOw0KLQ0KLQkJTW9jazxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubiA9IG1vY2soSUFubm90YXRpb24uY2xhc3MpOw0KLQkJYW5uLnN0dWJzKCkubWV0aG9kKCJnZXRQcm9wZXJ0eVZhbHVlIikud2lsbChyZXR1cm5WYWx1ZShudWxsKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCwgZGVmQ2FsYy5kZWZpbmVTQlN0eWxlKGFubi5wcm94eSgpKSk7DQotCQkNCi0JCWFubi5zdHVicygpLm1ldGhvZCgiZ2V0UHJvcGVydHlWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoIlN0eWxlLkRPQ1VNRU5UIikpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQsIGRlZkNhbGMuZGVmaW5lU0JTdHlsZShhbm4ucHJveHkoKSkpOw0KLQkJDQotCQlhbm4uc3R1YnMoKS5tZXRob2QoImdldFByb3BlcnR5VmFsdWUiKS53aWxsKHJldHVyblZhbHVlKCJTT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVCIpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5ULCBkZWZDYWxjLmRlZmluZVNCU3R5bGUoYW5uLnByb3h5KCkpKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmaW5lU0JTdHlsZSgpIA0KLQl7DQotCQlNb2NrPElBbm5vdGF0aW9uPElUeXBlPj4gYW5uID0gbW9jayhJQW5ub3RhdGlvbi5jbGFzcyk7DQotCQlhbm4uc3R1YnMoKS5tZXRob2QoImdldFByb3BlcnR5VmFsdWUiKS53aWxsKHJldHVyblZhbHVlKCJTdHlsZS5SUEMiKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdTdHlsZS5SUEMsIGRlZkNhbGMuZGVmaW5lU0JTdHlsZShhbm4ucHJveHkoKSkpOw0KLQ0KLQkJYW5uLnN0dWJzKCkubWV0aG9kKCJnZXRQcm9wZXJ0eVZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgiU09BUEJpbmRpbmcuU3R5bGUuUlBDIikpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nU3R5bGUuUlBDLCBkZWZDYWxjLmRlZmluZVNCU3R5bGUoYW5uLnByb3h5KCkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdERlZmluZVNCVXNlRGVmYXVsdFZhbHVlKCkgDQotCXsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1VzZS5MSVRFUkFMLCBkZWZDYWxjLmRlZmluZVNCVXNlKG51bGwpKTsNCi0NCi0JCU1vY2s8SUFubm90YXRpb248SVR5cGU+PiBhbm4gPSBtb2NrKElBbm5vdGF0aW9uLmNsYXNzKTsNCi0JCWFubi5zdHVicygpLm1ldGhvZCgiZ2V0UHJvcGVydHlWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUobnVsbCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nVXNlLkxJVEVSQUwsIGRlZkNhbGMuZGVmaW5lU0JVc2UoYW5uLnByb3h5KCkpKTsNCi0JCQ0KLQkJYW5uLnN0dWJzKCkubWV0aG9kKCJnZXRQcm9wZXJ0eVZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgiU3R5bGUuTElURVJBTCIpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1VzZS5MSVRFUkFMLCBkZWZDYWxjLmRlZmluZVNCVXNlKGFubi5wcm94eSgpKSk7DQotCQkNCi0JCWFubi5zdHVicygpLm1ldGhvZCgiZ2V0UHJvcGVydHlWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoIlNPQVBCaW5kaW5nLlN0eWxlLkxJVEVSQUwiKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdVc2UuTElURVJBTCwgZGVmQ2FsYy5kZWZpbmVTQlVzZShhbm4ucHJveHkoKSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmaW5lU0JVc2UoKQ0KLQl7DQotCQlNb2NrPElBbm5vdGF0aW9uPElUeXBlPj4gYW5uID0gbW9jayhJQW5ub3RhdGlvbi5jbGFzcyk7DQotCQlhbm4uc3R1YnMoKS5tZXRob2QoImdldFByb3BlcnR5VmFsdWUiKS53aWxsKHJldHVyblZhbHVlKCJVc2UuRU5DT0RFRCIpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1VzZS5FTkNPREVELCBkZWZDYWxjLmRlZmluZVNCVXNlKGFubi5wcm94eSgpKSk7DQotDQotCQlhbm4uc3R1YnMoKS5tZXRob2QoImdldFByb3BlcnR5VmFsdWUiKS53aWxsKHJldHVyblZhbHVlKCJTT0FQQmluZGluZy5Vc2UuRU5DT0RFRCIpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1VzZS5FTkNPREVELCBkZWZDYWxjLmRlZmluZVNCVXNlKGFubi5wcm94eSgpKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdERlZmluZVNCUGFyYW1ldGVyU3R5bGVEZWZhdWx0VmFsdWUoKSANCi0Jew0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCwgZGVmQ2FsYy5kZWZpbmVTQlBhcmFtZXRlclN0eWxlKG51bGwpKTsNCi0NCi0JCU1vY2s8SUFubm90YXRpb248SVR5cGU+PiBhbm4gPSBtb2NrKElBbm5vdGF0aW9uLmNsYXNzKTsNCi0JCWFubi5zdHVicygpLm1ldGhvZCgiZ2V0UHJvcGVydHlWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUobnVsbCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCwgZGVmQ2FsYy5kZWZpbmVTQlBhcmFtZXRlclN0eWxlKGFubi5wcm94eSgpKSk7DQotCQkNCi0JCWFubi5zdHVicygpLm1ldGhvZCgiZ2V0UHJvcGVydHlWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoIlBhcmFtZXRlclN0eWxlLldSQVBQRUQiKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVELCBkZWZDYWxjLmRlZmluZVNCUGFyYW1ldGVyU3R5bGUoYW5uLnByb3h5KCkpKTsNCi0JCQ0KLQkJYW5uLnN0dWJzKCkubWV0aG9kKCJnZXRQcm9wZXJ0eVZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgiU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCIpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQsIGRlZkNhbGMuZGVmaW5lU0JQYXJhbWV0ZXJTdHlsZShhbm4ucHJveHkoKSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmaW5lU0JQYXJhbWV0ZXJTdHlsZSgpIA0KLQl7DQotCQlNb2NrPElBbm5vdGF0aW9uPElUeXBlPj4gYW5uID0gbW9jayhJQW5ub3RhdGlvbi5jbGFzcyk7DQotCQlhbm4uc3R1YnMoKS5tZXRob2QoImdldFByb3BlcnR5VmFsdWUiKS53aWxsKHJldHVyblZhbHVlKCJQYXJhbWV0ZXJTdHlsZS5CQVJFIikpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRSwgZGVmQ2FsYy5kZWZpbmVTQlBhcmFtZXRlclN0eWxlKGFubi5wcm94eSgpKSk7DQotDQotCQlhbm4uc3R1YnMoKS5tZXRob2QoImdldFByb3BlcnR5VmFsdWUiKS53aWxsKHJldHVyblZhbHVlKCJTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFIikpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRSwgZGVmQ2FsYy5kZWZpbmVTQlBhcmFtZXRlclN0eWxlKGFubi5wcm94eSgpKSk7CQ0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENhbGNXZWJQYXJhbURlZmF1bHROYW1lKCkgDQotCXsNCi0JCWFzc2VydEVxdWFscyhNRVRIT0RfTkFNRSwgZGVmQ2FsYy5jYWxjV2ViUGFyYW1EZWZhdWx0TmFtZSh3ZWJNZXRob2QucHJveHkoKSwgMCkpOw0KLQkJDQotCQl3ZWJNZXRob2Quc3R1YnMoKS5tZXRob2QoImdldFNvYXBCaW5kaW5nU3R5bGUiKS53aWxsKHJldHVyblZhbHVlKFNPQVBCaW5kaW5nU3R5bGUuUlBDKSk7DQotCQlhc3NlcnRFcXVhbHMoImFyZzAiLCBkZWZDYWxjLmNhbGNXZWJQYXJhbURlZmF1bHROYW1lKHdlYk1ldGhvZC5wcm94eSgpLCAwKSk7DQotCQkNCi0JCXdlYk1ldGhvZC5zdHVicygpLm1ldGhvZCgiZ2V0U29hcEJpbmRpbmdTdHlsZSIpLndpbGwocmV0dXJuVmFsdWUoU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCkpOw0KLQkJd2ViTWV0aG9kLnN0dWJzKCkubWV0aG9kKCJnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIikud2lsbChyZXR1cm5WYWx1ZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQpKTsNCi0JCWFzc2VydEVxdWFscygiYXJnMSIsIGRlZkNhbGMuY2FsY1dlYlBhcmFtRGVmYXVsdE5hbWUod2ViTWV0aG9kLnByb3h5KCksIDEpKTsJCQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDYWxjV2ViUGFyYW1EZWZhdWx0VGFyZ2V0TlMoKSANCi0Jew0KLQkJTW9jazxJV2ViUGFyYW0+IHdlYlBhcmFtID0gbW9jayhJV2ViUGFyYW0uY2xhc3MpOw0KLQkJd2ViTWV0aG9kLnN0dWJzKCkubWV0aG9kKCJnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIikud2lsbChyZXR1cm5WYWx1ZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQpKTsJCQ0KLQkJd2ViUGFyYW0uc3R1YnMoKS5tZXRob2QoImlzSGVhZGVyIikud2lsbChyZXR1cm5WYWx1ZShmYWxzZSkpOw0KLQkJDQotCQlNb2NrPElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+IHNlaSA9IG1vY2soSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcyk7DQotCQlzZWkuc3R1YnMoKS5tZXRob2QoImdldFRhcmdldE5hbWVzcGFjZSIpLndpbGwocmV0dXJuVmFsdWUoImh0dHA6Ly9jb20uc2FwLnRlc3QiKSk7CQkNCi0JCXdlYk1ldGhvZC5zdHVicygpLm1ldGhvZCgiZUNvbnRhaW5lciIpLndpbGwocmV0dXJuVmFsdWUoc2VpLnByb3h5KCkpKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKCIiLCBkZWZDYWxjLmNhbGNXZWJQYXJhbURlZmF1bHRUYXJnZXROUyh3ZWJNZXRob2QucHJveHkoKSwgd2ViUGFyYW0ucHJveHkoKSkpOw0KLQ0KLQkJd2ViTWV0aG9kLnN0dWJzKCkubWV0aG9kKCJnZXRTb2FwQmluZGluZ1N0eWxlIikud2lsbChyZXR1cm5WYWx1ZShTT0FQQmluZGluZ1N0eWxlLlJQQykpOwkJDQotCQlhc3NlcnRFcXVhbHMoImh0dHA6Ly9jb20uc2FwLnRlc3QiLCBkZWZDYWxjLmNhbGNXZWJQYXJhbURlZmF1bHRUYXJnZXROUyh3ZWJNZXRob2QucHJveHkoKSwgd2ViUGFyYW0ucHJveHkoKSkpOw0KLQkJDQotCQl3ZWJNZXRob2Quc3R1YnMoKS5tZXRob2QoImdldFNvYXBCaW5kaW5nU3R5bGUiKS53aWxsKHJldHVyblZhbHVlKFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQpKTsJDQotCQl3ZWJNZXRob2Quc3R1YnMoKS5tZXRob2QoImdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiKS53aWxsKHJldHVyblZhbHVlKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRSkpOwkJDQotCQlhc3NlcnRFcXVhbHMoImh0dHA6Ly9jb20uc2FwLnRlc3QiLCBkZWZDYWxjLmNhbGNXZWJQYXJhbURlZmF1bHRUYXJnZXROUyh3ZWJNZXRob2QucHJveHkoKSwgd2ViUGFyYW0ucHJveHkoKSkpOw0KLQkJDQotCQl3ZWJNZXRob2Quc3R1YnMoKS5tZXRob2QoImdldFNvYXBCaW5kaW5nU3R5bGUiKS53aWxsKHJldHVyblZhbHVlKFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQpKTsJDQotCQl3ZWJNZXRob2Quc3R1YnMoKS5tZXRob2QoImdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiKS53aWxsKHJldHVyblZhbHVlKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCkpOw0KLQkJd2ViUGFyYW0uc3R1YnMoKS5tZXRob2QoImlzSGVhZGVyIikud2lsbChyZXR1cm5WYWx1ZSh0cnVlKSk7DQotCQkNCi0JCWFzc2VydEVxdWFscygiaHR0cDovL2NvbS5zYXAudGVzdCIsIGRlZkNhbGMuY2FsY1dlYlBhcmFtRGVmYXVsdFRhcmdldE5TKHdlYk1ldGhvZC5wcm94eSgpLCB3ZWJQYXJhbS5wcm94eSgpKSk7CQkNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FsY1dlYlJlc3VsdERlZmF1bHROYW1lKCkgDQotCXsNCi0JCWFzc2VydEVxdWFscyhNRVRIT0RfTkFNRSArICJSZXNwb25zZSIsIGRlZkNhbGMuY2FsY1dlYlJlc3VsdERlZmF1bHROYW1lKHdlYk1ldGhvZC5wcm94eSgpKSk7DQotCQkNCi0JCXdlYk1ldGhvZC5zdHVicygpLm1ldGhvZCgiZ2V0U29hcEJpbmRpbmdTdHlsZSIpLndpbGwocmV0dXJuVmFsdWUoU09BUEJpbmRpbmdTdHlsZS5SUEMpKTsNCi0JCWFzc2VydEVxdWFscygicmV0dXJuIiwgZGVmQ2FsYy5jYWxjV2ViUmVzdWx0RGVmYXVsdE5hbWUod2ViTWV0aG9kLnByb3h5KCkpKTsNCi0JCQ0KLQkJd2ViTWV0aG9kLnN0dWJzKCkubWV0aG9kKCJnZXRTb2FwQmluZGluZ1N0eWxlIikud2lsbChyZXR1cm5WYWx1ZShTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UKSk7DQotCQl3ZWJNZXRob2Quc3R1YnMoKS5tZXRob2QoImdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiKS53aWxsKHJldHVyblZhbHVlKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJyZXR1cm4iLCBkZWZDYWxjLmNhbGNXZWJSZXN1bHREZWZhdWx0TmFtZSh3ZWJNZXRob2QucHJveHkoKSkpOwkJCQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9KYXhXc1dvcmtzcGFjZVJlc291cmNlVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9KYXhXc1dvcmtzcGFjZVJlc291cmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTZmZGIyMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NEb21Mb2FkTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JUHJvamVjdFNlbGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0Ow0KLS8qKg0KLSAqIFRoaXMgdGVzdCBtaWdodCBiZSBleGVjdXRlZCBpbiBub24tY2xlYW4gd29ya3NwYWNlLiBUaHVzIGl0IHNob3VsZCB0cnkgdG8gaWdub3JlIGFueSBleGlzdGluZyBwcm9qZWN0cyBhbmQgd29yayB3aXRoIHRoZSB0ZXN0IHByb2VqY3RzIGl0IGNyZWF0ZXMuDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKYXhXc1dvcmtzcGFjZVJlc291cmNlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0JcHJpdmF0ZSBUZXN0UHJvamVjdCB0ZXN0UHJvamVjdDsNCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IHBmOw0KLQlwcml2YXRlIElKYXZhTW9kZWwgamF2YU1vZGVsOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlzdXBlci5zZXRVcCgpOw0KLQkJdGVzdFByb2plY3QgPSBuZXcgVGVzdFByb2plY3QoKTsNCi0JCXRlc3RQcm9qZWN0LmNyZWF0ZVNvdXJjZUZvbGRlcigic3JjIik7DQotCQlwZiA9IHRlc3RQcm9qZWN0LmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5zbW9rZSIpOw0KLQkJamF2YU1vZGVsID0gSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogVmVyaWZpZXMgdGhhdCBhIHNpbXBsZSBwcm9qZWN0IHdpdGggb25lIHdlYiBzZXJ2aWNlIGNsYXNzIGFuZCBvbmUgc2VpIGNhbiBiZSBwYXJzZWQNCi0JICoNCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RfU21va2VfT25lV3NBbmRPbmVTZWkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbg0KLQl7DQotCQl0ZXN0UHJvamVjdC5jcmVhdGVUeXBlKHBmLCAiU2VpMS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZSBwdWJsaWMgaW50ZXJmYWNlIFNlaTEge30iKTsNCi0JCXRlc3RQcm9qZWN0LmNyZWF0ZVR5cGUocGYsICJXZWJTZXJ2aWNlMS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShlbmRwb2ludEludGVyZmFjZT1cImNvbS5zYXAudGVzdC5zbW9rZS5TZWkxXCIpIHB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlMXt9Iik7DQotCQlmaW5hbCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHRhcmdldCA9IGNyZWF0ZUpheFdzV29ya3NwYWNlUmVzb3VyY2UodGVzdFByb2plY3QpOw0KLQkJdGFyZ2V0LmxvYWQobnVsbCk7DQotCQkNCi0JCS8vZmluZCB0aGUgdGVzdCBwcm9qZWN0IGFuZCB3b3JrIG9ubHkgd2l0aCBpdC4gaWdub3JlIGFueSBvdGhlciBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlDQotCQlmaW5hbCBMaXN0PElXZWJTZXJ2aWNlUHJvamVjdD4gcHJvamVjdHMgPSB0YXJnZXQuZ2V0RE9NKCkuZ2V0V2ViU2VydmljZVByb2plY3RzKCk7DQotCQlJV2ViU2VydmljZVByb2plY3QgdGVzdFdzUHJvamVjdCA9IG51bGw7DQotCQlmb3IgKElXZWJTZXJ2aWNlUHJvamVjdCBhUHJvamVjdCA6IHByb2plY3RzKQ0KLQkJew0KLQkJCWlmIChhUHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHRlc3RQcm9qZWN0LmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSkpDQotCQkJew0KLQkJCQl0ZXN0V3NQcm9qZWN0ID0gYVByb2plY3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCWlmICh0ZXN0V3NQcm9qZWN0ID09IG51bGwpDQotCQl7DQotCQkJZmFpbCgiV2ViU2VydmljZVByb2plY3Qgd2l0IG5hbWUgIiArIHRlc3RQcm9qZWN0LmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSArICJpcyBub3QgZm91bmQgaW4gdGhlIG1vZGVsIik7DQotCQl9DQotCQkNCi0JCWZpbmFsIExpc3Q8SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZT4gc2VpcyA9IHRlc3RXc1Byb2plY3QuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpOw0KLQkJYXNzZXJ0VHJ1ZSgiTW9yZSB0aGFuIDEgc2VpIGZvdW5kIGluIHRoZSBtb2RlbCwgd2hpbGUgb25seSBvbmUgdGVzdCBzZWkgd2FzIHVzZWQiLCBzZWlzLnNpemUoKSA9PSAxKTsNCi0JCWFzc2VydEVxdWFscygiVGhlIHNlaSBpbiB0aGUgbW9kZWwgaXMgd2l0aCBkaWZmZXJlbnQgbmFtZSIsICJTZWkxIiwgc2Vpcy5nZXQoMCkuZ2V0TmFtZSgpKTsNCi0JCWFzc2VydEVxdWFscygiVGhlIHNlaSBpbiB0aGUgbW9kZWwgaXMgd2l0aCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24iLCAiY29tLnNhcC50ZXN0LnNtb2tlLlNlaTEiLCBzZWlzLmdldCgwKS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWZpbmFsIExpc3Q8SVdlYlNlcnZpY2U+IHdlYlNlcnZpY2VzID0gdGVzdFdzUHJvamVjdC5nZXRXZWJTZXJ2aWNlcygpOw0KLQkJYXNzZXJ0VHJ1ZSgiTW9yZSB0aGFuIDEgd2ViIHNlcnZpY2UgZm91bmQgaW4gdGhlIG1vZGVsLCB3aGlsZSBvbmx5IG9uZSB0ZXN0IHdlYiBzZXJ2aWNlIHdhcyB1c2VkIiwgd2ViU2VydmljZXMuc2l6ZSgpID09IDEpOw0KLQkJYXNzZXJ0RXF1YWxzKCJUaGUgd2ViIHNlcnZpY2UgaW4gdGhlIG1vZGVsIGlzIHdpdGggZGlmZmVyZW50IG5hbWUiLCAiV2ViU2VydmljZTFTZXJ2aWNlIiwgd2ViU2VydmljZXMuZ2V0KDApLmdldE5hbWUoKSk7DQotCQlhc3NlcnRFcXVhbHMoIlRoZSB3ZWIgc2VydmljZSBpbiB0aGUgbW9kZWwgaXMgd2l0aCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24iLCAiY29tLnNhcC50ZXN0LnNtb2tlLldlYlNlcnZpY2UxIiwgd2ViU2VydmljZXMuZ2V0KDApLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJYXNzZXJ0U2FtZSgiVGhlIHNlcnZpY2UgZW5kcG9pbnQgZm91bmQgaW4gdGhlIG1vZGVsIGlzIG5vdCB0aGUgc2FtZSBpbnN0YW5jZSBhcyB0aGUgc2VpIG9mIHRoZSB3ZWIgc2VydmljZSIsIHdlYlNlcnZpY2VzLmdldCgwKS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSwgc2Vpcy5nZXQoMCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X0RvbUxvYWRlZEZvck5vUHJvY2Vzc2VkUHJvamVjdHMoKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSB0YXJnZXQgPSBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwpIA0KLQkJew0KLQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBJUHJvamVjdFNlbGVjdG9yW10gZ2V0UHJvamVjdFNlbGVjdG9ycygpDQotCQkJew0KLQkJCQlyZXR1cm4gbmV3IElQcm9qZWN0U2VsZWN0b3JbXSB7IG5ldyBJUHJvamVjdFNlbGVjdG9yKCkgDQotCQkJCXsNCi0NCi0JCQkJCXB1YmxpYyBib29sZWFuIGFwcHJvdmUoSUphdmFQcm9qZWN0IHByaikNCi0JCQkJCXsNCi0JCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCQl9DQotCQkJCX19Ow0KLQkJCX0NCi0JCQkNCi0JCX07DQotCQl0YXJnZXQubG9hZChudWxsKTsNCi0JCWFzc2VydE5vdE51bGwodGFyZ2V0LmdldERPTSgpKTsNCi0JCWFzc2VydEVxdWFscygwLCB0YXJnZXQuZ2V0RE9NKCkuZ2V0V2ViU2VydmljZVByb2plY3RzKCkuc2l6ZSgpKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBKYXhXc1dvcmtzcGFjZVJlc291cmNlIGNyZWF0ZUpheFdzV29ya3NwYWNlUmVzb3VyY2UoZmluYWwgVGVzdFByb2plY3QgdGVzdFByb2plY3QpDQotCXsNCi0JCXJldHVybiBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwpIA0KLQkJew0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBJUHJvamVjdFNlbGVjdG9yW10gZ2V0UHJvamVjdFNlbGVjdG9ycygpIA0KLQkJCXsNCi0JCQkJcmV0dXJuIG5ldyBJUHJvamVjdFNlbGVjdG9yW10ge25ldyBJUHJvamVjdFNlbGVjdG9yKCkNCi0JCQkJew0KLQkJCQkJcHVibGljIGJvb2xlYW4gYXBwcm92ZShJSmF2YVByb2plY3QgcHJqKSB7DQotCQkJCQkJcmV0dXJuIHByai5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyh0ZXN0UHJvamVjdC5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJCQkJfQ0KLQkJCQl9fTsNCi0JCQl9DQotCQl9Ow0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgY2xhc3MgTG9hZExpc3RlbmVyIGltcGxlbWVudHMgSVdzRG9tTG9hZExpc3RlbmVyDQotCXsNCi0JCWJvb2xlYW4gc3RhcnRDYWxsZWQ7DQotCQlib29sZWFuIGZpbmlzaGVkQ2FsbGVkOw0KLQkJDQotCQlwdWJsaWMgdm9pZCBmaW5pc2hlZCgpIHsNCi0JCQlmaW5pc2hlZENhbGxlZCA9IHRydWU7DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCBzdGFydGVkKCkgew0KLQkJCXN0YXJ0Q2FsbGVkID0gdHJ1ZTsNCi0JCX0NCi0JfQ0KLQkNCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL0plZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDIwYmFmMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NEb21Mb2FkTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5JV2FpdENvbmRpdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5hc3NlcnRpb25zLkFzc2VydGlvbnM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotDQotLyoqDQotICogVGVzdHMgZm9yIEplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb24NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb25UZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlIA0KLXsNCi0JcHJpdmF0ZSBKZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uIGV4dGVuc2lvbjsNCi0JDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlleHRlbnNpb24gPSBuZXcgSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbigpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RE9NQ3JlYXRlTm90Q2FsbGVkKCkgdGhyb3dzIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIA0KLQl7DQotCQlhc3NlcnROdWxsKGV4dGVuc2lvbi5nZXRET00oKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdExvYWRMaXN0ZW5lclN0YXJ0RmluaXNoQ2FsbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgTW9jazxJV3NEb21Mb2FkTGlzdGVuZXI+IGxvYWRMaXN0ZW5lck1vY2sgPSBtb2NrKElXc0RvbUxvYWRMaXN0ZW5lci5jbGFzcyk7DQotCQlsb2FkTGlzdGVuZXJNb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoInN0YXJ0ZWQiKTsNCi0JCWxvYWRMaXN0ZW5lck1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZmluaXNoZWQiKTsNCi0JCQ0KLQkJZXh0ZW5zaW9uLmFkZExvYWRMaXN0ZW5lcihsb2FkTGlzdGVuZXJNb2NrLnByb3h5KCkpOw0KLQkJZXh0ZW5zaW9uLmNyZWF0ZURPTShudWxsKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTG9hZExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgSVdzRG9tTG9hZExpc3RlbmVyIGxvYWRMaXN0ZW5lciA9IChJV3NEb21Mb2FkTGlzdGVuZXIpIG1vY2soSVdzRG9tTG9hZExpc3RlbmVyLmNsYXNzKS5wcm94eSgpOw0KLQkJZXh0ZW5zaW9uLmFkZExvYWRMaXN0ZW5lcihsb2FkTGlzdGVuZXIpOw0KLQkJZXh0ZW5zaW9uLnJlbW92ZUxvYWRMaXN0ZW5lcihsb2FkTGlzdGVuZXIpOw0KLQkJZXh0ZW5zaW9uLmNyZWF0ZURPTShudWxsKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdExvYWRDYW5jZWxlZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsNCi0JCW1vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7DQotCQkNCi0JCWZpbmFsIE1vY2s8SVdzRG9tTG9hZExpc3RlbmVyPiBsb2FkTGlzdGVuZXJNb2NrID0gbW9jayhJV3NEb21Mb2FkTGlzdGVuZXIuY2xhc3MpOw0KLQkJbG9hZExpc3RlbmVyTW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJzdGFydGVkIik7DQotCQlsb2FkTGlzdGVuZXJNb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImZpbmlzaGVkIik7DQotCQlleHRlbnNpb24gPSBuZXcgSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbigpIHsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZSgpIHsgDQotCQkJCXJldHVybiBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwoKSkgew0KLQkJCQkJQE92ZXJyaWRlDQotCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRDbmFjZWxlZCgpIHsNCi0JCQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQkJCX0NCi0JCQkJCUBPdmVycmlkZQ0KLQkJCQkJcHVibGljIHZvaWQgc3RhcnRTeW5jaHJvbml6aW5nKCkgew0KLQkJCQkJCWZhaWwoInN0YXJ0U3luY2hyb25pemluZyBzaG91bGQgbm90IGJlIGNhbGxlZCBpbiB0aGlzIGNhc2UiKTsNCi0JCQkJCX0NCi0JCQkJfTsNCi0JCQl9DQotCQl9Ow0KLQkJZXh0ZW5zaW9uLmFkZExvYWRMaXN0ZW5lcihsb2FkTGlzdGVuZXJNb2NrLnByb3h5KCkpOw0KLQkJdHJ5IHsNCi0JCQlleHRlbnNpb24uY3JlYXRlRE9NKG1vbml0b3IpOwkJDQotCQkJZmFpbCgiV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gbm90IHRocm93biBheiBleHBlY3RlZCIpOw0KLQkJfSBjYXRjaCAoV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gXykgew0KLQkJCS8vIG5vdGhpbmcgdG8gZG8gaGVyZQ0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhcnRTeW5jaHJvbml6aW5nQ2FsbGVkSWZMb2FkTm90Q2FuY2VsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCWZpbmFsIGJvb2xlYW5bXSBzdGFydFN5bmNDYWxsZWQgPSB7IGZhbHNlIH07DQotCQlleHRlbnNpb24gPSBuZXcgSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbigpIHsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZSgpIHsgDQotCQkJCXJldHVybiBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwoKSkgew0KLQkJCQkJQE92ZXJyaWRlDQotCQkJCQlwdWJsaWMgdm9pZCBzdGFydFN5bmNocm9uaXppbmcoKSB7DQotCQkJCQkJc3RhcnRTeW5jQ2FsbGVkWzBdID0gdHJ1ZTsNCi0JCQkJCX0NCi0JCQkJfTsNCi0JCQl9DQotCQl9Ow0KLQkJZXh0ZW5zaW9uLmNyZWF0ZURPTShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsNCi0JCWFzc2VydFRydWUoIlN0YXJ0IHN5bmNyb25pemF0aW9uIHdhcyBub3Qgc3RhcnRlZCBldmVuIHRoZSBsb2FkIHdhc2Egbm90IGNhbmNlbGVkIiwgc3RhcnRTeW5jQ2FsbGVkWzBdKTsNCi0JfQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVET01CbG9ja3NXaGVuQ2FsbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgYm9vbGVhbltdIGRvTG9hZFN0YXJ0ZWQgPSB7IGZhbHNlIH07DQotCQlmaW5hbCBib29sZWFuW10gZG9Mb2FkRmluaXNoZWQgPSB7IGZhbHNlIH07DQotCQlleHRlbnNpb24gPSBuZXcgSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbigpIHsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZSgpIHsgDQotCQkJCXJldHVybiBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwoKSkgew0KLQkJCQkJQE92ZXJyaWRlDQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBkb0xvYWQoZmluYWwgTWFwPD8sID8+IG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQkJCQkJZG9Mb2FkU3RhcnRlZFswXSA9IHRydWU7DQotCQkJCQkJdHJ5IHsNCi0JCQkJCQkJVGhyZWFkLnNsZWVwKDQwMCk7DQotCQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KLQkJCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOw0KLQkJCQkJCX0NCi0JCQkJCQlzdXBlci5kb0xvYWQob3B0aW9ucyk7DQotCQkJCQkJZG9Mb2FkRmluaXNoZWRbMF0gPSB0cnVlOw0KLQkJCQkJfQ0KLQkJCQl9Ow0KLQkJCX0NCi0JCX07DQotCQluZXcgVGhyZWFkKCl7DQotCQkJQE92ZXJyaWRlDQotCQkgICAgcHVibGljIHZvaWQgcnVuKCkgew0KLQkJCQl0cnkgew0KLQkJCQkJZXh0ZW5zaW9uLmNyZWF0ZURPTShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsNCi0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7DQotCQkJCX0gY2F0Y2ggKFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIGUpIHsNCi0JCQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOw0KLQkJCQl9DQotCQkgICAgfQ0KLQkJfS5zdGFydCgpOw0KLQkJQXNzZXJ0aW9ucy53YWl0QXNzZXJ0KG5ldyBJV2FpdENvbmRpdGlvbigpIHtwdWJsaWMgYm9vbGVhbiBjaGVja0NvbmRpdGlvbigpIHsNCi0JCQlyZXR1cm4gZG9Mb2FkU3RhcnRlZFswXTsNCi0JCX19LCAiTG9hZGluZyBmcm9tIGFub3RoZXIgdGhyZWFkIG5vdCBzdGFydGVkIik7DQotCQkNCi0JCWV4dGVuc2lvbi5jcmVhdGVET00obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7DQotCQlhc3NlcnRUcnVlKCJTdGFydCBzeW5jcm9uaXphdGlvbiB3YXMgbm90IHN0YXJ0ZWQgZXZlbiB0aGUgbG9hZCB3YXMgbm90IGNhbmNlbGVkIiwgZG9Mb2FkRmluaXNoZWRbMF0pOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9Qcm9qZWN0QWRkaW5nVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9Qcm9qZWN0QWRkaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGU5ODBlMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvUHJvamVjdEFkZGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RFamIzUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOw0KLQ0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0QWRkaW5nVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotCQ0KLQlwcml2YXRlIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgdGFyZ2V0Ow0KLQlwcml2YXRlIElKYXZhTW9kZWwgamF2YU1vZGVsOw0KLQlwcml2YXRlIERvbVV0aWwgdXRpbDsNCi0JcHJpdmF0ZSBUZXN0UHJvamVjdCB0ZXN0UHJqMzs7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJdXRpbCA9IG5ldyBEb21VdGlsKCk7DQotCQlqYXZhTW9kZWwgPSBKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7DQotCQl0YXJnZXQgPSBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwpOw0KLQkJdGFyZ2V0LmxvYWQobnVsbCk7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQkNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0b3BTeW5jaHJvbml6aW5nKCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfbmV3V3NQcm9qZWN0U3luY2hlZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJdGVzdFByajMgPSBuZXcgVGVzdFByb2plY3QobmV3IFRlc3RFamIzUHJvamVjdCgiVGVzdEVKQlByb2plY3QzIikuZ2V0UHJvamVjdCgpKTsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByajMgPSB1dGlsLmZpbmRQcm9qZWN0QnlOYW1lKHRhcmdldC5nZXRET00oKSwgdGVzdFByajMuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7DQotCQlhc3NlcnROb3ROdWxsKCJOZXdseSBhZGRlZCBwcm9qZWN0IG5vdCBpbiBkb20iLHdzUHJqMyk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfbmV3Tm9uV3NQcm9qZWN0Tm90QWRkZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRlc3RQcmozID0gbmV3IFRlc3RQcm9qZWN0KCJUZXN0UHJvamVjdDMiKTsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByajMgPSB1dGlsLmZpbmRQcm9qZWN0QnlOYW1lKHRhcmdldC5nZXRET00oKSwgdGVzdFByajMuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7DQotCQlhc3NlcnROdWxsKCJOZXdseSBhZGRlZCBwcm9qZWN0IGluIGRvbSIsd3NQcmozKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9Ob25Xc1Byb2plY3RJZ25vcnJlZFdoZW5DbG9zZWRPclJlbW92ZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQl0ZXN0UHJqMyA9IG5ldyBUZXN0UHJvamVjdCgiVGVzdFByb2plY3QzIik7DQotCQl0ZXN0UHJqMy5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwZiA9IHRlc3RQcmozLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5ub253c3Byb2plY3QiKTsNCi0JCWZpbmFsIElUeXBlIHR5cGUgPSB0ZXN0UHJqMy5jcmVhdGVUeXBlKHBmLCAiU29tZUNsYXNzLmphdmEiLCAicHVibGljIGNsYXNzIFNvbWVDbGFzcyB7fSIpOw0KLQkJZmluYWwgSUZpbGUgZmlsZSA9IHRlc3RQcmozLmdldEphdmFQcm9qZWN0KCkuZ2V0SmF2YU1vZGVsKCkuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUodHlwZS5nZXRQYXRoKCkpOw0KLQkJSURFLm9wZW5FZGl0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCksIGZpbGUpOw0KLQkJdGVzdFByajMuZ2V0UHJvamVjdCgpLmNsb3NlKG51bGwpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X29wZW5lZE5vbldzUHJvamVjdE5vdEFkZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQl0ZXN0UHJqMyA9IG5ldyBUZXN0UHJvamVjdCgiVGVzdEVKQlByb2plY3QzIik7DQotCQl0ZXN0UHJqMy5nZXRQcm9qZWN0KCkuY2xvc2UobnVsbCk7DQotCQl0ZXN0UHJqMy5nZXRQcm9qZWN0KCkub3BlbihudWxsKTsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByajMgPSB1dGlsLmZpbmRQcm9qZWN0QnlOYW1lKHRhcmdldC5nZXRET00oKSwgdGVzdFByajMuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7DQotCQlhc3NlcnROdWxsKCJOZXdseSBhZGRlZCBwcm9qZWN0IG5vdCBpbiBkb20iLHdzUHJqMyk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL1dvcmtzcGFjZUNVRmluZGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL1dvcmtzcGFjZUNVRmluZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MWE4MjRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9Xb3Jrc3BhY2VDVUZpbmRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQ29tcGlsYXRpb25Vbml0RmluZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JUHJvamVjdFNlbGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV29ya3NwYWNlQ1VGaW5kZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0Ow0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBXb3Jrc3BhY2VDVUZpbmRlclRlc3QgZXh0ZW5kcyBDb21waWxhdGlvblVuaXRGaW5kZXJDb250cmFjdFRlc3QNCi17DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdEZpbmRlciBjcmVhdGVUYXJnZXQoKQ0KLQl7DQotCQlmaW5hbCBJUHJvamVjdFNlbGVjdG9yW10gcHMgPSBuZXcgSVByb2plY3RTZWxlY3Rvcltwcm9qZWN0U2VsZWN0b3JzKCkuc2l6ZSgpXTsNCi0JCXByb2plY3RTZWxlY3RvcnMoKS50b0FycmF5KHBzKTsNCi0JCXJldHVybiBuZXcgV29ya3NwYWNlQ1VGaW5kZXIoamF2YU1vZGVsKCksIHBzKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFByb2dyZXNzTW9uaXRvclVwZGF0ZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24NCi0Jew0KLQkJTW9jazxJUHJvZ3Jlc3NNb25pdG9yPiBtb25pdG9yID0gbW9jayhJUHJvZ3Jlc3NNb25pdG9yLmNsYXNzKTsNCi0JCW1vbml0b3Iuc3R1YnMoKS5tZXRob2QoImlzQ2FuY2VsZWQiKS53aWxsKHJldHVyblZhbHVlKGZhbHNlKSk7DQotCQltb25pdG9yLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImJlZ2luVGFzayIpOw0KLQkJbW9uaXRvci5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJkb25lIik7DQotCQltb25pdG9yLmV4cGVjdHMoZXhhY3RseSgyKSkubWV0aG9kKCJ3b3JrZWQiKTsNCi0JCQ0KLQkJSUNvbXBpbGF0aW9uVW5pdEZpbmRlciBjdUZpbmRlciA9IHNldFVwRm9yUHJvZ3Jlc3NNb25pdG9yVGVzdHMoKTsNCi0JCU1vY2s8SUNvbXBpbGF0aW9uVW5pdEhhbmRsZXI+IGN1SGFuZGxlciA9IG1vY2soSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXIuY2xhc3MpOw0KLQkJY3VIYW5kbGVyLnN0dWJzKCkubWV0aG9kKCJoYW5kbGUiKTsNCi0JCWN1SGFuZGxlci5zdHVicygpLm1ldGhvZCgic3RhcnRlZCIpOw0KLQkJY3VIYW5kbGVyLnN0dWJzKCkubWV0aG9kKCJmaW5pc2hlZCIpOw0KLQkJDQotCQljdUZpbmRlci5maW5kKG1vbml0b3IucHJveHkoKSwgY3VIYW5kbGVyLnByb3h5KCkpOwkJDQotCX0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q25hY2VsYXRpb25SZXF1ZXN0c1Byb2Nlc3NlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCU1vY2s8SVByb2dyZXNzTW9uaXRvcj4gbW9uaXRvciA9IG1vY2soSVByb2dyZXNzTW9uaXRvci5jbGFzcyk7DQotCQltb25pdG9yLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImJlZ2luVGFzayIpOw0KLQkJbW9uaXRvci5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJkb25lIik7CQkNCi0JCW1vbml0b3IuZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiaXNDYW5jZWxlZCIpLndpbGwocmV0dXJuVmFsdWUodHJ1ZSkpOw0KLQkJDQotCQlJQ29tcGlsYXRpb25Vbml0RmluZGVyIGN1RmluZGVyID0gc2V0VXBGb3JQcm9ncmVzc01vbml0b3JUZXN0cygpOw0KLQkJTW9jazxJQ29tcGlsYXRpb25Vbml0SGFuZGxlcj4gY3VIYW5kbGVyID0gbW9jayhJQ29tcGlsYXRpb25Vbml0SGFuZGxlci5jbGFzcyk7DQotCQljdUhhbmRsZXIuc3R1YnMoKS5tZXRob2QoImhhbmRsZSIpOw0KLQkJY3VIYW5kbGVyLnN0dWJzKCkubWV0aG9kKCJzdGFydGVkIik7DQotCQkNCi0JCXRyeSB7DQotCQkJY3VGaW5kZXIuZmluZChtb25pdG9yLnByb3h5KCksIGN1SGFuZGxlci5wcm94eSgpKTsNCi0JCQlmYWlsKCJTeW5jaHJvbml6YXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiBlKSB7DQotCQkJLy8gZXhwZWN0ZWQNCi0JCX0JDQotCX0NCi0JDQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdEZpbmRlciBzZXRVcEZvclByb2dyZXNzTW9uaXRvclRlc3RzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgVGVzdFByb2plY3QgcHJvamVjdDEgPSBuZXcgVGVzdFByb2plY3QoKTsNCi0JCXByb2plY3QxLmNyZWF0ZVNvdXJjZUZvbGRlcigic3JjIik7DQotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IHBmMSA9IHByb2plY3QxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdCIpOw0KLQkJcHJvamVjdDEuY3JlYXRlVHlwZShwZjEsICJDdTEuamF2YSIsICJjbGFzcyBDdTEge30iKTsNCi0JCXByb2plY3QxLmNyZWF0ZVR5cGUocGYxLCAiQ3UyLmphdmEiLCAiY2xhc3MgQ3UyIHt9Iik7DQotCQkNCi0JCUlQcm9qZWN0U2VsZWN0b3IgW10gc2xlY3RvcnMgPSBuZXcgSVByb2plY3RTZWxlY3RvcltdIHsNCi0JCQkJbmV3IElQcm9qZWN0U2VsZWN0b3IoKSB7DQotCQkJCQlwdWJsaWMgYm9vbGVhbiBhcHByb3ZlKElKYXZhUHJvamVjdCBwcmopIHsNCi0JCQkJCQlyZXR1cm4gcHJvamVjdDEuZ2V0UHJvamVjdCgpLmdldE5hbWUoKS5lcXVhbHMocHJqLmdldFByb2plY3QoKS5nZXROYW1lKCkpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQl9Ow0KLQkJCQkNCi0JCXJldHVybiBuZXcgV29ya3NwYWNlQ1VGaW5kZXIoamF2YU1vZGVsKCksIHNsZWN0b3JzKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uQWRhcHRlckZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uQWRhcHRlckZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzZTU2OTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLmFubm90YXRpb247DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLklBbm5vdGF0aW9uQWRhcHRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIA0KLXsNCi0JcHVibGljIHZvaWQgdGVzdElzRmFjdG9yeUZvclR5cGVPYmplY3QoKSANCi0Jew0KLQkJYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuaXNGYWN0b3J5Rm9yVHlwZShJQW5ub3RhdGlvbkFkYXB0ZXIuY2xhc3MpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQWRhcHRlcigpIA0KLQl7DQotCQlJV2ViU2VydmljZSB3cyA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotCQlBbm5vdGF0aW9uQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQod3MsIElBbm5vdGF0aW9uQWRhcHRlci5jbGFzcyk7DQotCQlBZGFwdGVyIGFkYXB0ZXIgPSB3cy5lQWRhcHRlcnMoKS5nZXQoMCk7DQotCQlhc3NlcnROb3ROdWxsKGFkYXB0ZXIpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyIGluc3RhbmNlb2YgSUFubm90YXRpb25BZGFwdGVyKTsNCi0JCQ0KLQkJQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdzLCBJQW5ub3RhdGlvbkFkYXB0ZXIuY2xhc3MpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzLmVBZGFwdGVycygpLnNpemUoKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vaW1wbC9BYnN0cmFjdExvY2F0b3JzVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vaW1wbC9BYnN0cmFjdExvY2F0b3JzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNWUxOTZhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL2ltcGwvQWJzdHJhY3RMb2NhdG9yc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLmltcGw7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotcHVibGljIGNsYXNzIEFic3RyYWN0TG9jYXRvcnNUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlIA0KLXsNCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfT0ZGU0VUID0gMTA7DQotCQ0KLQlwcm90ZWN0ZWQgTW9jazxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb247DQotCXByb3RlY3RlZCBJUGFyYW1WYWx1ZVBhaXIgcGFyYW0xOw0KLQlwcm90ZWN0ZWQgSVBhcmFtVmFsdWVQYWlyIHBhcmFtMjsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpDQotCXsNCi0JCWFubm90YXRpb24gPSBtb2NrKElBbm5vdGF0aW9uLmNsYXNzKTsNCi0JCWFubm90YXRpb24uc3R1YnMoKS5tZXRob2QoImdldExvY2F0b3IiKS53aWxsKHJldHVyblZhbHVlKGNyZWF0ZUxvY2F0b3IoMSwgMTEpKSk7DQotCQkNCi0JCXBhcmFtMSA9IGNyZWF0ZVBhcmFtVmFsdWUoInBhcmFtMSIsIDIxLCAzMSk7DQotCQlwYXJhbTIgPSBjcmVhdGVQYXJhbVZhbHVlKCJwYXJhbTIiLCAyMiwgMzIpOw0KLQkJDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYWlycyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXBhaXJzLmFkZChwYXJhbTEpOw0KLQkJcGFpcnMuYWRkKHBhcmFtMik7DQotCQlhbm5vdGF0aW9uLnN0dWJzKCkubWV0aG9kKCJnZXRQYXJhbVZhbHVlUGFpcnMiKS53aWxsKHJldHVyblZhbHVlKHBhaXJzKSk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJUGFyYW1WYWx1ZVBhaXIgY3JlYXRlUGFyYW1WYWx1ZShTdHJpbmcgbmFtZSwgaW50IHN0YXJ0UG9zLCBpbnQgbGVuZ2h0KQ0KLQl7DQotCQlNb2NrPElQYXJhbVZhbHVlUGFpcj4gcGFyYW0gPSBtb2NrKElQYXJhbVZhbHVlUGFpci5jbGFzcyk7DQotCQlwYXJhbS5zdHVicygpLm1ldGhvZCgiZ2V0UGFyYW0iKS53aWxsKHJldHVyblZhbHVlKG5hbWUpKTsNCi0JCXBhcmFtLnN0dWJzKCkubWV0aG9kKCJnZXRMb2NhdG9yIikud2lsbChyZXR1cm5WYWx1ZShjcmVhdGVMb2NhdG9yKHN0YXJ0UG9zLCBsZW5naHQpKSk7DQotCQlNb2NrPElWYWx1ZT4gdmFsdWUgPSBtb2NrKElWYWx1ZS5jbGFzcyk7DQotCQl2YWx1ZS5zdHVicygpLm1ldGhvZCgiZ2V0TG9jYXRvciIpLndpbGwocmV0dXJuVmFsdWUoY3JlYXRlTG9jYXRvcihzdGFydFBvcyArIFZBTFVFX09GRlNFVCwgbGVuZ2h0ICsgVkFMVUVfT0ZGU0VUKSkpOw0KLQkJcGFyYW0uc3R1YnMoKS5tZXRob2QoImdldFZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSh2YWx1ZS5wcm94eSgpKSk7CQkNCi0JCQ0KLQkJcmV0dXJuIHBhcmFtLnByb3h5KCk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIElMb2NhdG9yIGNyZWF0ZUxvY2F0b3IoaW50IHN0YXJ0UG9zLCBpbnQgbGVuZ3RoKQ0KLQl7DQotCQlNb2NrPElMb2NhdG9yPiBsb2NhdG9yID0gbW9jayhJTG9jYXRvci5jbGFzcyk7DQotCQlsb2NhdG9yLnN0dWJzKCkubWV0aG9kKCJnZXRMZW5ndGgiKS53aWxsKHJldHVyblZhbHVlKGxlbmd0aCkpOw0KLQkJbG9jYXRvci5zdHVicygpLm1ldGhvZCgiZ2V0U3RhcnRQb3NpdGlvbiIpLndpbGwocmV0dXJuVmFsdWUoc3RhcnRQb3MpKTsNCi0JCQ0KLQkJcmV0dXJuIGxvY2F0b3IucHJveHkoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvYW5ub3RhdGlvbi9pbXBsL0Fubm90YXRpb25BZGFwdGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vaW1wbC9Bbm5vdGF0aW9uQWRhcHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmU1MTk3My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvYW5ub3RhdGlvbi9pbXBsL0Fubm90YXRpb25BZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLmFubm90YXRpb24uaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5JQW5ub3RhdGlvbkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLmltcGwuQW5ub3RhdGlvbkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5TQkFubm90YXRpb25GZWF0dXJlcy5TQl9BTk5PVEFUSU9OOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT047DQotDQotDQotcHVibGljIGNsYXNzIEFubm90YXRpb25BZGFwdGVyVGVzdCBleHRlbmRzIEFic3RyYWN0TG9jYXRvcnNUZXN0IA0KLXsNCi0NCi0JcHJpdmF0ZSBBbm5vdGF0aW9uQWRhcHRlciBhZGFwdGVyOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHNldFVwKCkNCi0Jew0KLQkJc3VwZXIuc2V0VXAoKTsNCi0JCWFkYXB0ZXIgPSBuZXcgQW5ub3RhdGlvbkFkYXB0ZXIoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkR2V0QW5ub3RhdGlvbkxvY2F0aW9ucygpIA0KLQl7DQotCQlhZGFwdGVyLmFkZEFubm90YXRpb24oV1NfQU5OT1RBVElPTiwgYW5ub3RhdGlvbi5wcm94eSgpKTsNCi0JCWFubm90YXRpb24uc3R1YnMoKS5tZXRob2QoImdldExvY2F0b3IiKS53aWxsKHJldHVyblZhbHVlKGNyZWF0ZUxvY2F0b3IoMTAwLCAxMTApKSk7DQotCQlhZGFwdGVyLmFkZEFubm90YXRpb24oU0JfQU5OT1RBVElPTiwgYW5ub3RhdGlvbi5wcm94eSgpKTsNCi0JCUlBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSBhZGFwdGVyLmdldEFubm90YXRpb24oV1NfQU5OT1RBVElPTik7DQotCQlhc3NlcnROb3ROdWxsKCJBbm5vdGF0aW9uIGFkYXB0ZXIgbm90IGFkZGVkIiwgYW5ub3RhdGlvbik7DQotCQlhc3NlcnRFcXVhbHMoMTAwLCBhbm5vdGF0aW9uLmdldExvY2F0b3IoKS5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJDQotCQlhbm5vdGF0aW9uID0gYWRhcHRlci5nZXRBbm5vdGF0aW9uKFNCX0FOTk9UQVRJT04pOw0KLQkJYXNzZXJ0Tm90TnVsbCgiQW5ub3RhdGlvbiBhZGFwdGVyIG5vdCBhZGRlZCIsIGFubm90YXRpb24pOw0KLQkJYXNzZXJ0RXF1YWxzKDEwMCwgYW5ub3RhdGlvbi5nZXRMb2NhdG9yKCkuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJDQotCQlhZGFwdGVyLmFkZEFubm90YXRpb24oV1NfQU5OT1RBVElPTiwgbnVsbCk7DQotCQlhbm5vdGF0aW9uPSBhZGFwdGVyLmdldEFubm90YXRpb24oV1NfQU5OT1RBVElPTik7DQotCQlhc3NlcnROdWxsKCJBbm5vdGF0aW9uIGFkYXB0ZXIgbm90IGNsZWFyZWQiLCBhbm5vdGF0aW9uKTsJCQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RJc0FkYXB0ZXJGb3JUeXBlKCkgDQotCXsNCi0JCWFzc2VydFRydWUoIkFkYXB0ZXIgcmVwb3J0cyB0aGF0IGl0IGlzIG5vdCBmb3IgSUxvY2F0b3JBZGFwdGVyIiwgYWRhcHRlci5pc0FkYXB0ZXJGb3JUeXBlKElBbm5vdGF0aW9uQWRhcHRlci5jbGFzcykpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9NZXRob2RQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9NZXRob2RQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzhmNzFlOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvZGVmYXVsdHMvTWV0aG9kUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuZGVmYXVsdHM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eURlZmF1bHRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuZGVmYXVsdHMuTWV0aG9kUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5kZWZhdWx0cy5Qcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3Rvcnk7DQotDQotLyoqDQotICogVGVzdHMgZm9yIG1ldGhvZCBkZWZhdWx0IHZhbHVlcyBhZGFwdGVyDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNZXRob2RQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCXByaXZhdGUgSVdlYk1ldGhvZCB3ZWJNZXRob2Q7DQotCXByaXZhdGUgSVByb3BlcnR5RGVmYXVsdHMgZGVmYXVsdHM7DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIA0KLQl7DQotCQl3ZWJNZXRob2QgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViTWV0aG9kKCk7DQotCQl3ZWJNZXRob2QuZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCAibXlNZXRob2QoKSIpOw0KLQkJZGVmYXVsdHMgPSAoSVByb3BlcnR5RGVmYXVsdHMpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdlYk1ldGhvZCwgSVByb3BlcnR5RGVmYXVsdHMuY2xhc3MpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kTmFtZSgpIA0KLQl7DQotCQlhc3NlcnRFcXVhbHMoIm15TWV0aG9kIiwgZGVmYXVsdHMuZ2V0RGVmYXVsdChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEFkYXB0ZWRPbmNlKCkNCi0Jew0KLQkJSVByb3BlcnR5RGVmYXVsdHMgYWRhcHRlciA9IChJUHJvcGVydHlEZWZhdWx0cylQcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQod2ViTWV0aG9kLCBJUHJvcGVydHlEZWZhdWx0cy5jbGFzcyk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIgaW5zdGFuY2VvZiBNZXRob2RQcm9wZXJ0eURlZmF1bHRzQWRhcHRlcik7DQotCQlhc3NlcnRFcXVhbHMoMSwgd2ViTWV0aG9kLmVBZGFwdGVycygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoZGVmYXVsdHMsIGFkYXB0ZXIpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9QYXJhbWV0ZXJQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9QYXJhbWV0ZXJQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWEyNjdmOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvZGVmYXVsdHMvUGFyYW1ldGVyUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLmRlZmF1bHRzOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlEZWZhdWx0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuZGVmYXVsdHMuUGFyYW1ldGVyUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5kZWZhdWx0cy5Qcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3Rvcnk7DQotDQotLyoqDQotICogVGVzdHMgZm9yIHtAbGluayBJV2ViUGFyYW19IHByb3BlcnRpZXMgZGVmYXVsdCB2YWx1ZXMNCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFBhcmFtZXRlclByb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIA0KLXsNCi0JcHJpdmF0ZSBJV2ViTWV0aG9kIHdlYk1ldGhvZDsNCi0JcHJpdmF0ZSBJV2ViUGFyYW0gd2ViUGFyYW07DQotCXByaXZhdGUgSVByb3BlcnR5RGVmYXVsdHMgZGVmYXVsdHM7DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIA0KLQl7DQotCQl3ZWJNZXRob2QgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViTWV0aG9kKCk7DQotCQl3ZWJNZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UKTsNCi0JCXdlYk1ldGhvZC5zZXRTb2FwQmluZGluZ1VzZShTT0FQQmluZGluZ1VzZS5MSVRFUkFMKTsNCi0JCXdlYk1ldGhvZC5zZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCk7DQotCQkNCi0JCXdlYlBhcmFtID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlBhcmFtKCk7DQotCQl3ZWJQYXJhbS5lU2V0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sICJteVBhcmFtIik7DQotCQkNCi0JCUlXZWJQYXJhbSBkdW1teSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJQYXJhbSgpOw0KLQkJZHVtbXkuZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCAiZHVtbXkiKTsNCi0JCQ0KLQkJd2ViTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5hZGQoZHVtbXkpOw0KLQkJd2ViTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5hZGQod2ViUGFyYW0pOw0KLQkJDQotCQlkZWZhdWx0cyA9IChJUHJvcGVydHlEZWZhdWx0cylQcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQod2ViUGFyYW0sIElQcm9wZXJ0eURlZmF1bHRzLmNsYXNzKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdE5hbWVEZWZhdWx0VmFsdWUoKSANCi0Jew0KLQkJd2ViUGFyYW0uc2V0TmFtZSgidGVzdCIpOw0KLQkJYXNzZXJ0RXF1YWxzKCJhcmcxIiwgZGVmYXVsdHMuZ2V0RGVmYXVsdChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFBhcnROYW1lRGVmYXVsdFZhbHVlKCkNCi0Jew0KLQkJd2ViUGFyYW0uc2V0UGFydE5hbWUoInRlc3QiKTsNCi0JCWFzc2VydEVxdWFscygiYXJnMSIsIGRlZmF1bHRzLmdldERlZmF1bHQoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19QQVJUX05BTUUpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFBhcnROYW1lTWV0aG9kUGFyYW1TdHlsZUJhcmUoKQ0KLQl7DQotCQl3ZWJNZXRob2Quc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUpOw0KLQkJd2ViTWV0aG9kLnNldE5hbWUoInRlc3QiKTsNCi0JCWFzc2VydEVxdWFscygidGVzdCIsIGRlZmF1bHRzLmdldERlZmF1bHQoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXROU0RlZmF1bHRWYWx1ZSgpDQotCXsNCi0JCXdlYlBhcmFtLnNldFRhcmdldE5hbWVzcGFjZSgidGVzdCIpOw0KLQkJYXNzZXJ0RXF1YWxzKCIiLCBkZWZhdWx0cy5nZXREZWZhdWx0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0TlNQYXJhbUluSGVhZGVyRGVmYXVsdFZhbHVlKCkNCi0Jew0KLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotCQlzZWkuc2V0VGFyZ2V0TmFtZXNwYWNlKCJodHRwOi8vdGVzdCIpOw0KLQkJDQotCQlzZWkuZ2V0V2ViTWV0aG9kcygpLmFkZCh3ZWJNZXRob2QpOw0KLQkJDQotCQl3ZWJQYXJhbS5zZXRIZWFkZXIodHJ1ZSk7DQotCQlhc3NlcnRFcXVhbHMoImh0dHA6Ly90ZXN0IiwgZGVmYXVsdHMuZ2V0RGVmYXVsdChEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UpKTsJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RIZWFkZXJEZWZhdWx0VmFsdWUoKQ0KLQl7DQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRzLmdldERlZmF1bHQoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19IRUFERVIpKTsJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RLaW5kRGVmYXVsdFZhbHVlKCkgDQotCXsNCi0JCWFzc2VydEVxdWFscyhXZWJQYXJhbUtpbmQuSU4sIGRlZmF1bHRzLmdldERlZmF1bHQoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19LSU5EKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RBZGFwdGVkT25jZSgpDQotCXsNCi0JCUlQcm9wZXJ0eURlZmF1bHRzIGFkYXB0ZXIgPSAoSVByb3BlcnR5RGVmYXVsdHMpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdlYlBhcmFtLCBJUHJvcGVydHlEZWZhdWx0cy5jbGFzcyk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIgaW5zdGFuY2VvZiBQYXJhbWV0ZXJQcm9wZXJ0eURlZmF1bHRzQWRhcHRlcik7DQotCQkNCi0JCWFzc2VydEVxdWFscygxLCB3ZWJQYXJhbS5lQWRhcHRlcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKGRlZmF1bHRzLCBhZGFwdGVyKTsNCi0JfQkNCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1NlaVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1NlaVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNjQ5YTk5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9TZWlQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5kZWZhdWx0czsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5RGVmYXVsdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5kZWZhdWx0cy5Qcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5kZWZhdWx0cy5TZWlQcm9wZXJ0eURlZmF1bHRzQWRhcHRlcjsNCi0NCi0vKioNCi0gKiBUZXN0cyBmb3Ige0BsaW5rIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2V9IGRlZmF1bHQgcHJvcGVydGllcyB2YWx1ZXMgDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZWlQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCXByaXZhdGUgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWk7DQotCXByaXZhdGUgSVByb3BlcnR5RGVmYXVsdHMgZGVmYXVsdHM7DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpDQotCXsNCi0JCXNlaSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0JCXNlaS5lU2V0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sICJjb20uc2FwLnRlc3QuU2VpIik7DQotCQlkZWZhdWx0cyA9IChJUHJvcGVydHlEZWZhdWx0cylQcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQoc2VpLCBJUHJvcGVydHlEZWZhdWx0cy5jbGFzcyk7CQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdE5hbWVEZWZhdWx0VmFsdWUoKQ0KLQl7DQotCQlzZWkuc2V0TmFtZSgiVGVzdCIpOw0KLQkJYXNzZXJ0RXF1YWxzKCJTZWkiLCBkZWZhdWx0cy5nZXREZWZhdWx0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOwkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFRhcmdldE5hbWVzcGFjZURlZmF1bHRWYWx1ZSgpDQotCXsNCi0JCXNlaS5zZXRUYXJnZXROYW1lc3BhY2UoInRlc3QiKTsNCi0JCWFzc2VydEVxdWFscygiaHR0cDovL3NhcC5jb20vdGVzdC8iLCAgZGVmYXVsdHMuZ2V0RGVmYXVsdChEb21QYWNrYWdlLkxpdGVyYWxzLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRhcHRlZE9uY2UoKQ0KLQl7DQotCQlJUHJvcGVydHlEZWZhdWx0cyBhZGFwdGVyID0gKElQcm9wZXJ0eURlZmF1bHRzKVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChzZWksIElQcm9wZXJ0eURlZmF1bHRzLmNsYXNzKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlciBpbnN0YW5jZW9mIFNlaVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyKTsNCi0JCWFzc2VydEVxdWFscygxLCBzZWkuZUFkYXB0ZXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscyhkZWZhdWx0cywgYWRhcHRlcik7DQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9Xc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1dzUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0ODJmNDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1dzUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuZGVmYXVsdHM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eURlZmF1bHRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmRlZmF1bHRzLlByb3BlcnR5RGVmYXVsdHNBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmRlZmF1bHRzLldzUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXI7DQotDQotLyoqDQotICogVGVzdHMgZm9yIHtAbGluayBJV2ViU2VydmljZX0gZGVmYXVsdCB2YWx1ZXMgY2FsY3VsYXRpb24NCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFdzUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UNCi17DQotCXByaXZhdGUgSVdlYlNlcnZpY2Ugd2ViU2VydmljZTsNCi0JcHJpdmF0ZSBJUHJvcGVydHlEZWZhdWx0cyBkZWZhdWx0czsNCi0JDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgew0KLQkJd2ViU2VydmljZSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotCQl3ZWJTZXJ2aWNlLmVTZXQoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiwgImNvbS5zYXAudGVzdC5NeVdzIik7DQotCQlkZWZhdWx0cyA9IChJUHJvcGVydHlEZWZhdWx0cylQcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQod2ViU2VydmljZSwgSVByb3BlcnR5RGVmYXVsdHMuY2xhc3MpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lRGVmYXVsdFZhbHVlKCkNCi0Jew0KLQkJd2ViU2VydmljZS5zZXROYW1lKCJUZXN0Iik7DQotCQlhc3NlcnRFcXVhbHMoIk15V3NTZXJ2aWNlIiwgZGVmYXVsdHMuZ2V0RGVmYXVsdChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFBvcnROYW1lRGVmYXVsdFZhbHVlKCkNCi0Jew0KLQkJd2ViU2VydmljZS5zZXRQb3J0TmFtZSgiVGVzdFBvcnROYW1lIik7DQotCQlhc3NlcnRFcXVhbHMoIk15V3NQb3J0IiwgIGRlZmF1bHRzLmdldERlZmF1bHQoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0TmFtZXNwYWNlRGVmYXVsdFZhbHVlKCkNCi0Jew0KLQkJd2ViU2VydmljZS5zZXRUYXJnZXROYW1lc3BhY2UoInRlc3QiKTsNCi0JCWFzc2VydEVxdWFscygiaHR0cDovL3NhcC5jb20vdGVzdC8iLCAgZGVmYXVsdHMuZ2V0RGVmYXVsdChEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfU0VSVklDRV9fVEFSR0VUX05BTUVTUEFDRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRhcHRlZE9uY2UoKQ0KLQl7DQotCQlJUHJvcGVydHlEZWZhdWx0cyBhZGFwdGVyID0gKElQcm9wZXJ0eURlZmF1bHRzKVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdCh3ZWJTZXJ2aWNlLCBJUHJvcGVydHlEZWZhdWx0cy5jbGFzcyk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIgaW5zdGFuY2VvZiBXc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyKTsNCi0JCWFzc2VydEVxdWFscygxLCB3ZWJTZXJ2aWNlLmVBZGFwdGVycygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoZGVmYXVsdHMsIGFkYXB0ZXIpOw0KLQl9CQkNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL0Fic3RyYWN0U2VyaWFsaXplckFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI3YTMwYmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQW5ub3RhdGlvblNlcmlhbGl6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplci5BYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplci5Xc1NlcmlhbGl6ZXJBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2s7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLQ0KLS8qKg0KLSAqIFRlc3RzIGZvciB7QGxpbmsgV3NTZXJpYWxpemVyQWRhcHRlcn0gY2xhc3MuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyVGVzdCBleHRlbmRzIE1vY2tPYmplY3RUZXN0Q2FzZSANCi17DQotCXByaXZhdGUgVGVzdFdzU2VyaWFsaXplckFkYXB0ZXIgYWRhcHRlcjsNCi0JcHJpdmF0ZSBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlOyANCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpDQotCXsNCi0JCU1vY2s8SUphdmFNb2RlbD4gamF2YU1vZGVsTW9jayA9IG1vY2soSUphdmFNb2RlbC5jbGFzcyk7DQotCQlyZXNvdXJjZSA9IG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKGphdmFNb2RlbE1vY2sucHJveHkoKSk7DQotCQlhZGFwdGVyID0gbmV3IFRlc3RXc1NlcmlhbGl6ZXJBZGFwdGVyKG51bGwsIGZhbHNlKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFdzU2VyaWFsaXplckFkYXB0ZXIoKSANCi0Jew0KLQkJdHJ5IHsNCi0JCQluZXcgV3NTZXJpYWxpemVyQWRhcHRlcihudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBfKSB7DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3ROb3RpZnlDaGFuZ2VkTm90aWZpY2F0aW9uRWRpdEVuYWJsZWRPblNldCgpIA0KLQl7DQotCQlyZXNvdXJjZS5lbmFibGVTYXZpbmcoKTsNCi0JCU1vY2s8Tm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25Nb2NrID0gbW9jayhOb3RpZmljYXRpb24uY2xhc3MpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJpc1RvdWNoIikud2lsbChyZXR1cm5WYWx1ZShmYWxzZSkpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5zdHVicygpLm1ldGhvZCgiZ2V0RXZlbnRUeXBlIikud2lsbChyZXR1cm5WYWx1ZShOb3RpZmljYXRpb24uU0VUKSk7DQotCQkNCi0JCWFkYXB0ZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb25Nb2NrLnByb3h5KCkpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyLnNhdmVDYWxsZWQpOwkJDQotCX0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm90aWZ5Q2hhbmdlZE5vdGlmaWNhdGlvbkVkaXRFbmFibGVkT25VbnNldCgpIA0KLQl7DQotCQlyZXNvdXJjZS5lbmFibGVTYXZpbmcoKTsNCi0JCU1vY2s8Tm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25Nb2NrID0gbW9jayhOb3RpZmljYXRpb24uY2xhc3MpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJpc1RvdWNoIikud2lsbChyZXR1cm5WYWx1ZShmYWxzZSkpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5zdHVicygpLm1ldGhvZCgiZ2V0RXZlbnRUeXBlIikud2lsbChyZXR1cm5WYWx1ZShOb3RpZmljYXRpb24uVU5TRVQpKTsNCi0JCQ0KLQkJYWRhcHRlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbk1vY2sucHJveHkoKSk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIuc2F2ZUNhbGxlZCk7CQkNCi0JfQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3ROb3RpZnlDaGFuZ2VkTm90aWZpY2F0aW9uRWRpdEVuYWJsZWRPbkFkZCgpIA0KLQl7DQotCQlyZXNvdXJjZS5lbmFibGVTYXZpbmcoKTsNCi0JCU1vY2s8Tm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25Nb2NrID0gbW9jayhOb3RpZmljYXRpb24uY2xhc3MpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJpc1RvdWNoIikud2lsbChyZXR1cm5WYWx1ZShmYWxzZSkpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5zdHVicygpLm1ldGhvZCgiZ2V0RXZlbnRUeXBlIikud2lsbChyZXR1cm5WYWx1ZShOb3RpZmljYXRpb24uQUREKSk7DQotCQkNCi0JCWFkYXB0ZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb25Nb2NrLnByb3h5KCkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5zYXZlQ2FsbGVkKTsJCQ0KLQl9CQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3ROb3RpZnlDaGFuZ2VkTm90aWZpY2F0aW9uT2JqZWN0VG91Y2hlZCgpIA0KLQl7DQotCQlyZXNvdXJjZS5lbmFibGVTYXZpbmcoKTsNCi0JCU1vY2s8Tm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25Nb2NrID0gbW9jayhOb3RpZmljYXRpb24uY2xhc3MpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJpc1RvdWNoIikud2lsbChyZXR1cm5WYWx1ZSh0cnVlKSk7DQotCQlhZGFwdGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uTW9jay5wcm94eSgpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuc2F2ZUNhbGxlZCk7CQkNCi0JfQkJDQotDQotCXB1YmxpYyB2b2lkIHRlc3ROb3RpZnlDaGFuZ2VkTm90aWZpY2F0aW9uRWRpdERpc2FibGVkKCkgDQotCXsNCi0JCXJlc291cmNlLmRpc2FibGVTYXZpbmcoKTsNCi0JCU1vY2s8Tm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25Nb2NrID0gbW9jayhOb3RpZmljYXRpb24uY2xhc3MpOw0KLQkJYWRhcHRlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbk1vY2sucHJveHkoKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLnNhdmVDYWxsZWQpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDaGVja1N0cmluZ1ZhbHVlKCkNCi0Jew0KLQkJSVdlYlNlcnZpY2Ugd3MgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpOw0KLQkJVGVzdFdzU2VyaWFsaXplckFkYXB0ZXIgYWRhcHRlciA9IG5ldyBUZXN0V3NTZXJpYWxpemVyQWRhcHRlcih3cywgdHJ1ZSk7DQotCQkNCi0JCU1vY2s8Tm90aWZpY2F0aW9uPiBtc2cgPSBtb2NrKE5vdGlmaWNhdGlvbi5jbGFzcyk7DQotCQltc2cuc3R1YnMoKS5tZXRob2QoImdldEZlYXR1cmUiKS53aWxsKHJldHVyblZhbHVlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOw0KLQkJbXNnLnN0dWJzKCkubWV0aG9kKCJnZXRPbGRTdHJpbmdWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoIm9sZFZhbHVlIikpOw0KLQkJbXNnLnN0dWJzKCkubWV0aG9kKCJnZXROZXdTdHJpbmdWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoIm5ld1ZhbHVlIikpOwkJDQotCQkNCi0JCWFzc2VydFRydWUoYWRhcHRlci5jaGVja1ZhbHVlKG1zZy5wcm94eSgpKSk7DQotCQlhc3NlcnRFcXVhbHMoIm5ld1ZhbHVlIiwgd3MuZ2V0TmFtZSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENoZWNrU3RyaW5nVmFsdWVJbnZhbGlkVmFsdWVzKCkNCi0Jew0KLQkJSVdlYlNlcnZpY2Ugd3MgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpOw0KLQkJVGVzdFdzU2VyaWFsaXplckFkYXB0ZXIgYWRhcHRlciA9IG5ldyBUZXN0V3NTZXJpYWxpemVyQWRhcHRlcih3cywgdHJ1ZSk7DQotCQkNCi0JCU1vY2s8Tm90aWZpY2F0aW9uPiBtc2cgPSBtb2NrKE5vdGlmaWNhdGlvbi5jbGFzcyk7DQotCQltc2cuc3R1YnMoKS5tZXRob2QoImdldEZlYXR1cmUiKS53aWxsKHJldHVyblZhbHVlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOw0KLQkJbXNnLnN0dWJzKCkubWV0aG9kKCJnZXRPbGRWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoIm9sZFZhbHVlIikpOw0KLQkJDQotCQltc2cuc3R1YnMoKS5tZXRob2QoImdldE5ld1N0cmluZ1ZhbHVlIikud2lsbChyZXR1cm5WYWx1ZShudWxsKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmNoZWNrVmFsdWUobXNnLnByb3h5KCkpKTsNCi0JCWFzc2VydEVxdWFscygib2xkVmFsdWUiLCB3cy5nZXROYW1lKCkpOw0KLQkJbXNnLnN0dWJzKCkubWV0aG9kKCJnZXROZXdTdHJpbmdWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoIiIpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuY2hlY2tWYWx1ZShtc2cucHJveHkoKSkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJvbGRWYWx1ZSIsIHdzLmdldE5hbWUoKSk7DQotCQltc2cuc3R1YnMoKS5tZXRob2QoImdldE5ld1N0cmluZ1ZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgiICIpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuY2hlY2tWYWx1ZShtc2cucHJveHkoKSkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJvbGRWYWx1ZSIsIHdzLmdldE5hbWUoKSk7CQkNCi0JCW1zZy5zdHVicygpLm1ldGhvZCgiZ2V0TmV3U3RyaW5nVmFsdWUiKS53aWxsKHJldHVyblZhbHVlKCIgb2xkVmFsdWUgIikpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyLmNoZWNrVmFsdWUobXNnLnByb3h5KCkpKTsNCi0JCWFzc2VydEVxdWFscygib2xkVmFsdWUiLCB3cy5nZXROYW1lKCkpOwkJCQkNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNBZGFwdGVyRm9yVHlwZU9iamVjdCgpIA0KLQl7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIuaXNBZGFwdGVyRm9yVHlwZShJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNBZGFwdGVyRm9yVHlwZShOb3RpZmljYXRpb24uY2xhc3MpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhbGxlZEZvclJlcXVpcmVkQW5ub3RhdGlvbigpDQotCXsNCi0JCXJlc291cmNlLmVuYWJsZVNhdmluZygpOw0KLQkJTW9jazxOb3RpZmljYXRpb24+IG5vdGlmaWNhdGlvbk1vY2sgPSBtb2NrKE5vdGlmaWNhdGlvbi5jbGFzcyk7DQotCQlub3RpZmljYXRpb25Nb2NrLnN0dWJzKCkubWV0aG9kKCJpc1RvdWNoIikud2lsbChyZXR1cm5WYWx1ZShmYWxzZSkpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5zdHVicygpLm1ldGhvZCgiZ2V0RXZlbnRUeXBlIikud2lsbChyZXR1cm5WYWx1ZShOb3RpZmljYXRpb24uVU5TRVQpKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suc3R1YnMoKS5tZXRob2QoImdldE5ld1N0cmluZ1ZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgidGVzdCIpKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suc3R1YnMoKS5tZXRob2QoImdldE9sZFZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgib2xkVmFsdWUiKSk7CQ0KLQkJbm90aWZpY2F0aW9uTW9jay5zdHVicygpLm1ldGhvZCgiZ2V0RmVhdHVyZSIpLndpbGwocmV0dXJuVmFsdWUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCQlNb2NrPElBbm5vdGF0aW9uPElUeXBlPj4gYW5uID0gbW9jayhJQW5ub3RhdGlvbi5jbGFzcyk7DQotCQlhbm4uc3R1YnMoKS5tZXRob2QoImdldFBhcmFtVmFsdWVQYWlycyIpLndpbGwocmV0dXJuVmFsdWUobmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpKSk7DQotCQkNCi0JCVRlc3RTYXZpbmdXc1NlcmlhbGl6ZXJBZGFwdGVyIHNhdmVBZGFwdGVyID0gbmV3IFRlc3RTYXZpbmdXc1NlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlLCB0cnVlLCBhbm4ucHJveHkoKSk7DQotCQlzYXZlQWRhcHRlci5zZXRUYXJnZXQoRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2UoKSk7DQotCQlzYXZlQWRhcHRlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbk1vY2sucHJveHkoKSk7DQotCQlhc3NlcnRUcnVlKHNhdmVBZGFwdGVyLmFubldyaXRlci51cGRhdGVDYWxsZWQpOw0KLQkJYXNzZXJ0RmFsc2Uoc2F2ZUFkYXB0ZXIuYW5uV3JpdGVyLnJlbW92ZUNhbGxlZCk7CQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhbGxlZEZvck5vbkVtcHR5QW5ub3RhdGlvbigpDQotCXsNCi0JCXJlc291cmNlLmVuYWJsZVNhdmluZygpOw0KLQkJTW9jazxOb3RpZmljYXRpb24+IG5vdGlmaWNhdGlvbk1vY2sgPSBtb2NrKE5vdGlmaWNhdGlvbi5jbGFzcyk7DQotCQlub3RpZmljYXRpb25Nb2NrLnN0dWJzKCkubWV0aG9kKCJpc1RvdWNoIikud2lsbChyZXR1cm5WYWx1ZShmYWxzZSkpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5zdHVicygpLm1ldGhvZCgiZ2V0RXZlbnRUeXBlIikud2lsbChyZXR1cm5WYWx1ZShOb3RpZmljYXRpb24uVU5TRVQpKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suc3R1YnMoKS5tZXRob2QoImdldE5ld1N0cmluZ1ZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgidGVzdCIpKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suc3R1YnMoKS5tZXRob2QoImdldE9sZFZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgib2xkVmFsdWUiKSk7CQ0KLQkJbm90aWZpY2F0aW9uTW9jay5zdHVicygpLm1ldGhvZCgiZ2V0RmVhdHVyZSIpLndpbGwocmV0dXJuVmFsdWUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCQlNb2NrPElBbm5vdGF0aW9uPElUeXBlPj4gYW5uID0gbW9jayhJQW5ub3RhdGlvbi5jbGFzcyk7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlNb2NrPElQYXJhbVZhbHVlUGFpcj4gcGFyYW0gPSBtb2NrKElQYXJhbVZhbHVlUGFpci5jbGFzcyk7DQotCQlwYXJhbXMuYWRkKHBhcmFtLnByb3h5KCkpOw0KLQkJYW5uLnN0dWJzKCkubWV0aG9kKCJnZXRQYXJhbVZhbHVlUGFpcnMiKS53aWxsKHJldHVyblZhbHVlKHBhcmFtcykpOw0KLQkJDQotCQlUZXN0U2F2aW5nV3NTZXJpYWxpemVyQWRhcHRlciBzYXZlQWRhcHRlciA9IG5ldyBUZXN0U2F2aW5nV3NTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSwgZmFsc2UsIGFubi5wcm94eSgpKTsNCi0JCXNhdmVBZGFwdGVyLnNldFRhcmdldChEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpKTsNCi0JCXNhdmVBZGFwdGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uTW9jay5wcm94eSgpKTsNCi0JCWFzc2VydFRydWUoc2F2ZUFkYXB0ZXIuYW5uV3JpdGVyLnVwZGF0ZUNhbGxlZCk7DQotCQlhc3NlcnRGYWxzZShzYXZlQWRhcHRlci5hbm5Xcml0ZXIucmVtb3ZlQ2FsbGVkKTsJCQ0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNhbGxlZEZvck5vdFJlcXVpcmVkQW5ub3RhdGlvbigpDQotCXsNCi0JCXJlc291cmNlLmVuYWJsZVNhdmluZygpOw0KLQkJTW9jazxOb3RpZmljYXRpb24+IG5vdGlmaWNhdGlvbk1vY2sgPSBtb2NrKE5vdGlmaWNhdGlvbi5jbGFzcyk7DQotCQlub3RpZmljYXRpb25Nb2NrLnN0dWJzKCkubWV0aG9kKCJpc1RvdWNoIikud2lsbChyZXR1cm5WYWx1ZShmYWxzZSkpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5zdHVicygpLm1ldGhvZCgiZ2V0RXZlbnRUeXBlIikud2lsbChyZXR1cm5WYWx1ZShOb3RpZmljYXRpb24uVU5TRVQpKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suc3R1YnMoKS5tZXRob2QoImdldE5ld1N0cmluZ1ZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgidGVzdCIpKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suc3R1YnMoKS5tZXRob2QoImdldE9sZFZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgib2xkVmFsdWUiKSk7CQ0KLQkJbm90aWZpY2F0aW9uTW9jay5zdHVicygpLm1ldGhvZCgiZ2V0RmVhdHVyZSIpLndpbGwocmV0dXJuVmFsdWUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCQlNb2NrPElBbm5vdGF0aW9uPElUeXBlPj4gYW5uID0gbW9jayhJQW5ub3RhdGlvbi5jbGFzcyk7DQotCQlhbm4uc3R1YnMoKS5tZXRob2QoImdldFBhcmFtVmFsdWVQYWlycyIpLndpbGwocmV0dXJuVmFsdWUobmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpKSk7DQotCQkNCi0JCVRlc3RTYXZpbmdXc1NlcmlhbGl6ZXJBZGFwdGVyIHNhdmVBZGFwdGVyID0gbmV3IFRlc3RTYXZpbmdXc1NlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlLCBmYWxzZSwgYW5uLnByb3h5KCkpOw0KLQkJc2F2ZUFkYXB0ZXIuc2V0VGFyZ2V0KERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCkpOw0KLQkJc2F2ZUFkYXB0ZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb25Nb2NrLnByb3h5KCkpOw0KLQkJYXNzZXJ0RmFsc2Uoc2F2ZUFkYXB0ZXIuYW5uV3JpdGVyLnVwZGF0ZUNhbGxlZCk7DQotCQlhc3NlcnRUcnVlKHNhdmVBZGFwdGVyLmFubldyaXRlci5yZW1vdmVDYWxsZWQpOwkJDQotCX0NCi0JCQ0KLQkNCi0JcHJvdGVjdGVkIGNsYXNzIFRlc3RXc1NlcmlhbGl6ZXJBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlcg0KLQl7DQotCQlwdWJsaWMgYm9vbGVhbiBzYXZlQ2FsbGVkOw0KLQkJDQotCQlwcml2YXRlIGJvb2xlYW4gZG9DaGVjazsNCi0JCQ0KLQkJcHJpdmF0ZSBJV2ViU2VydmljZSB3czsNCi0JCQkNCi0JCXB1YmxpYyBUZXN0V3NTZXJpYWxpemVyQWRhcHRlcihmaW5hbCBJV2ViU2VydmljZSB3cywgYm9vbGVhbiBkb0NoZWNrKSB7DQotCQkJc3VwZXIocmVzb3VyY2UpOw0KLQkJCXRoaXMud3MgPSB3czsNCi0JCQl0aGlzLmRvQ2hlY2sgPSBkb0NoZWNrOw0KLQkJfQkJDQotDQotCQlAT3ZlcnJpZGUNCi0JCXB1YmxpYyB2b2lkIHNhdmUoTm90aWZpY2F0aW9uIG1zZykgew0KLQkJCXNhdmVDYWxsZWQgPSB0cnVlOw0KLQkJfQ0KLQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gZ2V0QW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQ0KLQkJQE92ZXJyaWRlDQotCQlwdWJsaWMgYm9vbGVhbiBjaGVja1ZhbHVlKE5vdGlmaWNhdGlvbiBtc2cpIA0KLQkJew0KLQkJCWlmKCFkb0NoZWNrKSB7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlyZXR1cm4gc3VwZXIuY2hlY2tWYWx1ZShtc2cpOw0KLQkJfQ0KLQkJDQotCQlAT3ZlcnJpZGUNCi0JCXB1YmxpYyBFT2JqZWN0IGdldFRhcmdldCgpIHsNCi0JCQlyZXR1cm4gd3M7DQotCQl9DQotDQotCQlAT3ZlcnJpZGUNCi0JCXByb3RlY3RlZCBib29sZWFuIGlzQW5ub3RhdGlvblJlcXVpcmVkKCkgew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgY2xhc3MgVGVzdFNhdmluZ1dzU2VyaWFsaXplckFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyDQotCXsNCi0JCWJvb2xlYW4gYW5uUmVxdWlyZWQ7DQotCQlNeUFubm90YXRpb25Xcml0ZXIgYW5uV3JpdGVyID0gbmV3IE15QW5ub3RhdGlvbldyaXRlcigpOw0KLQkJSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5uOw0KLQkJDQotCQlwdWJsaWMgVGVzdFNhdmluZ1dzU2VyaWFsaXplckFkYXB0ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiBhbm5SZXF1aXJlZCwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5uKSB7DQotCQkJc3VwZXIocmVzb3VyY2UpOw0KLQkJCXRoaXMuYW5uUmVxdWlyZWQgPSBhbm5SZXF1aXJlZDsNCi0JCQl0aGlzLmFubiA9IGFubjsNCi0JCX0NCi0NCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGdldEFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JCQlyZXR1cm4gYW5uOw0KLQkJfQ0KLQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fubm90YXRpb25SZXF1aXJlZCgpIHsNCi0JCQlyZXR1cm4gYW5uUmVxdWlyZWQ7DQotCQl9DQotCQkNCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIEFubm90YXRpb25Xcml0ZXIgZ2V0QW5ub3RhdGlvbldyaXRlcigpIHsNCi0JCQlyZXR1cm4gYW5uV3JpdGVyOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgY2xhc3MgTXlBbm5vdGF0aW9uV3JpdGVyIGV4dGVuZHMgQW5ub3RhdGlvbldyaXRlcg0KLQl7DQotCQlib29sZWFuIHJlbW92ZUNhbGxlZDsNCi0JCWJvb2xlYW4gdXBkYXRlQ2FsbGVkOw0KLQkJDQotCQlwdWJsaWMgdm9pZCBjbGVhcigpDQotCQl7DQotCQkJcmVtb3ZlQ2FsbGVkID0gZmFsc2U7DQotCQkJdXBkYXRlQ2FsbGVkID0gZmFsc2U7DQotCQl9DQotCQkNCi0JCUBPdmVycmlkZQ0KLQkJcHVibGljIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIHVwZGF0ZShmaW5hbCBJQW5ub3RhdGlvbjxUPiBhbm5vdGF0aW9uKSB7DQotCQkJdXBkYXRlQ2FsbGVkID0gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJQE92ZXJyaWRlDQotCQlwdWJsaWMgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgcmVtb3ZlKGZpbmFsIElBbm5vdGF0aW9uPFQ+IGFubm90YXRpb24pIHsNCi0JCQlyZW1vdmVDYWxsZWQgPSB0cnVlOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL01ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvTWV0aG9kU2VyaWFsaXplckFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkM2M0OWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvTWV0aG9kU2VyaWFsaXplckFkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XTUFubm90YXRpb25GZWF0dXJlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIuTWV0aG9kU2VyaWFsaXplckFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV01Bbm5vdGF0aW9uRmVhdHVyZXMuV01fQU5OT1RBVElPTjsNCi0NCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2VyaWFsaXplckFkYXB0ZXJUZXN0IGV4dGVuZHMgU2VyaWFsaXplckFkYXB0ZXJUZXN0Rml4dHVyZSANCi17DQotCXByaXZhdGUgSVdlYk1ldGhvZCB3ZWJNZXRob2QxOw0KLQlwcml2YXRlIElNZXRob2QgbWV0aG9kMTsNCi0JDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzdXBlci5zZXRVcCgpOw0KLQkNCi0JCXJlc291cmNlLnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJbWV0aG9kMSA9IHNlaVR5cGUuY3JlYXRlTWV0aG9kKCJwdWJsaWMgdm9pZCB0ZXN0MSgpOyIsIG51bGwsIHRydWUsIG51bGwpOw0KLQkJd2ViTWV0aG9kMSA9IHNlaS5nZXRXZWJNZXRob2RzKCkuZ2V0KDApOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uRGVmYXVsdFZhbHVlcygpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJTXlNZXRob2RTZXJpYWxpemVyQWRhcHRlciBhZGFwdGVyID0gbmV3IE15TWV0aG9kU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UsIHdlYk1ldGhvZDEpOw0KLQkJSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9IGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbigpOw0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsNCi0JCWFzc2VydEVxdWFscygwLCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSk7DQotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXTUFubm90YXRpb25GZWF0dXJlcy5XTV9OQU1FX0FUVFJJQlVURSkpOw0KLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoV01Bbm5vdGF0aW9uRmVhdHVyZXMuV01fRVhDTFVERURfQVRUUklCVVRFKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uTm9uRGVmYXVsdFZhbHVlcygpIHRocm93cyBFeGNlcHRpb24NCi0JewkJDQotCQlyZXNvdXJjZS5kaXNhYmxlU2F2aW5nKCk7DQotCQl3ZWJNZXRob2QxLnNldE5hbWUoImNoYW5nZWQiKTsNCi0JCXdlYk1ldGhvZDEuc2V0RXhjbHVkZWQodHJ1ZSk7DQotCQlNeU1ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgTXlNZXRob2RTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSwgd2ViTWV0aG9kMSk7DQotCQlJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gYWRhcHRlci5nZXRBbm5vdGF0aW9uKCk7DQotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOw0KLQkJYXNzZXJ0RXF1YWxzKDIsIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscygiY2hhbmdlZCIsIGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXTUFubm90YXRpb25GZWF0dXJlcy5XTV9OQU1FX0FUVFJJQlVURSkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0VYQ0xVREVEX0FUVFJJQlVURSkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJd2ViTWV0aG9kMS5zZXROYW1lKCJjaGFuZ2VkT3BlcmF0aW9uIik7DQotCQlmaW5hbCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKHNlaVR5cGUpOw0KLQkJZmluYWwgSUFubm90YXRpb248SU1ldGhvZD4gYW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0TWV0aG9kKG1ldGhvZDEsIFdNX0FOTk9UQVRJT04pOw0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsNCi0JCWFzc2VydEVxdWFscygiY2hhbmdlZE9wZXJhdGlvbiIsIGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXTUFubm90YXRpb25GZWF0dXJlcy5XTV9OQU1FX0FUVFJJQlVURSkpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlQW5ub3RhdGlvbkVtcHR5TmFtZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJd2ViTWV0aG9kMS5zZXROYW1lKCJtZXRob2QxIik7DQotCQl3ZWJNZXRob2QxLnNldE5hbWUobnVsbCk7DQotCQlmaW5hbCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKHNlaVR5cGUpOw0KLQkJZmluYWwgSUFubm90YXRpb248SU1ldGhvZD4gYW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0TWV0aG9kKG1ldGhvZDEsIFdNX0FOTk9UQVRJT04pOw0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsNCi0JCWFzc2VydEVxdWFscygibWV0aG9kMSIsIGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXTUFubm90YXRpb25GZWF0dXJlcy5XTV9OQU1FX0FUVFJJQlVURSkpOwkJCQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgY2xhc3MgTXlNZXRob2RTZXJpYWxpemVyQWRhcHRlciBleHRlbmRzIE1ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyDQotCXsNCi0JCXB1YmxpYyBNeU1ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyKEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UsIElXZWJNZXRob2Qgd2ViTWV0aG9kKSB7DQotCQkJc3VwZXIocmVzb3VyY2UpOw0KLQkJCXNldFRhcmdldCh3ZWJNZXRob2QpOw0KLQkJfQ0KLQkJDQotCQlwdWJsaWMgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gZ2V0QW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCQl7DQotCQkJcmV0dXJuIHN1cGVyLmdldEFubm90YXRpb24oKTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9QYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1BhcmFtZXRlclNlcmlhbGl6ZXJBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NTk5ZTlkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1BhcmFtZXRlclNlcmlhbGl6ZXJBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLldQX0FOTk9UQVRJT047DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIuUGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotDQotcHVibGljIGNsYXNzIFBhcmFtZXRlclNlcmlhbGl6ZXJBZGFwdGVyVGVzdCBleHRlbmRzIFNlcmlhbGl6ZXJBZGFwdGVyVGVzdEZpeHR1cmUNCi17DQotCXByaXZhdGUgTXlQYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlciBhZGFwdGVyOw0KLQlwcml2YXRlIElNZXRob2QgbWV0aG9kOyANCi0JcHJpdmF0ZSBJV2ViTWV0aG9kIHdzTWV0aG9kOw0KLQlwcml2YXRlIElXZWJQYXJhbSB3ZWJQYXJhbTsgDQotCXByaXZhdGUgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yOw0KLQkNCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXN1cGVyLnNldFVwKCk7DQotCQlyZXNvdXJjZS5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWFkYXB0ZXIgPSBuZXcgTXlQYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSk7DQotCQltZXRob2QgPSBzZWlUeXBlLmNyZWF0ZU1ldGhvZCgicHVibGljIHZvaWQgbWV0aG9kKGludCBwYXJhbTEpOyIsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCXdzTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQl3ZWJQYXJhbSA9IHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCk7DQotCQlhZGFwdGVyLnNldFRhcmdldCh3ZWJQYXJhbSk7DQotCQlyZXNvdXJjZS5kaXNhYmxlU2F2aW5nKCk7DQotCQlpbnNwZWN0b3IgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKHNlaVR5cGUpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbktpbmQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCS8vIElOIGNhc2UNCi0JCXdlYlBhcmFtLnNldEtpbmQoV2ViUGFyYW1LaW5kLklOKTsNCi0JCUlBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSBhZGFwdGVyLmdldEFubm90YXRpb24oKTsNCi0JCWFzc2VydEVxdWFscyhXUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OLCBhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDAsIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpKTsNCi0JCQ0KLQkJLy8gSU5PVVQgY2FzZQ0KLQkJd2ViUGFyYW0uc2V0S2luZChXZWJQYXJhbUtpbmQuSU5PVVQpOw0KLQkJYW5ub3RhdGlvbiA9IGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbigpOw0KLQkJYXNzZXJ0RXF1YWxzKFdQQW5ub3RhdGlvbkZlYXR1cmVzLldQX0FOTk9UQVRJT04sIGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkpOw0KLQkJSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWUgPSBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJYXNzZXJ0RXF1YWxzKCJtb2RlIiwgcGFyYW1WYWx1ZS5nZXRQYXJhbSgpKTsNCi0JCWFzc2VydFRydWUoV1BBbm5vdGF0aW9uRmVhdHVyZXMuV0VCX1BBUkFNX01PREVfSU5PVVQuZW5kc1dpdGgocGFyYW1WYWx1ZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpKTsNCi0JCQ0KLQkJLy8gT1VUIGNhc2UNCi0JCXdlYlBhcmFtLnNldEtpbmQoV2ViUGFyYW1LaW5kLk9VVCk7DQotCQlhbm5vdGF0aW9uID0gYWRhcHRlci5nZXRBbm5vdGF0aW9uKCk7DQotCQlhc3NlcnRFcXVhbHMoV1BBbm5vdGF0aW9uRmVhdHVyZXMuV1BfQU5OT1RBVElPTiwgYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsNCi0JCWFzc2VydEVxdWFscygxLCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSk7DQotCQlwYXJhbVZhbHVlID0gYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydEVxdWFscygibW9kZSIsIHBhcmFtVmFsdWUuZ2V0UGFyYW0oKSk7DQotCQlhc3NlcnRUcnVlKFdQQW5ub3RhdGlvbkZlYXR1cmVzLldFQl9QQVJBTV9NT0RFX09VVC5lbmRzV2l0aChwYXJhbVZhbHVlLmdldFZhbHVlKCkudG9TdHJpbmcoKSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbkhlYWRlcigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJLy8gbm90IGluIGhlYWRlciBjYXNlDQotCQl3ZWJQYXJhbS5zZXRIZWFkZXIoZmFsc2UpOw0KLQkJSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9IGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbigpOw0KLQkJYXNzZXJ0RXF1YWxzKFdQQW5ub3RhdGlvbkZlYXR1cmVzLldQX0FOTk9UQVRJT04sIGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQlhc3NlcnRFcXVhbHMoMCwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkpOw0KLQkJDQotCQkvLyBpbiBoZWFkZXIgY2FzZQ0KLQkJd2ViUGFyYW0uc2V0SGVhZGVyKHRydWUpOw0KLQkJYW5ub3RhdGlvbiA9IGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbigpOw0KLQkJYXNzZXJ0RXF1YWxzKFdQQW5ub3RhdGlvbkZlYXR1cmVzLldQX0FOTk9UQVRJT04sIGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkpOw0KLQkJSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWUgPSBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJYXNzZXJ0RXF1YWxzKCJoZWFkZXIiLCBwYXJhbVZhbHVlLmdldFBhcmFtKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgcGFyYW1WYWx1ZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOwkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQl3ZWJQYXJhbS5zZXROYW1lKCJhcmcwIik7DQotCQlJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gYWRhcHRlci5nZXRBbm5vdGF0aW9uKCk7DQotCQlhc3NlcnRFcXVhbHMoV1BBbm5vdGF0aW9uRmVhdHVyZXMuV1BfQU5OT1RBVElPTiwgYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsNCi0JCWFzc2VydEVxdWFscygwLCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSk7DQotCQkNCi0JCS8vIGluIGhlYWRlciBjYXNlDQotCQl3ZWJQYXJhbS5zZXROYW1lKCJjaGFuZ2VkIik7DQotCQlhbm5vdGF0aW9uID0gYWRhcHRlci5nZXRBbm5vdGF0aW9uKCk7DQotCQlhc3NlcnRFcXVhbHMoV1BBbm5vdGF0aW9uRmVhdHVyZXMuV1BfQU5OT1RBVElPTiwgYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsNCi0JCWFzc2VydEVxdWFscygxLCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSk7DQotCQlJUGFyYW1WYWx1ZVBhaXIgcGFyYW1WYWx1ZSA9IGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBwYXJhbVZhbHVlLmdldFBhcmFtKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJjaGFuZ2VkIiwgcGFyYW1WYWx1ZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOwkJDQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25QYXJ0TmFtZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJd3NNZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlLlJQQyk7DQotCQl3ZWJQYXJhbS5zZXRQYXJ0TmFtZSgiYXJnMCIpOw0KLQkJSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9IGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbigpOw0KLQkJYXNzZXJ0RXF1YWxzKFdQX0FOTk9UQVRJT04sIGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQlhc3NlcnRFcXVhbHMoMCwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkpOw0KLQkJDQotCQkvLyBpbiBoZWFkZXIgY2FzZQ0KLQkJd2ViUGFyYW0uc2V0UGFydE5hbWUoImNoYW5nZWQiKTsNCi0JCWFubm90YXRpb24gPSBhZGFwdGVyLmdldEFubm90YXRpb24oKTsNCi0JCWFzc2VydEVxdWFscyhXUF9BTk5PVEFUSU9OLCBhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpKTsNCi0JCUlQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlID0gYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydEVxdWFscygicGFydE5hbWUiLCBwYXJhbVZhbHVlLmdldFBhcmFtKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJjaGFuZ2VkIiwgcGFyYW1WYWx1ZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOwkJDQotCX0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlTmFtZUNoYW5nZXNQYXJ0TmFtZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJcmVzb3VyY2UuZW5hYmxlU2F2aW5nKCk7DQotCQl3ZWJQYXJhbS5zZXROYW1lKCJjaGFuZ2VkIik7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBhbm5vdGF0aW9uID0gaW5zcGVjdG9yLmluc3BlY3RQYXJhbShtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcih3ZWJQYXJhbS5nZXRJbXBsZW1lbnRhdGlvbigpKSwgV1BfQU5OT1RBVElPTik7DQotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOw0KLQkJYXNzZXJ0RXF1YWxzKCJjaGFuZ2VkIiwgYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJuYW1lIikpOw0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgicGFydE5hbWUiKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VOYW1lRG9lc05vdENoYW5nZVBhcnROYW1lSWZQYXJ0TmFtZUluQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJbWV0aG9kID0gc2VpVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyB2b2lkIG1ldGhvZDEoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwicGFyYW0xXCIsIHBhcnROYW1lPVwicGFyYW0xUGFydFwiKSBpbnQgcGFyYW0xKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQl3c01ldGhvZCA9IHRlc3RVdGlsLmZpbmRXZWJNZXRob2RCeU5hbWUoc2VpLCAibWV0aG9kMSIpOw0KLQkJd2ViUGFyYW0gPSB0ZXN0VXRpbC5maW5kUGFyYW0od3NNZXRob2QsICJwYXJhbTEiKTsNCi0JCXdzTWV0aG9kLnNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZS5SUEMpOw0KLQkJcmVzb3VyY2UuZW5hYmxlU2F2aW5nKCk7DQotCQl3ZWJQYXJhbS5zZXROYW1lKCJ0ZXN0Iik7DQotCQlJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gYW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0UGFyYW0obWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIod2ViUGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKSksIFdQX0FOTk9UQVRJT04pOw0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsNCi0JCWFzc2VydEVxdWFscygicGFyYW0xUGFydCIsIGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgicGFydE5hbWUiKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25UYXJnZXROUygpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJd3NNZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlLlJQQyk7DQotCQl3ZWJQYXJhbS5zZXRUYXJnZXROYW1lc3BhY2UoImh0dHA6Ly9jb20uc2FwL3Rlc3QiKTsNCi0JCUlBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSBhZGFwdGVyLmdldEFubm90YXRpb24oKTsNCi0JCWFzc2VydEVxdWFscyhXUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OLCBhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDAsIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpKTsNCi0JCQ0KLQkJLy8gY2hhbmdlZCB0YXJnZXQgbmFtZXNwYWNlIGNhc2UNCi0JCXdlYlBhcmFtLnNldFRhcmdldE5hbWVzcGFjZSgiaHR0cDovL2NoYW5nZWQiKTsNCi0JCWFubm90YXRpb24gPSBhZGFwdGVyLmdldEFubm90YXRpb24oKTsNCi0JCWFzc2VydEVxdWFscyhXUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OLCBhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpKTsNCi0JCUlQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlID0gYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydEVxdWFscygidGFyZ2V0TmFtZXNwYWNlIiwgcGFyYW1WYWx1ZS5nZXRQYXJhbSgpKTsNCi0JCWFzc2VydEVxdWFscygiaHR0cDovL2NoYW5nZWQiLCBwYXJhbVZhbHVlLmdldFZhbHVlKCkudG9TdHJpbmcoKSk7CQkNCi0JfQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJd3NNZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UKTsNCi0JCXdlYlBhcmFtLnNldE5hbWUoImNoYW5nZWQiKTsNCi0JCXdlYlBhcmFtLnNldEtpbmQoV2ViUGFyYW1LaW5kLklOT1VUKTsNCi0JCXdlYlBhcmFtLnNldFBhcnROYW1lKCJkaWZmZXJlbnQiKTsNCi0JCXdlYlBhcmFtLnNldEhlYWRlcih0cnVlKTsNCi0JCXJlc291cmNlLmVuYWJsZVNhdmluZygpOw0KLQkJd2ViUGFyYW0uc2V0VGFyZ2V0TmFtZXNwYWNlKCJodHRwOi8vY2hhbmdlZC90ZXJnZXQvbnMiKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGFubm90YXRpb24gPSBpbnNwZWN0b3IuaW5zcGVjdFBhcmFtKG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKHdlYlBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkpLCBXUF9BTk5PVEFUSU9OKTsNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7DQotCQlhc3NlcnRFcXVhbHMoNCwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJjaGFuZ2VkIiwgYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJuYW1lIikpOw0KLQkJYXNzZXJ0VHJ1ZShXUEFubm90YXRpb25GZWF0dXJlcy5XRUJfUEFSQU1fTU9ERV9JTk9VVC5lbmRzV2l0aChhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm1vZGUiKSkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJodHRwOi8vY2hhbmdlZC90ZXJnZXQvbnMiLCBhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInRhcmdldE5hbWVzcGFjZSIpKTsNCi0NCi0JCXdzTWV0aG9kLnNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZS5SUEMpOw0KLQkJd2ViUGFyYW0uc2V0UGFydE5hbWUoImRpZmZlcmVudCIpOw0KLQkJLy8gY3JlYXRlIG5ldyBpbnNwZWN0b3IgY2F1c2Ugc291cmNlIGhhcyBiZWVuIGNoYW5nZWQNCi0JCWluc3BlY3RvciA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3Ioc2VpVHlwZSk7DQotCQlhbm5vdGF0aW9uID0gaW5zcGVjdG9yLmluc3BlY3RQYXJhbShtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcih3ZWJQYXJhbS5nZXRJbXBsZW1lbnRhdGlvbigpKSwgV1BfQU5OT1RBVElPTik7DQotCQlhc3NlcnRFcXVhbHMoNSwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJkaWZmZXJlbnQiLCBhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInBhcnROYW1lIikpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlBbm5vdGF0aW9uUmVtb3ZlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJbWV0aG9kID0gc2VpVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyB2b2lkIG1ldGhvZDEoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwicGFyYW0xXCIpIGludCBwYXJhbTEpOyIsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCXdzTWV0aG9kID0gdGVzdFV0aWwuZmluZFdlYk1ldGhvZEJ5TmFtZShzZWksICJtZXRob2QxIik7DQotCQl3ZWJQYXJhbSA9IHRlc3RVdGlsLmZpbmRQYXJhbSh3c01ldGhvZCwgInBhcmFtMSIpOw0KLQkJcmVzb3VyY2UuZW5hYmxlU2F2aW5nKCk7DQotCQl3ZWJQYXJhbS5zZXROYW1lKCJhcmcwIik7DQotCQlJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj5hbm5vdGF0aW9uID0gaW5zcGVjdG9yLmluc3BlY3RQYXJhbShtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcih3ZWJQYXJhbS5nZXRJbXBsZW1lbnRhdGlvbigpKSwgV1BfQU5OT1RBVElPTik7DQotCQlhc3NlcnROdWxsKCJFbXB0eSBhbm5vdGF0aW9uIGhhcyBub3QgYmVlbiByZW1vdmVkIiwgYW5ub3RhdGlvbik7DQotCX0NCi0NCi0JcHJvdGVjdGVkIGNsYXNzIE15UGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXIgZXh0ZW5kcyBQYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlcg0KLQl7DQotCQlwdWJsaWMgTXlQYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlcihKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKSB7DQotCQkJc3VwZXIocmVzb3VyY2UpOw0KLQkJfQ0KLQ0KLQkJcHVibGljIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGdldEFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JCQlyZXR1cm4gc3VwZXIuZ2V0QW5ub3RhdGlvbigpOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1NlaVNlcmlhbGl6ZXJBZGFwdGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvU2VpU2VyaWFsaXplckFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQzODQxZDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvU2VpU2VyaWFsaXplckFkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5OQU1FX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5UQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQW5ub3RhdGlvblNlcmlhbGl6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyLlNlaVNlcmlhbGl6ZXJBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOw0KLQ0KLS8qKg0KLSAqIFRlc3RzIGZvciB7QGxpbmsgU2VpU2VyaWFsaXplckFkYXB0ZXJ9IGNsYXNzOw0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2VpU2VyaWFsaXplckFkYXB0ZXJUZXN0IGV4dGVuZHMgU2VyaWFsaXplckFkYXB0ZXJUZXN0Rml4dHVyZSANCi17DQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVJQW5ub3RhdGlvbklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRyeSB7DQotCQkJbmV3IE15U2VpU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UpLmNyZWF0ZUlBbm5vdGF0aW9uKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKW51bGwsIHByb2plY3QuZ2V0SmF2YVByb2plY3QoKS5nZXRKYXZhTW9kZWwoKSk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gXykge30NCi0JCQ0KLQkJdHJ5IHsNCi0JCQluZXcgTXlTZWlTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSkuY3JlYXRlSUFubm90YXRpb24oc2VpLCBudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBfKSB7fQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVJQW5ub3RhdGlvbkV4cGxpY2l0U2VpKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9ICBuZXcgTXlTZWlTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSkuY3JlYXRlSUFubm90YXRpb24oc2VpLCBwcm9qZWN0LmdldEphdmFQcm9qZWN0KCkuZ2V0SmF2YU1vZGVsKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDIsIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscyhUQVJHRVRfTkFNRVNQQUNFLCBhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEUpKTsNCi0JCWFzc2VydEVxdWFscyhQT1JUX1RZUEVfTkFNRSwgYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKE5BTUVfQVRUUklCVVRFKSk7DQotCQlhc3NlcnRFcXVhbHMoc2VpVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgKChJVHlwZSlhbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCkpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUlBbm5vdGF0aW9uSW1wbGljaXRTZWkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gbmV3IE15U2VpU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UpLmNyZWF0ZUlBbm5vdGF0aW9uKHdzSW1wbGljaXQuZ2V0U2VydmljZUVuZHBvaW50KCksIHByb2plY3QuZ2V0SmF2YVByb2plY3QoKS5nZXRKYXZhTW9kZWwoKSk7DQotCQlhc3NlcnRFcXVhbHMoNSwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkpOw0KLQkJV3NTZXJpYWxpemVyQWRhcHRlclRlc3QuY2hlY2tJV2ViU2VydmljZUlBbm5vdGF0aW9uKGFubm90YXRpb24pOw0KLQkJYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdE5hbWUiLCBhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoV1NBbm5vdGF0aW9uRmVhdHVyZXMuTkFNRV9BVFRSSUJVVEUpKTsNCi0JCWFzc2VydEVxdWFscyhpbXBsQmVhbkltcGxpY2l0LmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCAoKElUeXBlKWFubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKSkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUlBbm5vdGF0aW9uRGVmYXVsdFZhbHVlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJc2VpLnNldE5hbWUoIlNFSSIpOw0KLQkJc2VpLnNldFRhcmdldE5hbWVzcGFjZSgiaHR0cDovL3Rlc3QvIik7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gbmV3IE15U2VpU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UpLmNyZWF0ZUlBbm5vdGF0aW9uKHNlaSwgcHJvamVjdC5nZXRKYXZhUHJvamVjdCgpLmdldEphdmFNb2RlbCgpKTsNCi0JCWFzc2VydEVxdWFscygwLCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlQW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJcmVzb3VyY2UuZ2V0U2VyaWFsaXplckZhY3RvcnkoKS5hZGFwdChzZWksIElBbm5vdGF0aW9uU2VyaWFsaXplci5jbGFzcyk7DQotCQlzZWkuc2V0TmFtZSgiQ2hhbmdlZFNlaU5hbWUiKTsNCi0JCQ0KLQkJSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihzZWlUeXBlKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBmb3VuZCA9IGluc3BlY3Rvci5pbnNwZWN0VHlwZShXU19BTk5PVEFUSU9OKTsNCi0JCWFzc2VydE5vdE51bGwoZm91bmQpOw0KLQkJYXNzZXJ0RXF1YWxzKCJDaGFuZ2VkU2VpTmFtZSIsIGZvdW5kLmdldFByb3BlcnR5VmFsdWUoTkFNRV9BVFRSSUJVVEUpKTsNCi0JCWFzc2VydEVxdWFscyhUQVJHRVRfTkFNRVNQQUNFLCBmb3VuZC5nZXRQcm9wZXJ0eVZhbHVlKFRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFKSk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBjbGFzcyBNeVNlaVNlcmlhbGl6ZXJBZGFwdGVyIGV4dGVuZHMgU2VpU2VyaWFsaXplckFkYXB0ZXINCi0Jew0KLQkJcHVibGljIE15U2VpU2VyaWFsaXplckFkYXB0ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSkgew0KLQkJCXN1cGVyKHJlc291cmNlKTsNCi0JCX0NCi0JCQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gY3JlYXRlSUFubm90YXRpb24oZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIGZpbmFsIElKYXZhTW9kZWwgamF2YU1vZGVsKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQkJew0KLQkJCXJldHVybiBzdXBlci5jcmVhdGVJQW5ub3RhdGlvbihzZWksIGphdmFNb2RlbCk7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNjUzMzk0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1NlcmlhbGl6ZXJBZGFwdGVyRmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUFubm90YXRpb25TZXJpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIuU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2s7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLQ0KLS8qKg0KLSAqIFRlc3RzIGZvciB7QGxpbmsgV3NTZXJpYWxpemVyQWRhcHRlckZhY3Rvcnl9IGNsYXNzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5VGVzdCBleHRlbmRzIE1vY2tPYmplY3RUZXN0Q2FzZSANCi17DQotCXByaXZhdGUgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZTsNCi0JcHJpdmF0ZSBTZXJpYWxpemVyQWRhcHRlckZhY3RvcnkgZmFjdG9yeTsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpDQotCXsNCi0JCU1vY2s8SUphdmFNb2RlbD4gamF2YU1vZGVsTW9jayA9IG1vY2soSUphdmFNb2RlbC5jbGFzcyk7DQotCQlyZXNvdXJjZSA9IG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKGphdmFNb2RlbE1vY2sucHJveHkoKSk7DQotCQlmYWN0b3J5ID0gcmVzb3VyY2UuZ2V0U2VyaWFsaXplckZhY3RvcnkoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNGYWN0b3J5Rm9yVHlwZSgpCQ0KLQl7CQkNCi0JCWFzc2VydFRydWUoZmFjdG9yeS5pc0ZhY3RvcnlGb3JUeXBlKElBbm5vdGF0aW9uU2VyaWFsaXplci5jbGFzcykpOw0KLQkJYXNzZXJ0RmFsc2UoZmFjdG9yeS5pc0ZhY3RvcnlGb3JUeXBlKE5vdGlmaWNhdGlvbi5jbGFzcykpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RBZGFwdFdlYlNlcnZpY2UoKQ0KLQl7DQotCQlJV2ViU2VydmljZSB3ZWJTZXJ2aWNlID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2UoKTsNCi0JCUFkYXB0ZXIgYWRhcHRlcjEgPSBmYWN0b3J5LmFkYXB0KHdlYlNlcnZpY2UsIElBbm5vdGF0aW9uU2VyaWFsaXplci5jbGFzcyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgd2ViU2VydmljZS5lQWRhcHRlcnMoKS5zaXplKCkpOw0KLQkJDQotCQlBZGFwdGVyIGFkYXB0ZXIyID0gZmFjdG9yeS5hZGFwdCh3ZWJTZXJ2aWNlLCBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdlYlNlcnZpY2UuZUFkYXB0ZXJzKCkuc2l6ZSgpKTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyMT09YWRhcHRlcjIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRhcHRTZWkoKQ0KLQl7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0JCUFkYXB0ZXIgYWRhcHRlcjEgPSBmYWN0b3J5LmFkYXB0KHNlaSwgSUFubm90YXRpb25TZXJpYWxpemVyLmNsYXNzKTsNCi0JCWFzc2VydEVxdWFscygxLCBzZWkuZUFkYXB0ZXJzKCkuc2l6ZSgpKTsNCi0JCQ0KLQkJQWRhcHRlciBhZGFwdGVyMiA9IGZhY3RvcnkuYWRhcHQoc2VpLCBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHNlaS5lQWRhcHRlcnMoKS5zaXplKCkpOw0KLQkJDQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIxPT1hZGFwdGVyMik7DQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1NlcmlhbGl6ZXJBZGFwdGVyVGVzdEZpeHR1cmUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1NlcmlhbGl6ZXJBZGFwdGVyVGVzdEZpeHR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDBmY2ZmMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9TZXJpYWxpemVyQWRhcHRlclRlc3RGaXh0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuRG9tVGVzdFV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3Q7DQotDQotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcmlhbGl6ZXJBZGFwdGVyVGVzdEZpeHR1cmUgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTX0FOTk9UQVRJT04gPSAiamF2YXguandzLldlYlNlcnZpY2UiOwkNCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9OQU1FID0gIk15U2VydmljZSI7DQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRfVFlQRV9OQU1FID0gIk15UG9ydFR5cGUiOw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX05BTUUgPSAiTXlQb3J0IjsNCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRSA9ICJodHRwOi8vY29tLnNhcC90ZXN0IjsNCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9MT0NBVElPTiA9ICJDOi90ZXN0L3dzZGwvbG9jYXRpb24iOw0KLQkNCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlIHdzOw0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2Ugd3NJbXBsaWNpdDsNCi0JDQotCXByb3RlY3RlZCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaTsNCi0JcHJvdGVjdGVkIFRlc3RQcm9qZWN0IHByb2plY3Q7DQotCXByb3RlY3RlZCBJVHlwZSBpbXBsQmVhblR5cGU7DQotCXByb3RlY3RlZCBJVHlwZSBpbXBsQmVhbkltcGxpY2l0Ow0KLQlwcm90ZWN0ZWQgSVR5cGUgc2VpVHlwZTsNCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3Q7DQotCXByb3RlY3RlZCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlOw0KLQlwcm90ZWN0ZWQgRG9tVGVzdFV0aWxzIHRlc3RVdGlsID0gbmV3IERvbVRlc3RVdGlscygpOw0KLQlwcm90ZWN0ZWQgRG9tVXRpbCBkb21VdGlsID0gbmV3IERvbVV0aWwoKTsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJcHJvamVjdCA9IG5ldyBUZXN0UHJvamVjdCgpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwYWNrID0gcHJvamVjdC5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpLmNyZWF0ZVBhY2thZ2VGcmFnbWVudCgidGVzdCIsIHRydWUsIG51bGwpOw0KLQkJc2VpVHlwZSA9IHByb2plY3QuY3JlYXRlVHlwZShwYWNrLCAiU0VJLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJNeVBvcnRUeXBlXCIsIHRhcmdldE5hbWVzcGFjZT1cImh0dHA6Ly9jb20uc2FwL3Rlc3RcIilcbiIgKw0KLQkJCQkicHVibGljIGludGVyZmFjZSBTRUkge30iKTsNCi0JCWltcGxCZWFuVHlwZSA9IHByb2plY3QuY3JlYXRlVHlwZShwYWNrLCAiSW1wbEJlYW4uamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2U9XCJ0ZXN0LlNFSVwiLCAiICsNCi0JCQkJInNlcnZpY2VOYW1lPVwiTXlTZXJ2aWNlXCIsIHBvcnROYW1lPVwiTXlQb3J0XCIsIHdzZGxMb2NhdGlvbj1cIkM6L3Rlc3Qvd3NkbC9sb2NhdGlvblwiLCB0YXJnZXROYW1lc3BhY2U9XCJodHRwOi8vY29tLnNhcC90ZXN0XCIpIiArDQotCQkJCSJwdWJsaWMgY2xhc3MgSW1wbEJlYW4ge30iKTsNCi0JCQ0KLQkJaW1wbEJlYW5JbXBsaWNpdCA9IHByb2plY3QuY3JlYXRlVHlwZShwYWNrLCAiSW1wbGljaXRJbXBsQmVhbi5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiSW1wbGljaXROYW1lXCIsICIgKw0KLQkJCQkic2VydmljZU5hbWU9XCJNeVNlcnZpY2VcIiwgcG9ydE5hbWU9XCJNeVBvcnRcIiwgd3NkbExvY2F0aW9uPVwiQzovdGVzdC93c2RsL2xvY2F0aW9uXCIsIHRhcmdldE5hbWVzcGFjZT1cImh0dHA6Ly9jb20uc2FwL3Rlc3RcIikiICsNCi0JCSJwdWJsaWMgY2xhc3MgSW1wbGljaXRJbXBsQmVhbiB7fSIpOwkJDQotCQkNCi0JCWFzc2VydE5vdE51bGwoc2VpVHlwZSk7DQotCQlhc3NlcnROb3ROdWxsKGltcGxCZWFuVHlwZSk7DQotCQlyZXNvdXJjZSA9IGNyZWF0ZVRhcmdldCgpOwkNCi0JCXJlc291cmNlLmxvYWQobnVsbCk7DQotCQkNCi0JCXdzUHJvamVjdCA9IHJlc291cmNlLmdldERPTSgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpLmdldCgwKTsNCi0JCXNlaSA9IGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcm9qZWN0LCAidGVzdC5TRUkiKTsNCi0JCXdzID0gZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJvamVjdCwgInRlc3QuSW1wbEJlYW4iKTsNCi0JCXdzSW1wbGljaXQgPSBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcm9qZWN0LCAidGVzdC5JbXBsaWNpdEltcGxCZWFuIik7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpDQotCXsNCi0JCXRyeSB7DQotCQkJcHJvamVjdC5kaXNwb3NlKCk7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gXykgew0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgY3JlYXRlVGFyZ2V0KCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKHByb2plY3QuZ2V0SmF2YVByb2plY3QoKS5nZXRKYXZhTW9kZWwoKSkgDQotCQl7DQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIGJvb2xlYW4gYXBwcm92ZVByb2plY3QoSUphdmFQcm9qZWN0IHByaikgDQotCQkJew0KLQkJCQlpZiAocHJqLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHByb2plY3QuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCX0NCi0NCi0JCQkJcmV0dXJuIGZhbHNlOw0KLQkJCX0NCi0JCX07DQotCX0JCQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9Xc1NlcmlhbGl6ZXJBZGFwdGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvV3NTZXJpYWxpemVyQWRhcHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjNlYTBlZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9Xc1NlcmlhbGl6ZXJBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLlBPUlRfTkFNRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuU0VSVklDRV9OQU1FX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5UQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5XU0RMX0xPQ0FUSU9OX0FUVFJJQlVURTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUFubm90YXRpb25TZXJpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplci5Xc1NlcmlhbGl6ZXJBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLQ0KLS8qKg0KLSAqIFRlc3RzIGZvciB7QGxpbmsgV3NTZXJpYWxpemVyQWRhcHRlcn0gY2xhc3MuIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgV3NTZXJpYWxpemVyQWRhcHRlclRlc3QgZXh0ZW5kcyBTZXJpYWxpemVyQWRhcHRlclRlc3RGaXh0dXJlDQotew0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlSUFubm90YXRpb25JV2ViU2VydmljZU5wZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdHJ5IHsNCi0JCQluZXcgTXlXc1NlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlKS5jcmVhdGVJQW5ub3RhdGlvbigoSVdlYlNlcnZpY2UpbnVsbCwgcHJvamVjdC5nZXRKYXZhUHJvamVjdCgpLmdldEphdmFNb2RlbCgpKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBfKSB7fQ0KLQkJDQotCQl0cnkgew0KLQkJCW5ldyBNeVdzU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UpLmNyZWF0ZUlBbm5vdGF0aW9uKHdzLCBudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBfKSB7fQkJDQotCX0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlSUFubm90YXRpb25JV2ViU2VydmljZUV4cGxpY2l0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9IG5ldyBNeVdzU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UpLmNyZWF0ZUlBbm5vdGF0aW9uKHdzLCBwcm9qZWN0LmdldEphdmFQcm9qZWN0KCkuZ2V0SmF2YU1vZGVsKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDUsIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpKTsNCi0JCWNoZWNrSVdlYlNlcnZpY2VJQW5ub3RhdGlvbihhbm5vdGF0aW9uKTsNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdTQW5ub3RhdGlvbkZlYXR1cmVzLkVORFBPSU5UX0lOVEVSRkFDRV9BVFRSSUJVVEUpKTsNCi0JCWFzc2VydEVxdWFscyhpbXBsQmVhblR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksICgoSVR5cGUpYW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVJQW5ub3RhdGlvbklXZWJTZXJ2aWNlSW1wbGljaXQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gbmV3IE15V3NTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSkuY3JlYXRlSUFubm90YXRpb24od3NJbXBsaWNpdCwgcHJvamVjdC5nZXRKYXZhUHJvamVjdCgpLmdldEphdmFNb2RlbCgpKTsNCi0JCWFzc2VydEVxdWFscyg1LCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSk7DQotCQljaGVja0lXZWJTZXJ2aWNlSUFubm90YXRpb24oYW5ub3RhdGlvbik7DQotCQkNCi0JCWFzc2VydEVxdWFscygiSW1wbGljaXROYW1lIiwgYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdTQW5ub3RhdGlvbkZlYXR1cmVzLk5BTUVfQVRUUklCVVRFKSk7CQkNCi0JCWFzc2VydEVxdWFscyhpbXBsQmVhbkltcGxpY2l0LmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCAoKElUeXBlKWFubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKSkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlSUFubm90YXRpb25JV2ViU2VydmljZURlZmF1bHQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXJlc291cmNlLmRpc2FibGVTYXZpbmcoKTsNCi0JCXdzSW1wbGljaXQuZ2V0U2VydmljZUVuZHBvaW50KCkuc2V0TmFtZSgiSW1wbGljaXRJbXBsQmVhbiIpOw0KLQkJd3NJbXBsaWNpdC5zZXROYW1lKCJJbXBsaWNpdEltcGxCZWFuU2VydmljZSIpOw0KLQkJd3NJbXBsaWNpdC5zZXRQb3J0TmFtZSgiSW1wbGljaXRJbXBsQmVhblBvcnQiKTsNCi0JCXdzSW1wbGljaXQuc2V0VGFyZ2V0TmFtZXNwYWNlKCJodHRwOi8vdGVzdC8iKTsNCi0JCXdzSW1wbGljaXQuc2V0V3NkbExvY2F0aW9uKG51bGwpOw0KLQkJZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9bmV3IE15V3NTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSkuY3JlYXRlSUFubm90YXRpb24od3NJbXBsaWNpdCwgcHJvamVjdC5nZXRKYXZhUHJvamVjdCgpLmdldEphdmFNb2RlbCgpKTsNCi0JCWFzc2VydEVxdWFscygwLCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlQW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJcmVzb3VyY2UuZ2V0U2VyaWFsaXplckZhY3RvcnkoKS5hZGFwdCh3cywgSUFubm90YXRpb25TZXJpYWxpemVyLmNsYXNzKTsNCi0JCXdzLnNldE5hbWUoIkNoYW5nZWRTZXJ2aWNlIik7DQotCQkNCi0JCUlBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvciA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoaW1wbEJlYW5UeXBlKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBmb3VuZCA9IGluc3BlY3Rvci5pbnNwZWN0VHlwZShXU19BTk5PVEFUSU9OKTsNCi0JCWFzc2VydE5vdE51bGwoZm91bmQpOw0KLQkJYXNzZXJ0RXF1YWxzKCJDaGFuZ2VkU2VydmljZSIsIGZvdW5kLmdldFByb3BlcnR5VmFsdWUoU0VSVklDRV9OQU1FX0FUVFJJQlVURSkpOw0KLQkJYXNzZXJ0RXF1YWxzKFBPUlRfTkFNRSwgZm91bmQuZ2V0UHJvcGVydHlWYWx1ZShQT1JUX05BTUVfQVRUUklCVVRFKSk7DQotCQlhc3NlcnRFcXVhbHMoVEFSR0VUX05BTUVTUEFDRSwgZm91bmQuZ2V0UHJvcGVydHlWYWx1ZShUQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSkpOw0KLQkJYXNzZXJ0RXF1YWxzKFdTRExfTE9DQVRJT04sIGZvdW5kLmdldFByb3BlcnR5VmFsdWUoV1NETF9MT0NBVElPTl9BVFRSSUJVVEUpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrSVdlYlNlcnZpY2VJQW5ub3RhdGlvbihJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uKQ0KLQl7DQotCQlib29sZWFuIFtdIGZvdW5kID0ge2ZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlfTsNCi0JCVN0cmluZyBbXSBwYXJhbXMgPSB7InNlcnZpY2VOYW1lIiwgInBvcnROYW1lIiwgInRhcmdldE5hbWVzcGFjZSIsICJ3c2RsTG9jYXRpb24iIH07DQotCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlUGFpciA6IGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkpIA0KLQkJew0KLQkJCVN0cmluZyBwYXJhbSA9IHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCk7DQotCQkJaWYgKHBhcmFtLmVxdWFscyhXU0Fubm90YXRpb25GZWF0dXJlcy5TRVJWSUNFX05BTUVfQVRUUklCVVRFKSkgew0KLQkJCQlhc3NlcnRFcXVhbHMoU0VSVklDRV9OQU1FLCBwYXJhbVZhbHVlUGFpci5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOw0KLQkJCQlmb3VuZFswXSA9IHRydWU7DQotCQkJfQ0KLQkJCWlmIChwYXJhbS5lcXVhbHMoV1NBbm5vdGF0aW9uRmVhdHVyZXMuUE9SVF9OQU1FX0FUVFJJQlVURSkpIHsNCi0JCQkJYXNzZXJ0RXF1YWxzKFBPUlRfTkFNRSwgcGFyYW1WYWx1ZVBhaXIuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsNCi0JCQkJZm91bmRbMV0gPSB0cnVlOw0KLQkJCX0NCi0JCQlpZiAocGFyYW0uZXF1YWxzKFdTQW5ub3RhdGlvbkZlYXR1cmVzLlRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFKSkgew0KLQkJCQlhc3NlcnRFcXVhbHMoVEFSR0VUX05BTUVTUEFDRSwgcGFyYW1WYWx1ZVBhaXIuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsNCi0JCQkJZm91bmRbMl0gPSB0cnVlOw0KLQkJCX0NCi0JCQlpZiAocGFyYW0uZXF1YWxzKFdTQW5ub3RhdGlvbkZlYXR1cmVzLldTRExfTE9DQVRJT05fQVRUUklCVVRFKSkgew0KLQkJCQlhc3NlcnRFcXVhbHMoV1NETF9MT0NBVElPTiwgcGFyYW1WYWx1ZVBhaXIuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsNCi0JCQkJZm91bmRbM10gPSB0cnVlOw0KLQkJCX0JCQkNCi0JCX0NCi0JCQ0KLQkJZm9yIChpbnQgaT0wOyBpIDwgZm91bmQubGVuZ3RoOyBpKyspIA0KLQkJew0KLQkJCWFzc2VydFRydWUoIkFubm90YXRpb24gcGFyYW0gIiArIHBhcmFtc1tpXSArICIgbm90IGZvdW5kIiwgZm91bmRbaV0pOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgY2xhc3MgTXlXc1NlcmlhbGl6ZXJBZGFwdGVyIGV4dGVuZHMgV3NTZXJpYWxpemVyQWRhcHRlcg0KLQl7DQotCQlwdWJsaWMgTXlXc1NlcmlhbGl6ZXJBZGFwdGVyKEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UpIHsNCi0JCQlzdXBlcihyZXNvdXJjZSk7DQotCQl9DQotDQotCQlAT3ZlcnJpZGUNCi0JCXB1YmxpYyBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBjcmVhdGVJQW5ub3RhdGlvbihmaW5hbCBJV2ViU2VydmljZSB3cywgZmluYWwgSUphdmFNb2RlbCBqYXZhTW9kZWwpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JCXsNCi0JCQlyZXR1cm4gc3VwZXIuY3JlYXRlSUFubm90YXRpb24od3MsIGphdmFNb2RlbCk7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N0YXRlL01ldGhvZFByb3BlcnR5U3RhdGVBZGFwdGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N0YXRlL01ldGhvZFByb3BlcnR5U3RhdGVBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTg1YWRiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zdGF0ZS9NZXRob2RQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zdGF0ZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlLk1ldGhvZFByb3BlcnR5U3RhdGVBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3RhdGUuUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIENsYXNzIGNvbnRhaW5pbmcgdGVzdHMgZm9yIHtAbGluayBNZXRob2RQcm9wZXJ0eVN0YXRlQWRhcHRlcn0NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIE1ldGhvZFByb3BlcnR5U3RhdGVBZGFwdGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIA0KLXsNCi0JcHJpdmF0ZSBJV2ViTWV0aG9kIHdtOw0KLQlwcml2YXRlIElXZWJTZXJ2aWNlIHdzOw0KLQlwcml2YXRlIElQcm9wZXJ0eVN0YXRlIGFkYXB0ZXI7IA0KLQkNCi0JcHVibGljIHZvaWQgc2V0VXAoKQkNCi0Jew0KLQkJd20gPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViTWV0aG9kKCk7DQotCQl3cyA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotCQkNCi0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOw0KLQkJc2VpLmdldFdlYk1ldGhvZHMoKS5hZGQod20pOw0KLQkJc2VpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuYWRkKHdzKTsNCi0JCWFkYXB0ZXIgPSAoSVByb3BlcnR5U3RhdGUpUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdtLCBJUHJvcGVydHlTdGF0ZS5jbGFzcyk7DQotCQlhc3NlcnROb3ROdWxsKGFkYXB0ZXIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDaGFuZ2VibGVPdXRzaWRlSW5XcygpIA0KLQl7DQotCQl3cy5zZXRXc2RsTG9jYXRpb24oIkM6L3Rlc3Qvd3NkbC9sb2NhdGlvbiIpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfTUVUSE9EX19FWENMVURFRCkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1NUWUxFKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfVVNFKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJc0NoYW5nYWJsZSgpDQotCXsNCi0JCWFzc2VydFRydWUoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfTUVUSE9EX19FWENMVURFRCkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1NUWUxFKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfVVNFKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N0YXRlL1BhcmFtZXRlclByb3BlcnR5U3RhdGVBZGFwdGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N0YXRlL1BhcmFtZXRlclByb3BlcnR5U3RhdGVBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyODQyMjA5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zdGF0ZS9QYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3RhdGU7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZS5QYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyUHJvcGVydHlTdGF0ZUFkYXB0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UNCi17DQotCXByaXZhdGUgUGFyYW1ldGVyUHJvcGVydHlTdGF0ZUFkYXB0ZXIgYWRhcHRlcjs7DQotCXByaXZhdGUgSVdlYlBhcmFtIHBhcmFtOw0KLQlwcml2YXRlIElXZWJNZXRob2QgbWV0aG9kOw0KLQlwcml2YXRlIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHNldFVwKCkNCi0JewkJDQotCQlzZWkgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotCQltZXRob2QgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViTWV0aG9kKCk7DQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UKTsNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1VzZShTT0FQQmluZGluZ1VzZS5MSVRFUkFMKTsNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCk7DQotCQlzZWkuZ2V0V2ViTWV0aG9kcygpLmFkZChtZXRob2QpOw0KLQkJDQotCQlwYXJhbSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJQYXJhbSgpOw0KLQkJcGFyYW0uZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCAidGVzdFBhcmFtIik7DQotCQlwYXJhbS5zZXROYW1lKCJ0ZXN0UGFyYW0iKTsNCi0JCW1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuYWRkKHBhcmFtKTsNCi0JCQ0KLQkJYWRhcHRlciA9IG5ldyBQYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlcigpOw0KLQkJYWRhcHRlci5zZXRUYXJnZXQocGFyYW0pOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDaGFnZWJsZU5hbWVDb3JyZWN0U29hcEJpbmRpbmcoKQ0KLQl7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDaGFnZWJsZU5hbWVJbmNvcnJlY3RTb2FwQmluZGluZygpDQotCXsNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUuUlBDKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOw0KLQkJDQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UKTsNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1VzZShTT0FQQmluZGluZ1VzZS5FTkNPREVEKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOw0KLQkJDQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdVc2UoU09BUEJpbmRpbmdVc2UuTElURVJBTCk7DQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCX0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDaGFnZWJsZU5hbWVQYXJhbUluSGVhZGVyKCkNCi0Jew0KLQkJcGFyYW0uc2V0SGVhZGVyKHRydWUpOw0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZS5SUEMpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsJCQ0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzQ2hhZ2VibGVUYXJnZXROU0NvcnJlY3RTb2FwQmluZGluZygpDQotCXsNCi0JCWFzc2VydFRydWUoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJc0NoYWdlYmxlVGFyZ2V0TlNJbmNvcnJlY3RTb2FwQmluZGluZygpDQotCXsNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUuUlBDKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSkpOw0KLQkJDQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UKTsNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1VzZShTT0FQQmluZGluZ1VzZS5FTkNPREVEKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSkpOw0KLQkJDQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdVc2UoU09BUEJpbmRpbmdVc2UuTElURVJBTCk7DQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJc0NoYWdlYmxlVGFyZ2V0TlNQYXJhbUluSGVhZGVyKCkNCi0Jew0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZS5SUEMpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFKSk7DQotCQlwYXJhbS5zZXRIZWFkZXIodHJ1ZSk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSkpOw0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzQ2hhZ2VibGVQYXJ0TmFtZUNvcnJlY3RTb2FwQmluZGluZygpDQotCXsNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUuUlBDKTsJCQ0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1BBUlRfTkFNRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDaGFnZWJsZVBhcnROYW1lSW5jb3JyZWN0U29hcEJpbmRpbmcoKQ0KLQl7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1BBUlRfTkFNRSkpOw0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZS5SUEMpOw0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nVXNlKFNPQVBCaW5kaW5nVXNlLkVOQ09ERUQpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19QQVJUX05BTUUpKTsNCi0JCQ0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nVXNlKFNPQVBCaW5kaW5nVXNlLkxJVEVSQUwpOw0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fUEFSVF9OQU1FKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJc0NoYWdlYmxlVGFyZ2V0TlNIZWFkZXIoKSANCi0Jew0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19IRUFERVIpKTsNCi0NCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUuUlBDKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fSEVBREVSKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RSZXR1cm5QYXJhbU5vdEVkaXRhYmxlKCkNCi0Jew0KLQkJcGFyYW0uZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCAicmV0dXJuIik7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fUEFSVF9OQU1FKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JCQ0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZS5SUEMpOwkJDQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fUEFSVF9OQU1FKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdE91dHNpZGVJbldlYlNlcnZpY2UoKQ0KLQl7DQotCQlJV2ViU2VydmljZSB3cyA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotCQl3cy5zZXRXc2RsTG9jYXRpb24oIkM6L3Rlc3Qvd3NkbC9sb2NhdGlvbiIpOw0KLQkJc2VpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuYWRkKHdzKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19QQVJUX05BTUUpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSkpOw0KLQkJDQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlLlJQQyk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fUEFSVF9OQU1FKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3RhdGUvUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N0YXRlL1Byb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWJjYmZjMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3RhdGUvUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN0YXRlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlLlByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlLlNlaVByb3BlcnR5U3RhdGVBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3RhdGUuV3NQcm9wZXJ0eVN0YXRlQWRhcHRlcjsNCi0NCi0vKioNCi0gKiBUZXN0cyBmb3Ige0BsaW5rIFByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeX0gY2xhc3MNCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpDQotCXsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNGYWN0b3J5Rm9yVHlwZSgpCQ0KLQl7CQkNCi0JCWFzc2VydFRydWUoUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmlzRmFjdG9yeUZvclR5cGUoSVByb3BlcnR5U3RhdGUuY2xhc3MpKTsNCi0JCWFzc2VydEZhbHNlKFByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5pc0ZhY3RvcnlGb3JUeXBlKE5vdGlmaWNhdGlvbi5jbGFzcykpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RBZGFwdFdlYlNlcnZpY2UoKQ0KLQl7DQotCQlJV2ViU2VydmljZSB3ZWJTZXJ2aWNlID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2UoKTsNCi0JCUFkYXB0ZXIgYWRhcHRlcjEgPSBQcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQod2ViU2VydmljZSwgSVByb3BlcnR5U3RhdGUuY2xhc3MpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdlYlNlcnZpY2UuZUFkYXB0ZXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlcjEgaW5zdGFuY2VvZiBXc1Byb3BlcnR5U3RhdGVBZGFwdGVyKTsNCi0JCQ0KLQkJQWRhcHRlciBhZGFwdGVyMiA9IFByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdCh3ZWJTZXJ2aWNlLCBJUHJvcGVydHlTdGF0ZS5jbGFzcyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgd2ViU2VydmljZS5lQWRhcHRlcnMoKS5zaXplKCkpOw0KLQkJDQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIxPT1hZGFwdGVyMik7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RBZGFwdFNlaSgpDQotCXsNCi0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOw0KLQkJQWRhcHRlciBhZGFwdGVyMSA9IFByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChzZWksIElQcm9wZXJ0eVN0YXRlLmNsYXNzKTsNCi0JCWFzc2VydEVxdWFscygxLCBzZWkuZUFkYXB0ZXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlcjEgaW5zdGFuY2VvZiBTZWlQcm9wZXJ0eVN0YXRlQWRhcHRlcik7DQotCQkNCi0JCUFkYXB0ZXIgYWRhcHRlcjIgPSBQcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQoc2VpLCBJUHJvcGVydHlTdGF0ZS5jbGFzcyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgc2VpLmVBZGFwdGVycygpLnNpemUoKSk7DQotCQkNCi0JCWFzc2VydFRydWUoYWRhcHRlcjE9PWFkYXB0ZXIyKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3RhdGUvU2VpUHJvcGVydHlTdGF0ZUFkYXB0ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3RhdGUvU2VpUHJvcGVydHlTdGF0ZUFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY3OTU2NTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N0YXRlL1NlaVByb3BlcnR5U3RhdGVBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN0YXRlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlTdGF0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlLlByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBUZXN0IGZvciB7QCBTZWlQcm9wZXJ0eVN0YXRlQWRhcHRlcn0gY2xhc3MuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZWlQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCXByaXZhdGUgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWk7DQotCXByaXZhdGUgSVdlYlNlcnZpY2Ugd3M7IA0KLQkNCi0JcHVibGljIHZvaWQgc2V0VXAoKQ0KLQl7DQotCQlzZWkgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotCQl3cyA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotCQlzZWkuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5hZGQod3MpOw0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzQWRhcHRlZCgpDQotCXsNCi0JCUlQcm9wZXJ0eVN0YXRlIGFkYXB0ZXIgPSAoSVByb3BlcnR5U3RhdGUpUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHNlaSwgSVByb3BlcnR5U3RhdGUuY2xhc3MpOw0KLQkJYXNzZXJ0Tm90TnVsbChhZGFwdGVyKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDaGFuZ2VhYmxlT3V0c2lkZUluKCkgDQotCXsNCi0JCXdzLnNldFdzZGxMb2NhdGlvbigiQzovdGVzdCIpOw0KLQkJSVByb3BlcnR5U3RhdGUgYWRhcHRlciA9IChJUHJvcGVydHlTdGF0ZSlQcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQoc2VpLCBJUHJvcGVydHlTdGF0ZS5jbGFzcyk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzQ2hhbmdlYWxiZUluT3V0SW1wbGljaXRJbnRlcmZhY2UoKQ0KLQl7DQotCQlzZWkuZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTElDSVQsIEJvb2xlYW4uVFJVRSk7DQotCQkNCi0JCUlQcm9wZXJ0eVN0YXRlIGFkYXB0ZXIgPSAoSVByb3BlcnR5U3RhdGUpUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHNlaSwgSVByb3BlcnR5U3RhdGUuY2xhc3MpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzQ2hhbmdlYWJsZUluT3V0RXhwbGljaXRJbnRlcmZhY2UoKQ0KLQl7DQotCQlJUHJvcGVydHlTdGF0ZSBhZGFwdGVyID0gKElQcm9wZXJ0eVN0YXRlKVByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChzZWksIElQcm9wZXJ0eVN0YXRlLmNsYXNzKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTElDSVQpKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3RhdGUvV3NQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zdGF0ZS9Xc1Byb3BlcnR5U3RhdGVBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMTE5Njg5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zdGF0ZS9Xc1Byb3BlcnR5U3RhdGVBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN0YXRlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlTdGF0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlLlByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlLldzUHJvcGVydHlTdGF0ZUFkYXB0ZXI7DQotDQotLyoqDQotICogVGVzdHMgZm9yIHtAbGluayBXc1Byb3BlcnR5U3RhdGVBZGFwdGVyfSBjbGFzcy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFdzUHJvcGVydHlTdGF0ZUFkYXB0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UNCi17DQotCXByaXZhdGUgSVdlYlNlcnZpY2Ugd3M7DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpCXsNCi0JCXdzID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2UoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzQWRhcHRlZCgpIA0KLQl7DQotCQlJUHJvcGVydHlTdGF0ZSBhZGFwdGVyID0gKElQcm9wZXJ0eVN0YXRlKVByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdCh3cywgSVByb3BlcnR5U3RhdGUuY2xhc3MpOw0KLQkJYXNzZXJ0Tm90TnVsbChhZGFwdGVyKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDaGFuZ2VibGVPdXRzaWRlSW5XcygpIA0KLQl7DQotCQl3cy5zZXRXc2RsTG9jYXRpb24oIkM6L3Rlc3QiKTsNCi0JCUlQcm9wZXJ0eVN0YXRlIGFkYXB0ZXIgPSAoSVByb3BlcnR5U3RhdGUpUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdzLCBJUHJvcGVydHlTdGF0ZS5jbGFzcyk7DQotDQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX19QT1JUX05BTUUpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfU0VSVklDRV9fVEFSR0VUX05BTUVTUEFDRSkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT04pKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzQ2hhbmdhYmxlSW5PdXQoKQ0KLQl7DQotCQlJUHJvcGVydHlTdGF0ZSBhZGFwdGVyID0gKElQcm9wZXJ0eVN0YXRlKVByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdCh3cywgSVByb3BlcnR5U3RhdGUuY2xhc3MpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRSkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQpKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJc0NoYW5nZWJsZU5vbldzSW5zdGFuY2UoKQ0KLQl7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0JCUlQcm9wZXJ0eVN0YXRlIGFkYXB0ZXIgPSAoSVByb3BlcnR5U3RhdGUpUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdzLCBJUHJvcGVydHlTdGF0ZS5jbGFzcyk7DQotCQkoKEFkYXB0ZXIpYWRhcHRlcikuc2V0VGFyZ2V0KHNlaSk7DQotDQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsJCQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL0Fic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9BYnN0cmFjdE1vZGVsU3luY2hyb25pemVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZjhmZmJhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL0Fic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlLlNlcnZpY2VNb2RlbERhdGE7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jLkFic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotDQotLyoqDQotICogVGVzdHMgZm9yIHtAbGluayBBYnN0cmFjdE1vZGVsU3luY2hyb25pemVyfSBjbGFzcywgbWV0aG9kcyBub3QgY292ZXJlZCBpbiB0aGlzIHRlc3QNCi0gKiBhcmUgY292ZXJlZCBpbXBsaWNpdGx5IGJ5IHtAbGluayBNb2RlbFN5bmNocm9uaXphdGlvblRlc3RzfS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEFic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXJUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlDQotew0KLQlwcml2YXRlIEFic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXJUZXN0ZXIgbW9kZWxTeW5jOw0KLQlwcml2YXRlIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2U7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKQ0KLQl7DQotCQlNb2NrPElKYXZhTW9kZWw+IGphdmFNb2RlbE1vY2sgPSBtb2NrKElKYXZhTW9kZWwuY2xhc3MpOw0KLQkJcmVzb3VyY2UgPSBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWxNb2NrLnByb3h5KCkpOw0KLQkJDQotCQltb2RlbFN5bmMgPSBuZXcgQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplclRlc3RlcihyZXNvdXJjZSwgcmVzb3VyY2UubmV3IFNlcnZpY2VNb2RlbERhdGEoKSl7fTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFByb2Nlc3NDb21waWxhdGlvblVuaXRFZGl0RW5hYmxlZERlc3BpdGVOUEUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlhc3NlcnRUcnVlKHJlc291cmNlLmlzU2F2ZUVuYWJsZWQoKSk7DQotCQl0cnkgew0KLQkJCW1vZGVsU3luYy5wcm9jZXNzQ29tcGlsYXRpb25Vbml0KG51bGwsIG51bGwpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gXykgew0KLQkJfQ0KLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZS5pc1NhdmVFbmFibGVkKCkpOw0KLQl9CQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RQcm9jZXNzQ29tcGlsYXRpb25Vbml0RWRpdEVuYWJsZWROb3JtYWxFeGVjdXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlhc3NlcnRUcnVlKHJlc291cmNlLmlzU2F2ZUVuYWJsZWQoKSk7DQotCQlNb2NrPElDb21waWxhdGlvblVuaXQ+IGN1TW9jayA9IG1vY2soSUNvbXBpbGF0aW9uVW5pdC5jbGFzcyk7DQotCQljdU1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZmluZFByaW1hcnlUeXBlIikud2lsbChyZXR1cm5WYWx1ZShudWxsKSk7CQkJDQotCQltb2RlbFN5bmMucHJvY2Vzc0NvbXBpbGF0aW9uVW5pdChudWxsLCBjdU1vY2sucHJveHkoKSk7DQotCQlhc3NlcnRUcnVlKHJlc291cmNlLmlzU2F2ZUVuYWJsZWQoKSk7DQotCX0JCQkNCi0JDQotCXB1YmxpYyBjbGFzcyBBYnN0cmFjdE1vZGVsU3luY2hyb25pemVyVGVzdGVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplcg0KLQl7DQotCQlwdWJsaWMgQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplclRlc3RlcihKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlLCBTZXJ2aWNlTW9kZWxEYXRhIHNlcnZpY2VEYXRhKSB7DQotCQkJc3VwZXIocmVzb3VyY2UsIHNlcnZpY2VEYXRhKTsNCi0JCX0NCi0JCQ0KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NvbXBpbGF0aW9uVW5pdChmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCQl7DQotCQkJc3VwZXIucHJvY2Vzc0NvbXBpbGF0aW9uVW5pdCh3c1Byb2plY3QsIGN1KTsNCi0JCX0JCQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL0ltcGxpY2l0U2VpTWV0aG9kU3luY2hyb25pemF0aW9uVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL0ltcGxpY2l0U2VpTWV0aG9kU3luY2hyb25pemF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWU5NzMzNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9JbXBsaWNpdFNlaU1ldGhvZFN5bmNocm9uaXphdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTW9kaWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Eb21VdGlsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JUHJvamVjdFNlbGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5Eb21UZXN0VXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam9icy5Kb2JVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBJbXBsaWNpdFNlaU1ldGhvZFN5bmNocm9uaXphdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UNCi17DQotDQotCXByaXZhdGUgVGVzdFByb2plY3QgdGVzdFByajE7DQotDQotCXByaXZhdGUgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSB0YXJnZXQ7DQotDQotCXByaXZhdGUgSUphdmFNb2RlbCBqYXZhTW9kZWw7DQotDQotCXByaXZhdGUgSVR5cGUgYmFzZUNsYXNzV2l0aFdzQW5ub3Q7DQotDQotCXByaXZhdGUgSVR5cGUgYmFzZUNsYXNzV2l0aG91dFdzQW5ub3Q7DQotDQotCXByaXZhdGUgSVR5cGUgd3NDbGFzczsNCi0NCi0JcHJpdmF0ZSBJV2ViU2VydmljZVByb2plY3Qgd3NQcmoxOw0KLQ0KLQlwcml2YXRlIElXZWJTZXJ2aWNlIHdzMTsNCi0NCi0JcHJpdmF0ZSBEb21UZXN0VXRpbHMgdXRpbCA9IG5ldyBEb21UZXN0VXRpbHMoKTsNCi0JcHJpdmF0ZSBEb21VdGlsIGRvbVV0aWwgPSBuZXcgRG9tVXRpbCgpOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgd3MxSW1wbE5hbWUgPSAiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEuV1MxIjsNCi0NCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWphdmFNb2RlbCA9IEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsNCi0JCXRhcmdldCA9IG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKGphdmFNb2RlbCkNCi0JCXsNCi0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgSVByb2plY3RTZWxlY3RvcltdIGdldFByb2plY3RTZWxlY3RvcnMoKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIG5ldyBJUHJvamVjdFNlbGVjdG9yW10geyBuZXcgSVByb2plY3RTZWxlY3RvcigpDQotCQkJCXsNCi0NCi0JCQkJCXB1YmxpYyBib29sZWFuIGFwcHJvdmUoSUphdmFQcm9qZWN0IHByaikNCi0JCQkJCXsNCi0JCQkJCQlyZXR1cm4gcHJqLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQkJCQl9DQotCQkJCX0gfTsNCi0JCQl9DQotDQotCQl9Ow0KLQkJdGVzdFByajEgPSBuZXcgVGVzdFByb2plY3QoIlRlc3RQcm9qZWN0MSIpOw0KLQkJdGVzdFByajEuY3JlYXRlU291cmNlRm9sZGVyKCJzcmMiKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jMSA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxIik7DQotDQotCQliYXNlQ2xhc3NXaXRob3V0V3NBbm5vdCA9IHRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIkJhc2VDbGFzc1dpdGhvdXRXc0Fubm90LmphdmEiLCAicHVibGljIGNsYXNzIEJhc2VDbGFzc1dpdGhvdXRXc0Fubm90IHtcbiINCi0JCQkJCQkJCQkJKyAiQGphdmF4Lmp3cy5XZWJNZXRob2QgcHVibGljIHZvaWQgYW5ub3RhdGlvbkluQmFzZU5vV1NDbGFzcygpe31cbiINCi0JCQkJCQkJCQkJKyAicHVibGljIHZvaWQgbm9Bbm5vdGF0aW9uSW5CYXNlTm9XU0NsYXNzKCl7fVxuIiArICJ2b2lkIG5vblB1YmxpY0luQmFzZU5vV1NDbGFzcygpIHt9XG4iDQotCQkJCQkJCQkJCSsgIkBqYXZheC5qd3MuV2ViTWV0aG9kIHB1YmxpYyB2b2lkIHRvT3ZlcnJpZGUoKSB7fVxuIg0KLQkJCQkJCQkJCQkrICJAamF2YXguandzLldlYk1ldGhvZChleGNsdWRlPXRydWUpIHB1YmxpYyB2b2lkIGV4Y2x1ZGVkUHVibGljSW5CYXNlTm9XU0NsYXNzKCkge31cbiIgKyAifSIpOw0KLQ0KLQkJYmFzZUNsYXNzV2l0aFdzQW5ub3QgPSB0ZXN0UHJqMQ0KLQkJCQkJCQkJCQkuY3JlYXRlVHlwZSgNCi0JCQkJCQkJCQkJCQkJCQkJCQltb2RlbFN5bmMxLA0KLQkJCQkJCQkJCQkJCQkJCQkJCSJCYXNlQ2xhc3NXaXRoV3NBbm5vdC5qYXZhIiwNCi0JCQkJCQkJCQkJCQkJCQkJCQkiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlIHB1YmxpYyBjbGFzcyBCYXNlQ2xhc3NXaXRoV3NBbm5vdCBleHRlbmRzIEJhc2VDbGFzc1dpdGhvdXRXc0Fubm90IHtcbiINCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSsgInB1YmxpYyB2b2lkIG5vV01Bbm5vYXRpb25JbkJhc2VXU0NsYXNzKCkge31cbiINCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSsgInZvaWQgbm9uUHVibGljSW5CYXNlV1NDbGFzcygpIHt9XG4iDQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkrICJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwibmFtZUluQmFzZUNsYXNzV2l0aEFubm90XCIpIHB1YmxpYyB2b2lkIHRvT3ZlcnJpZGUoKSB7fVxuIg0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKyAiQGphdmF4Lmp3cy5XZWJNZXRob2QoZXhjbHVkZT10cnVlKSBwdWJsaWMgdm9pZCBleGNsdWRlZFB1YmxpY0luQmFzZVdTQ2xhc3MoKSB7fVxuIg0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKyAifSIpOw0KLQ0KLQkJd3NDbGFzcyA9IHRlc3RQcmoxDQotCQkJCQkJCQkJCS5jcmVhdGVUeXBlKA0KLQkJCQkJCQkJCQkJCQkJCQkJCW1vZGVsU3luYzEsDQotCQkJCQkJCQkJCQkJCQkJCQkJIldTMS5qYXZhIiwNCi0JCQkJCQkJCQkJCQkJCQkJCQkiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJJbXBsaWNpdFNlaTFOYW1lXCIpIHB1YmxpYyBjbGFzcyBXUzEgZXh0ZW5kcyBCYXNlQ2xhc3NXaXRoV3NBbm5vdCB7XG4iDQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkrICJwdWJsaWMgdm9pZCBub1dNQW5ub3RhdGlvbkluV1NDbGFzcygpO1xuIg0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKyAidm9pZCBub25QdWJsaWNJbldTQ2xhc3MoKSB7fVxuIg0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKyAiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cIm5hbWVJbldzQ2xhc3NcIikgcHVibGljIHZvaWQgdG9PdmVycmlkZSgpIHt9XG4iDQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkrICJAamF2YXguandzLldlYk1ldGhvZChleGNsdWRlPXRydWUpIHB1YmxpYyB2b2lkIGV4Y2x1ZGVkUHVibGljSW5XU0NsYXNzKCkge31cbiINCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSsgIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJ3ZWJOYW1lXCIsIGV4Y2x1ZGU9dHJ1ZSkgcHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NXaXRoQW5ub3RhdGlvbigpe31cbiINCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSsgIn0iKTsNCi0JCQ0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJdGFyZ2V0LmxvYWQobnVsbCk7DQotCQlhc3NlcnRFcXVhbHMoIk9uZSBwcm9qZWN0cyB3ZXJlIGRlZmluZWQgYnV0IGEgZGlmZmVyZW50IG51bWJlciB3ZXJlIGZvdW5kIGluIHRoZSBET00iLCAxLCB0YXJnZXQuZ2V0RE9NKCkuZ2V0V2ViU2VydmljZVByb2plY3RzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscygyLCB0YXJnZXQuZ2V0RE9NKCkuZ2V0V2ViU2VydmljZVByb2plY3RzKCkuZ2V0KDApLmdldFdlYlNlcnZpY2VzKCkuc2l6ZSgpKTsNCi0JCXdzUHJqMSA9IGRvbVV0aWwuZmluZFByb2plY3RCeU5hbWUodGFyZ2V0LmdldERPTSgpLCB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3c1ByajEpOw0KLQkJd3MxID0gZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgd3MxSW1wbE5hbWUpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3czEpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kTm9Bbm5vdGF0aW9uU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2RFbGVtID0gdXRpbC5nZXRFeGlzdGluZ01ldGhvZCh3c0NsYXNzLCAibm9XTUFubm90YXRpb25JbldTQ2xhc3MiKTsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd20gPSBmaW5kV2ViTWV0aG9kQnlJbXBsKHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSwgY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW0pKTsNCi0JCWFzc2VydE5vdE51bGwod20pOw0KLQkJYXNzZXJ0RXF1YWxzKG1ldGhvZEVsZW0uZ2V0RWxlbWVudE5hbWUoKSwgd20uZ2V0TmFtZSgpKTsNCi0JCWFzc2VydFRydWUod20uZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7DQotCQlhc3NlcnRFcXVhbHMoY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW0pLCB3bS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWFzc2VydEZhbHNlKHdtLmlzRXhjbHVkZWQoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF9tZXRob2ROb0Fubm90YXRpb25JblBhcmVudFdpdGhXU0Fubm90YXRpb25TeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZEVsZW0gPSB1dGlsLmdldEV4aXN0aW5nTWV0aG9kKGJhc2VDbGFzc1dpdGhXc0Fubm90LCAibm9XTUFubm9hdGlvbkluQmFzZVdTQ2xhc3MiKTsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd20gPSBmaW5kV2ViTWV0aG9kQnlJbXBsKHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSwgY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW0pKTsNCi0JCWFzc2VydE5vdE51bGwod20pOw0KLQkJYXNzZXJ0RXF1YWxzKG1ldGhvZEVsZW0uZ2V0RWxlbWVudE5hbWUoKSwgd20uZ2V0TmFtZSgpKTsNCi0JCWFzc2VydFRydWUod20uZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7DQotCQlhc3NlcnRFcXVhbHMoY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW0pLCB3bS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWFzc2VydEZhbHNlKHdtLmlzRXhjbHVkZWQoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF9tZXRob2ROb0Fubm90YXRpb25JblBhcmVudFdpdGhvdXRXc0Fubm90YXRpb25Ob3RTeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZEVsZW0gPSB1dGlsLmdldEV4aXN0aW5nTWV0aG9kKGJhc2VDbGFzc1dpdGhvdXRXc0Fubm90LCAibm9Bbm5vdGF0aW9uSW5CYXNlTm9XU0NsYXNzIik7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdtID0gZmluZFdlYk1ldGhvZEJ5SW1wbCh3czEuZ2V0U2VydmljZUVuZHBvaW50KCksIGNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtKSk7DQotCQlhc3NlcnROdWxsKHdtKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZFdpdGhBbm5vdGF0aW9uSW5QYXJlbnRXaXRob3V0V3NBbm5vdGF0aW9uU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2RFbGVtQmFzZU5vV3NDbGFzcyA9IHV0aWwuZ2V0RXhpc3RpbmdNZXRob2QoYmFzZUNsYXNzV2l0aG91dFdzQW5ub3QsICJhbm5vdGF0aW9uSW5CYXNlTm9XU0NsYXNzIik7DQotCQlhc3NlcnROb3ROdWxsKGZpbmRXZWJNZXRob2RCeUltcGwod3MxLmdldFNlcnZpY2VFbmRwb2ludCgpLCBjYWxjSW1wbGVtZW50YXRpb24obWV0aG9kRWxlbUJhc2VOb1dzQ2xhc3MpKSk7DQotDQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF9ub25QdWJsaWNNZXRob2RUcm91Z2hIaWVyYXJjaHlOb3RTeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZEVsZW1CYXNlTm9Xc0NsYXNzID0gdXRpbC5nZXRFeGlzdGluZ01ldGhvZChiYXNlQ2xhc3NXaXRob3V0V3NBbm5vdCwgIm5vblB1YmxpY0luQmFzZU5vV1NDbGFzcyIpOw0KLQkJYXNzZXJ0RmFsc2UoTW9kaWZpZXIuaXNQdWJsaWMobWV0aG9kRWxlbUJhc2VOb1dzQ2xhc3MuZ2V0RmxhZ3MoKSkpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2RFbGVtQmFzZVdzQ2xhc3MgPSB1dGlsLmdldEV4aXN0aW5nTWV0aG9kKGJhc2VDbGFzc1dpdGhXc0Fubm90LCAibm9uUHVibGljSW5CYXNlV1NDbGFzcyIpOw0KLQkJYXNzZXJ0RmFsc2UoTW9kaWZpZXIuaXNQdWJsaWMobWV0aG9kRWxlbUJhc2VXc0NsYXNzLmdldEZsYWdzKCkpKTsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kRWxlbVdzQ2xhc3MgPSB1dGlsLmdldEV4aXN0aW5nTWV0aG9kKHdzQ2xhc3MsICJub25QdWJsaWNJbldTQ2xhc3MiKTsNCi0JCWFzc2VydEZhbHNlKE1vZGlmaWVyLmlzUHVibGljKG1ldGhvZEVsZW1Xc0NsYXNzLmdldEZsYWdzKCkpKTsNCi0NCi0JCWFzc2VydE51bGwoZmluZFdlYk1ldGhvZEJ5SW1wbCh3czEuZ2V0U2VydmljZUVuZHBvaW50KCksIGNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtQmFzZU5vV3NDbGFzcykpKTsNCi0JCWFzc2VydE51bGwoZmluZFdlYk1ldGhvZEJ5SW1wbCh3czEuZ2V0U2VydmljZUVuZHBvaW50KCksIGNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtQmFzZVdzQ2xhc3MpKSk7DQotCQlhc3NlcnROdWxsKGZpbmRXZWJNZXRob2RCeUltcGwod3MxLmdldFNlcnZpY2VFbmRwb2ludCgpLCBjYWxjSW1wbGVtZW50YXRpb24obWV0aG9kRWxlbVdzQ2xhc3MpKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF9leGNsdWRlZE1ldGhvZFRyb3VnaEhpZXJhcmNoeU5vdFN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kRWxlbUJhc2VOb1dzQ2xhc3MgPSB1dGlsLmdldEV4aXN0aW5nTWV0aG9kKGJhc2VDbGFzc1dpdGhvdXRXc0Fubm90LCAiZXhjbHVkZWRQdWJsaWNJbkJhc2VOb1dTQ2xhc3MiKTsNCi0JCWFzc2VydFRydWUoTW9kaWZpZXIuaXNQdWJsaWMobWV0aG9kRWxlbUJhc2VOb1dzQ2xhc3MuZ2V0RmxhZ3MoKSkpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2RFbGVtQmFzZVdzQ2xhc3MgPSB1dGlsLmdldEV4aXN0aW5nTWV0aG9kKGJhc2VDbGFzc1dpdGhXc0Fubm90LCAiZXhjbHVkZWRQdWJsaWNJbkJhc2VXU0NsYXNzIik7DQotCQlhc3NlcnRUcnVlKE1vZGlmaWVyLmlzUHVibGljKG1ldGhvZEVsZW1CYXNlV3NDbGFzcy5nZXRGbGFncygpKSk7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZEVsZW1Xc0NsYXNzID0gdXRpbC5nZXRFeGlzdGluZ01ldGhvZCh3c0NsYXNzLCAiZXhjbHVkZWRQdWJsaWNJbldTQ2xhc3MiKTsNCi0JCWFzc2VydFRydWUoTW9kaWZpZXIuaXNQdWJsaWMobWV0aG9kRWxlbVdzQ2xhc3MuZ2V0RmxhZ3MoKSkpOw0KLQ0KLQkJYXNzZXJ0TnVsbChmaW5kV2ViTWV0aG9kQnlJbXBsKHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSwgY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW1CYXNlTm9Xc0NsYXNzKSkpOw0KLQkJYXNzZXJ0TnVsbChmaW5kV2ViTWV0aG9kQnlJbXBsKHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSwgY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW1CYXNlV3NDbGFzcykpKTsNCi0JCWFzc2VydE51bGwoZmluZFdlYk1ldGhvZEJ5SW1wbCh3czEuZ2V0U2VydmljZUVuZHBvaW50KCksIGNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtV3NDbGFzcykpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X292ZXJyaWRlTWV0aG9kc0xvYWRlZFByb3Blcmx5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZEVsZW1CYXNlTm9Xc0NsYXNzID0gdXRpbC5nZXRFeGlzdGluZ01ldGhvZChiYXNlQ2xhc3NXaXRob3V0V3NBbm5vdCwgInRvT3ZlcnJpZGUiKTsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd20gPSBmaW5kV2ViTWV0aG9kQnlJbXBsKHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSwgY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW1CYXNlTm9Xc0NsYXNzKSk7DQotCQlhc3NlcnROb3ROdWxsKHdtKTsNCi0JCWFzc2VydEVxdWFscygibmFtZUluV3NDbGFzcyIsIHdtLmdldE5hbWUoKSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBJV2ViTWV0aG9kIGZpbmRXZWJNZXRob2RCeUltcGwoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIFN0cmluZyBpbXBsKQ0KLQl7DQotCQlmb3IgKElXZWJNZXRob2Qgd20gOiBzZWkuZ2V0V2ViTWV0aG9kcygpKQ0KLQkJew0KLQkJCWlmICh3bS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhpbXBsKSkNCi0JCQl7DQotCQkJCXJldHVybiB3bTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlwcml2YXRlIFN0cmluZyBjYWxjSW1wbGVtZW50YXRpb24oSU1ldGhvZCBtKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXJldHVybiBtLmdldEVsZW1lbnROYW1lKCkgKyBtLmdldFNpZ25hdHVyZSgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL01ldGhvZFBhcmFtc1N5bmNocm9uaXphdGlvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9NZXRob2RQYXJhbXNTeW5jaHJvbml6YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YzNiMzE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL01ldGhvZFBhcmFtc1N5bmNocm9uaXphdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Eb21VdGlsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklQcm9qZWN0U2VsZWN0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYy5QYXJhbWV0ZXJTeW5jaHJvbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuRG9tVGVzdFV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLklXYWl0Q29uZGl0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmFzc2VydGlvbnMuQXNzZXJ0aW9uczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qb2JzLkpvYlV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdEVqYjNQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotDQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpDQotcHVibGljIGNsYXNzIE1ldGhvZFBhcmFtc1N5bmNocm9uaXphdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UNCi17DQotCXByaXZhdGUgVGVzdEVqYjNQcm9qZWN0IHRlc3RFamJQcmoxOw0KLQlwcml2YXRlIElKYXZhUHJvamVjdCB0ZXN0UHJqMTsNCi0JcHJpdmF0ZSBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHRhcmdldDsNCi0JcHJpdmF0ZSBJSmF2YU1vZGVsIGphdmFNb2RlbDsNCi0JcHJpdmF0ZSBJVHlwZSBzZWkxVHlwZTsNCi0NCi0JcHJpdmF0ZSBJV2ViU2VydmljZVByb2plY3Qgd3NQcmoxOw0KLQlwcml2YXRlIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpMTsNCi0NCi0JcHJpdmF0ZSBEb21VdGlsIGRvbVV0aWwgPSBuZXcgRG9tVXRpbCgpOw0KLQlwcml2YXRlIERvbVRlc3RVdGlscyB0ZXN0VXRpbCA9IG5ldyBEb21UZXN0VXRpbHMoKTsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNlaTFJbXBsTmFtZSA9ICJjb20uc2FwLnRlc3QubW9kZWxzeW5jMS5TZWkxIjsNCi0NCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWphdmFNb2RlbCA9IEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsNCi0JCXRhcmdldCA9IG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKGphdmFNb2RlbCkgDQotCQl7DQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIElQcm9qZWN0U2VsZWN0b3JbXSBnZXRQcm9qZWN0U2VsZWN0b3JzKCkNCi0JCQl7DQotCQkJCXJldHVybiBuZXcgSVByb2plY3RTZWxlY3RvcltdIHsgbmV3IElQcm9qZWN0U2VsZWN0b3IoKSANCi0JCQkJew0KLQkJCQkJcHVibGljIGJvb2xlYW4gYXBwcm92ZShJSmF2YVByb2plY3QgcHJqKSB7DQotCQkJCQkJcmV0dXJuIHByai5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyh0ZXN0UHJqMS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCQkJCX0NCi0JCQkJfX07DQotCQkJfQ0KLQkJCQ0KLQkJfTsNCi0JCXRlc3RFamJQcmoxID0gbmV3IFRlc3RFamIzUHJvamVjdCgiVGVzdFByb2plY3QxIik7DQotCQl0ZXN0UHJqMSA9IEphdmFDb3JlLmNyZWF0ZSh0ZXN0RWpiUHJqMS5nZXRQcm9qZWN0KCkpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMxID0gdGVzdFByajEuZmluZFBhY2thZ2VGcmFnbWVudFJvb3QodGVzdEVqYlByajEuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkuYXBwZW5kKCJlamJNb2R1bGUiKSkuY3JlYXRlUGFja2FnZUZyYWdtZW50KCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMSIsIGZhbHNlLCBudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQlhc3NlcnRUcnVlKG1vZGVsU3luYzEuZXhpc3RzKCkpOw0KLQkJDQotCQlmaW5hbCBTdHJpbmcgY29udGVudHMgPSAiaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nO1xuaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7XG5AamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTFOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMSB7fSI7DQotCQlzZWkxVHlwZSA9IGNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIlNlaTEuamF2YSIsIGNvbnRlbnRzKTsNCi0JCWNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIkNsYXNzMS5qYXZhIiwgInB1YmxpYyBjbGFzcyBDbGFzczEge30iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCXRhcmdldC5sb2FkKG51bGwpOw0KLQkJYXNzZXJ0RXF1YWxzKCJPbmUgcHJvamVjdHMgd2VyZSBkZWZpbmVkIGJ1dCBhIGRpZmZlcmVudCBudW1iZXIgd2VyZSBmb3VuZCBpbiB0aGUgRE9NIiwgMSwgdGFyZ2V0LmdldERPTSgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgdGFyZ2V0LmdldERPTSgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpLmdldCgwKS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuc2l6ZSgpKTsNCi0JCXdzUHJqMSA9IGRvbVV0aWwuZmluZFByb2plY3RCeU5hbWUodGFyZ2V0LmdldERPTSgpLCB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3c1ByajEpOw0KLQkJc2VpMSA9IGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoxLCBzZWkxSW1wbE5hbWUpOw0KLQkJYXNzZXJ0Tm90TnVsbChzZWkxKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJVHlwZSBjcmVhdGVUeXBlKElQYWNrYWdlRnJhZ21lbnQgcGFjaywgU3RyaW5nIGNvbXBVbml0LCBTdHJpbmcgY29udGVudHMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0JCWJ1Zi5hcHBlbmQoInBhY2thZ2UgIiArIHBhY2suZ2V0RWxlbWVudE5hbWUoKSArICI7XG4iKTsNCi0JCWJ1Zi5hcHBlbmQoIlxuIik7DQotCQlidWYuYXBwZW5kKGNvbnRlbnRzKTsNCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBwYWNrLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChjb21wVW5pdCwgYnVmLnRvU3RyaW5nKCksIGZhbHNlLCBudWxsKTsNCi0JCXJldHVybiBjdS5nZXRUeXBlcygpWzBdOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RvcFN5bmNocm9uaXppbmcoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF92b2lkTWV0aG9kV2l0aE5vQXJnc1N5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElNZXRob2Qgdm9pZE5vQXJncyA9IHNlaTFUeXBlLmNyZWF0ZU1ldGhvZCgicHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NOb0Fubm90YXRpb24oKTtcbiIsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCXdhaXRNZXRob2RMb2FkZWRJbkRvbShzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbih2b2lkTm9BcmdzKSk7DQotCQkNCi0JCWZpbmFsIElXZWJNZXRob2Qgd3NNZXRob2QgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24odm9pZE5vQXJncykpOw0KLQkJYXNzZXJ0RXF1YWxzKDAsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X25vblZvaWRNZXRob2RXaXRoTm9BcmdzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJTWV0aG9kIG5vblZvaWROb0FyZ3MgPSBzZWkxVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyBDbGFzczEgbm9uVm9pZE1ldGhvZFdpdGhOb0FyZ3MoKTtcbiIsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCXdhaXRNZXRob2RMb2FkZWRJbkRvbShzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihub25Wb2lkTm9BcmdzKSk7DQotCQkNCi0JCWZpbmFsIElXZWJNZXRob2Qgd3NNZXRob2QgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obm9uVm9pZE5vQXJncykpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJyZXR1cm4iLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7DQotCQlhc3NlcnRFcXVhbHMoV2ViUGFyYW1LaW5kLk9VVCwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRLaW5kKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJRQ2xhc3MxOyIsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0VHlwZU5hbWUoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF92b2lkTWV0aG9kV2l0aFByaW1pdGl2ZUFyZygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QgPSBzZWkxVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoUHJpbWl0aXZlQXJnKGludCBwYXJhbTEpO1xuIiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJd2FpdE1ldGhvZExvYWRlZEluRG9tKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdzTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJhcmcwIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFdlYlBhcmFtS2luZC5JTiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRLaW5kKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJJIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRUeXBlTmFtZSgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3ZvaWRNZXRob2RXaXRoTm9uUGFyYW1ldGVyaXplZEhvbGRlclBhcmFtKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZCA9IHNlaTFUeXBlLmNyZWF0ZU1ldGhvZCgicHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhQYXJhbWV0ZXJpemVkSG9sZGVyUGFyYW0oSG9sZGVyIHBhcmFtMSk7IiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJd2FpdE1ldGhvZExvYWRlZEluRG9tKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdzTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJhcmcwIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXROYW1lKCkpOw0KLQkJLy9GSVhNRSBjb21tZW50aW5nIG91dCBmb3IgYnVpbGQgaW50ZWdyYXRpb24uIFRocm93aW5nIGFuIGFzc2VydGlvbiBlcnJvcjogZXhwZWN0ZWQgSU5PVVQgYnV0IHdhcyBJTg0KLQkJLy9hc3NlcnRFcXVhbHMoV2ViUGFyYW1LaW5kLklOT1VULCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldEtpbmQoKSk7DQotCQlhc3NlcnRFcXVhbHMoIlFIb2xkZXI7Iiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRUeXBlTmFtZSgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3ZvaWRNZXRob2RXaXRoUGFyYW1ldGVyaXplZEhvbGRlclBhcmFtKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZCA9IHNlaTFUeXBlLmNyZWF0ZU1ldGhvZCgicHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhQYXJhbWV0ZXJpemVkSG9sZGVyUGFyYW0oamF2YXgueG1sLndzLkhvbGRlcjxDbGFzczE+IHBhcmFtMSk7IiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJd2FpdE1ldGhvZExvYWRlZEluRG9tKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdzTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJhcmcwIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXROYW1lKCkpOw0KLQkJLy9GSVhNRSBjb21tZW50aW5nIG91dCBmb3IgYnVpbGQgaW50ZWdyYXRpb24uIFRocm93aW5nIGFuIGFzc2VydGlvbiBlcnJvcjogZXhwZWN0ZWQgSU5PVVQgYnV0IHdhcyBJTg0KLQkJLy9hc3NlcnRFcXVhbHMoV2ViUGFyYW1LaW5kLklOT1VULCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldEtpbmQoKSk7DQotCQlhc3NlcnRFcXVhbHMoIlFqYXZheC54bWwud3MuSG9sZGVyPFFDbGFzczE7PjsiLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldFR5cGVOYW1lKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RfcGFyYW1OYW1lRGVmYXVsdFN1bmNocm9uaXplZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QgPSBzZWkxVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyB2b2lkIG1ldGhvZDEoaW50IHBhcmFtKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQl3YWl0TWV0aG9kTG9hZGVkSW5Eb20oc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQkNCi0JCWZpbmFsIElXZWJNZXRob2Qgd3NNZXRob2QgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQlhc3NlcnRFcXVhbHMoImFyZzAiLCB0ZXN0VXRpbC5maW5kUGFyYW0od3NNZXRob2QsICJwYXJhbSIpLmdldE5hbWUoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfcGFyYW1OYW1lU3VuY2hyb25pemVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZCA9IHNlaTFUeXBlLmNyZWF0ZU1ldGhvZCgicHVibGljIGludCBtZXRob2QyKEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZT1cInBhcmFtXCIsIGhlYWRlcj10cnVlKSBpbnQgcGFyYW0xKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQl3YWl0TWV0aG9kTG9hZGVkSW5Eb20oc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQkNCi0JCWZpbmFsIElXZWJNZXRob2Qgd3NNZXRob2QgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQlhc3NlcnRFcXVhbHMoInBhcmFtIiwgdGVzdFV0aWwuZmluZFBhcmFtKHdzTWV0aG9kLCAicGFyYW0xIikuZ2V0TmFtZSgpKTsJCQ0KLQkJYXNzZXJ0RXF1YWxzKCJyZXR1cm4iLCB0ZXN0VXRpbC5maW5kUGFyYW0od3NNZXRob2QsICJyZXR1cm4iKS5nZXROYW1lKCkpOwkJDQotDQotCQkvLyBvcGVyYXRpb24gaXMgRG9jdW1lbnQvQmFyZSAtIHRoZSBwYXJhbWV0ZXJzIHVzZSBtZXRob2QgbmFtZQ0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QyID0gc2VpMVR5cGUuY3JlYXRlTWV0aG9kKCJAU09BUEJpbmRpbmcoc3R5bGU9U09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQsIHBhcmFtZXRlclN0eWxlPVNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpXG4iICsNCi0JCQkJInB1YmxpYyBpbnQgbWV0aG9kMyhpbnQgcGFyYW0xKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQl3YWl0TWV0aG9kTG9hZGVkSW5Eb20oc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kMikpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdzTWV0aG9kMiA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QyKSk7DQotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZDNSZXNwb25zZSIsIHRlc3RVdGlsLmZpbmRQYXJhbSh3c01ldGhvZDIsICJyZXR1cm4iKS5nZXROYW1lKCkpOwkNCi0JCWFzc2VydEVxdWFscygibWV0aG9kMyIsIHRlc3RVdGlsLmZpbmRQYXJhbSh3c01ldGhvZDIsICJwYXJhbTEiKS5nZXROYW1lKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3BhcmFtSGVhZGVyRGVmYXVsdFN5bmNyb21pemVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZDEgPSBzZWkxVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyB2b2lkIG1ldGhvZDIoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwicGFyYW0xXCIpIGludCBwYXJhbTEpOyIsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQl3YWl0TWV0aG9kTG9hZGVkSW5Eb20oc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kMSkpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdzTWV0aG9kMSA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QxKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgd3NNZXRob2QxLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJwYXJhbTEiLCB3c01ldGhvZDEuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0RmFsc2Uod3NNZXRob2QxLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuaXNIZWFkZXIoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF9wYXJhbUhlYWRlckZhbHNlU3luY3JvbWl6ZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kMiA9IHNlaTFUeXBlLmNyZWF0ZU1ldGhvZCgicHVibGljIHZvaWQgbWV0aG9kMihAamF2YXguandzLldlYlBhcmFtKG5hbWU9XCJwYXJhbTFcIiwgaGVhZGVyPWZhbHNlKSBpbnQgcGFyYW0xKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQl3YWl0TWV0aG9kTG9hZGVkSW5Eb20oc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kMikpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdzTWV0aG9kMiA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QyKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgd3NNZXRob2QyLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJwYXJhbTEiLCB3c01ldGhvZDIuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0RmFsc2Uod3NNZXRob2QyLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuaXNIZWFkZXIoKSk7CQkNCi0JfQkNCi0NCi0JcHVibGljIHZvaWQgdGVzdF9wYXJhbUhlYWRlclRydWVTeW5jcm9taXplZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QyID0gc2VpMVR5cGUuY3JlYXRlTWV0aG9kKCJwdWJsaWMgdm9pZCBtZXRob2QyKEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZT1cInBhcmFtMVwiLCBoZWFkZXI9dHJ1ZSkgaW50IHBhcmFtMSk7IiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJd2FpdE1ldGhvZExvYWRlZEluRG9tKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZDIpKTsNCi0JCQ0KLQkJZmluYWwgSVdlYk1ldGhvZCB3c01ldGhvZDIgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kMikpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzTWV0aG9kMi5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscygicGFyYW0xIiwgd3NNZXRob2QyLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsNCi0JCWFzc2VydFRydWUod3NNZXRob2QyLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuaXNIZWFkZXIoKSk7CQkNCi0JfQkJDQotDQotCXB1YmxpYyB2b2lkIHRlc3RfcGFyYW1QYXJ0TmFtZURlZmF1bHQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kID0gc2VpMVR5cGUuY3JlYXRlTWV0aG9kKCJwdWJsaWMgdm9pZCB2b2lkTWV0aG9kRXhjbHVkZWQoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwicGFyYW1BXCIpIGludCBhKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQl3YWl0TWV0aG9kTG9hZGVkSW5Eb20oc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQkNCi0JCWZpbmFsIElXZWJNZXRob2Qgd3NNZXRob2QgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoV2ViUGFyYW1LaW5kLklOLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldEtpbmQoKSk7DQotCQlhc3NlcnRFcXVhbHMoIkkiLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldFR5cGVOYW1lKCkpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoInBhcmFtQSIsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsNCi0JCWFzc2VydEVxdWFscygicGFyYW1BIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRQYXJ0TmFtZSgpKTsJCQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RfcGFyYW1QYXJ0TmFtZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QgPSBzZWkxVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyB2b2lkIHZvaWRNZXRob2RFeGNsdWRlZChAamF2YXguandzLldlYlBhcmFtKG5hbWU9XCJwYXJhbUFcIiwgcGFydE5hbWU9XCJwYXJ0TmFtZUFcIikgaW50IGEpOyIsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCXdhaXRNZXRob2RMb2FkZWRJbkRvbShzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QpKTsNCi0JCQ0KLQkJZmluYWwgSVdlYk1ldGhvZCB3c01ldGhvZCA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QpKTsNCi0JCWFzc2VydEVxdWFscygxLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscyhXZWJQYXJhbUtpbmQuSU4sIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0S2luZCgpKTsNCi0JCWFzc2VydEVxdWFscygiSSIsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0VHlwZU5hbWUoKSk7DQotCQkNCi0JCWFzc2VydEVxdWFscygicGFyYW1BIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJwYXJ0TmFtZUEiLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldFBhcnROYW1lKCkpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfcGFyYW1UYXJnZXROYW1lc3BhY2VEZWZhdWx0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7CQkNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kID0gc2VpMVR5cGUuY3JlYXRlTWV0aG9kKCJwdWJsaWMgdm9pZCB2b2lkTWV0aG9kRXhjbHVkZWQoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwicGFyYW1BXCIpIGludCBhKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQl3YWl0TWV0aG9kTG9hZGVkSW5Eb20oc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQkNCi0JCWZpbmFsIElXZWJNZXRob2Qgd3NNZXRob2QgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoV2ViUGFyYW1LaW5kLklOLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldEtpbmQoKSk7DQotCQlhc3NlcnRFcXVhbHMoIkkiLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldFR5cGVOYW1lKCkpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoInBhcmFtQSIsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsNCi0JCWFzc2VydEVxdWFscygiIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7CQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9wYXJhbVRhcmdldE5hbWVzcGFjZUVtcHR5TnMoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsJCQ0KLQkJLy8gcGFyYW1ldGVyIGlzIG5vdCBpbiB0aGUgaGVhZGVyDQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZCA9IHNlaTFUeXBlLmNyZWF0ZU1ldGhvZCgiQFNPQVBCaW5kaW5nKHN0eWxlPVNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5ULCBwYXJhbWV0ZXJTdHlsZT1TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKSAiICsNCi0JCQkJInB1YmxpYyB2b2lkIG1ldGhvZDMoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwicGFyYW1cIiwgaGVhZGVyPWZhbHNlKSBpbnQgcGFyYW0xKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQl3YWl0TWV0aG9kTG9hZGVkSW5Eb20oc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQkNCi0JCWZpbmFsIElXZWJNZXRob2Qgd3NNZXRob2QgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQlhc3NlcnRFcXVhbHMoIiIsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOw0KLQkJDQotCQkvLyBwYXJhbWV0ZXIgaXMgaW4gaGVhZGVyDQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZDIgPSBzZWkxVHlwZS5jcmVhdGVNZXRob2QoIkBTT0FQQmluZGluZyhzdHlsZT1TT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVCwgcGFyYW1ldGVyU3R5bGU9U09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuV1JBUFBFRClcbiIgKw0KLQkJCQkicHVibGljIHZvaWQgbWV0aG9kNChAamF2YXguandzLldlYlBhcmFtKG5hbWU9XCJwYXJhbVwiLCBoZWFkZXI9dHJ1ZSkgaW50IHBhcmFtMSk7IiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJd2FpdE1ldGhvZExvYWRlZEluRG9tKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZDIpKTsNCi0JCQ0KLQkJZmluYWwgSVdlYk1ldGhvZCB3c01ldGhvZDIgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kMikpOw0KLQkJYXNzZXJ0RXF1YWxzKCJodHRwOi8vc2FwLmNvbS90ZXN0L21vZGVsc3luYzEvIiwgd3NNZXRob2QyLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfcGFyYW1UYXJnZXROYW1lc3BhY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsJCQ0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QgPSBzZWkxVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyB2b2lkIHZvaWRNZXRob2RFeGNsdWRlZChAamF2YXguandzLldlYlBhcmFtKG5hbWU9XCJwYXJhbUFcIiwgdGFyZ2V0TmFtZXNwYWNlPVwiaHR0cDovL3RhcmdldE5zL1wiKSBpbnQgYSk7IiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJd2FpdE1ldGhvZExvYWRlZEluRG9tKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdzTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFdlYlBhcmFtS2luZC5JTiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRLaW5kKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJJIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRUeXBlTmFtZSgpKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKCJwYXJhbUEiLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7DQotCQlhc3NlcnRFcXVhbHMoImh0dHA6Ly90YXJnZXROcy8iLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldFRhcmdldE5hbWVzcGFjZSgpKTsJCQ0KLQl9CQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIHdhaXRNZXRob2RMb2FkZWRJbkRvbShmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSwgZmluYWwgU3RyaW5nIGltcGxlbWVudGF0aW9uKQ0KLQl7DQotCQlmaW5hbCBJV2FpdENvbmRpdGlvbiBjb25kaXRpb24gPSBuZXcgSVdhaXRDb25kaXRpb24oKXsNCi0JCQlwdWJsaWMgYm9vbGVhbiBjaGVja0NvbmRpdGlvbigpDQotCQkJew0KLQkJCQlyZXR1cm4gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaSwgaW1wbGVtZW50YXRpb24pICE9IG51bGw7DQotCQkJfX07DQotCQlBc3NlcnRpb25zLndhaXRBc3NlcnQoY29uZGl0aW9uLCAiTWV0aG9kICIgKyBpbXBsZW1lbnRhdGlvbiArICIgbm90IGZvdW5kIik7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfcGFyYW1UeXBlUmVzb2x2ZWRGb3JOb25RdWFsaWZpZWRIb2xkZXJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBQYXJhbWV0ZXJTeW5jaHJvbml6ZXJGb3JQYXJhbVR5cGVzVGVzdHMgc3luY3Jvbml6ZXIgPSBuZXcgUGFyYW1ldGVyU3luY2hyb25pemVyRm9yUGFyYW1UeXBlc1Rlc3RzKG51bGwpOw0KLQkJc3luY3Jvbml6ZXIuY2FsY0tpbmQobnVsbCwgbnVsbCwgIlFIb2xkZXI7Iik7DQotCQlhc3NlcnRUcnVlKCJyZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lIHNob3VsZCBiZSBjYWxsZWQgZm9yIG5vbiBxdWFsaWZpZWQgSG9sZGVyIHR5cGUiLCBzeW5jcm9uaXplci5jYWxsZWQpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3BhcmFtVHlwZVJlc29sdmVkRm9yUXVhbGlmaWVkSG9sZGVyVHlwZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgUGFyYW1ldGVyU3luY2hyb25pemVyRm9yUGFyYW1UeXBlc1Rlc3RzIHN5bmNyb25pemVyID0gbmV3IFBhcmFtZXRlclN5bmNocm9uaXplckZvclBhcmFtVHlwZXNUZXN0cyhudWxsKTsNCi0JCXN5bmNyb25pemVyLmNhbGNLaW5kKG51bGwsIG51bGwsICJRamF2YXgueG1sLndzLkhvbGRlcjxRQ2xhc3MxOz47Iik7DQotCQlhc3NlcnRUcnVlKCJyZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lIHNob3VsZCBiZSBjYWxsZWQgZm9yIHF1YWxpZmllZCBIb2xkZXIgdHlwZSIsIHN5bmNyb25pemVyLmNhbGxlZCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfcGFyYW1UeXBlTm90UmVzb2x2ZWRGb3JOb25Ib2xkZXJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBQYXJhbWV0ZXJTeW5jaHJvbml6ZXJGb3JQYXJhbVR5cGVzVGVzdHMgc3luY3Jvbml6ZXIgPSBuZXcgUGFyYW1ldGVyU3luY2hyb25pemVyRm9yUGFyYW1UeXBlc1Rlc3RzKG51bGwpOw0KLQkJc3luY3Jvbml6ZXIuY2FsY0tpbmQobnVsbCwgbnVsbCwgIlFTdHJpbmc7Iik7DQotCQlhc3NlcnRGYWxzZSgicmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZSBzaG91bGQgbm90IGJlIGNhbGxlZCBmb3Igbm9uIEhvbGRlciB0eXBlIiwgc3luY3Jvbml6ZXIuY2FsbGVkKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBjbGFzcyBQYXJhbWV0ZXJTeW5jaHJvbml6ZXJGb3JQYXJhbVR5cGVzVGVzdHMgZXh0ZW5kcyBQYXJhbWV0ZXJTeW5jaHJvbml6ZXINCi0Jew0KLQkJcHVibGljIFBhcmFtZXRlclN5bmNocm9uaXplckZvclBhcmFtVHlwZXNUZXN0cyhJTW9kZWxFbGVtZW50U3luY2hyb25pemVyIHBhcmVudCkgew0KLQkJCXN1cGVyKHBhcmVudCk7DQotCQl9DQotDQotCQlwdWJsaWMgYm9vbGVhbiBjYWxsZWQgPSBmYWxzZTsNCi0JCQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgV2ViUGFyYW1LaW5kIGNhbGNLaW5kKGZpbmFsIElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBwYXJtQW5ub3RhdGlvbiwgZmluYWwgSU1ldGhvZCBtZXRob2QsIGZpbmFsIFN0cmluZyB0eXBlU2lnbmF0dXJlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gew0KLQkJCXJldHVybiBzdXBlci5jYWxjS2luZChwYXJtQW5ub3RhdGlvbiwgbWV0aG9kLCB0eXBlU2lnbmF0dXJlKTsNCi0JCX0NCi0JCQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUoZmluYWwgSU1ldGhvZCBtZXRob2QsIGZpbmFsIFN0cmluZyB0eXBlU2lnbmF0dXJlKSB7DQotCQkJY2FsbGVkID0gdHJ1ZTsNCi0JCQlyZXR1cm4gIiI7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvTW9kZWxTeW5jaHJvbml6YXRpb25UZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvTW9kZWxTeW5jaHJvbml6YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZTUxNWRhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL01vZGVsU3luY2hyb25pemF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam9icy5Kb2JVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RFamIzUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFN5bmNocm9uaXphdGlvblRlc3RzIGV4dGVuZHMgU3luY2hyb25pemF0aW9uVGVzdEZpeHR1cmUNCi17DQotCXByaXZhdGUgdm9pZCBhc3NlcnRCZWZvcmVBZnRlckFyZVRoZVNhbWUoKQ0KLQl7CWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCBuZXdSZWZXc1ByajEgPSBkb21VdGlsLmZpbmRQcm9qZWN0QnlOYW1lKHRhcmdldC5nZXRET00oKSwgdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCWFzc2VydEVxdWFscyh3c1ByajEsIG5ld1JlZldzUHJqMSk7DQotCQlhc3NlcnRFcXVhbHMod3MxLCBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUobmV3UmVmV3NQcmoxLCB3czFJbXBsTmFtZSkpOw0KLQkJYXNzZXJ0RXF1YWxzKHNlaTEsIGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUobmV3UmVmV3NQcmoxLCBzZWkxSW1wbE5hbWUpKTsNCi0JCQ0KLQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IG5ld1JlZldzUHJqMiA9IGRvbVV0aWwuZmluZFByb2plY3RCeU5hbWUodGFyZ2V0LmdldERPTSgpLCB0ZXN0UHJqMi5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKHdzUHJqMiwgbmV3UmVmV3NQcmoyKTsNCi0JCWFzc2VydEVxdWFscyh3czIsIGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZShuZXdSZWZXc1ByajIsIHdzMkltcGxOYW1lKSk7DQotCQlhc3NlcnRFcXVhbHMoc2VpMiwgZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZShuZXdSZWZXc1ByajIsIHNlaTJJbXBsTmFtZSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X29wZW5lZFdzUHJvamVjdFN5bmNoZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIFRlc3RQcm9qZWN0IHRlc3RQcmozID0gbmV3IFRlc3RQcm9qZWN0KG5ldyBUZXN0RWpiM1Byb2plY3QoIlRlc3RFSkJQcm9qZWN0MyIpLmdldFByb2plY3QoKSk7DQotCQl0cnkgew0KLQkJCWFsbG93ZWRQcm9qZWN0cy5hZGQodGVzdFByajMuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYzMgPSB0ZXN0UHJqMy5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMyIpOw0KLQkJCXRlc3RQcmozLmNyZWF0ZVR5cGUobW9kZWxTeW5jMywgIlNlaTMuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTNOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMyB7fSIpOw0KLQkJCXRlc3RQcmozLmNyZWF0ZVR5cGUobW9kZWxTeW5jMywgIldTMy5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTM05hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMS5TZWkzTmFtZVwiKSBwdWJsaWMgY2xhc3MgV1MzIHt9Iik7DQotCQkJdGVzdFByajMuZ2V0UHJvamVjdCgpLmNsb3NlKG51bGwpOw0KLQkJCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkJDQotCQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJCXRlc3RQcmozLmdldFByb2plY3QoKS5vcGVuKG51bGwpOw0KLQkJCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkJDQotCQkJYXNzZXJ0QmVmb3JlQWZ0ZXJBcmVUaGVTYW1lKCk7DQotCQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqMyA9IGRvbVV0aWwuZmluZFByb2plY3RCeU5hbWUodGFyZ2V0LmdldERPTSgpLCB0ZXN0UHJqMy5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJCWFzc2VydE5vdE51bGwoIldlYiBTZXJ2aWNlIFByb2plY3Qgbm90IHN5bmNocm9uaXplZCBhZnRlciBvcGVuZWQiLHdzUHJqMyk7DQotCQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MzID0gZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMywgImNvbS5zYXAudGVzdC5tb2RlbHN5bmMzLldTMyIpOw0KLQkJCWFzc2VydE5vdE51bGwoIldlYiBTZXJ2aWNlIG5vdCBzeW5jaHJvbml6ZWQgYWZ0ZXIgY29udGFpbmluZyBwcm9qZWN0IHdhcyBvcHBlbmVkIiwgd3MzKTsNCi0JCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaTMgPSBkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJqMywgImNvbS5zYXAudGVzdC5tb2RlbHN5bmMzLlNlaTMiKTsNCi0JCQlhc3NlcnROb3ROdWxsKCJTZXJ2aWNlIEVuZHBvaW50IGludGVyZmFjZSBub3Qgc3luY2hyb25pemVkIGFmdGVyIGNvbnRhaW5pbmcgcHJvamVjdCB3YXMgb3BwZW5lZCIsIHNlaTMpOw0KLQkJfSBmaW5hbGx5DQotCQl7DQotCQkJdGVzdFByajMuZGlzcG9zZSgpOw0KLQkJfQ0KLQl9DQotCQkNCi0JcHVibGljIHZvaWQgdGVzdF9vcGVuZWRQcm9qZWN0V2l0aEVudW1zSW5pdGlhbHlTeW5jaGVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBUZXN0UHJvamVjdCB0ZXN0UHJqMyA9IG5ldyBUZXN0UHJvamVjdChuZXcgVGVzdEVqYjNQcm9qZWN0KCJUZXN0RUpCUHJvamVjdDMiKS5nZXRQcm9qZWN0KCkpOw0KLQkJdHJ5IHsNCi0JCQlhbGxvd2VkUHJvamVjdHMuYWRkKHRlc3RQcmozLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMzID0gdGVzdFByajMuY3JlYXRlUGFja2FnZSgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzMiKTsNCi0JCQl0ZXN0UHJqMy5jcmVhdGVUeXBlKG1vZGVsU3luYzMsICJUZXN0RW51bS5qYXZhIiwgInB1YmxpYyBlbnVtIFRlc3RFbnVtIHtBLCBCLCBDfSIpOw0KLQkJCXRhcmdldCA9IGNyZWF0ZVRhcmdldCgpOw0KLQkJCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkJDQotCQkJdGFyZ2V0LmxvYWQobnVsbCk7DQotCQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqMyA9IGRvbVV0aWwuZmluZFByb2plY3RCeU5hbWUodGFyZ2V0LmdldERPTSgpLCB0ZXN0UHJqMy5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJCWFzc2VydE5vdE51bGwoIldlYiBTZXJ2aWNlIFByb2plY3Qgbm90IHN5bmNocm9uaXplZCBhZnRlciBjcmVhdGVkIix3c1ByajMpOw0KLQkJfSBmaW5hbGx5IA0KLQkJew0KLQkJCXRlc3RQcmozLmRpc3Bvc2UoKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X25ld1NlaUNvbXBpbGF0aW9uVW5pdHNTeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24NCi0Jew0KLQkJdmVyaWZ5U2V0VXBNb2RlbEVudGl0ZXNOb3RDaGFuZ2VkKCk7DQotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IHBmID0gdGVzdFByajEuY3JlYXRlUGFja2FnZSgiY29tLnNhcC50ZXN0Lm5ld3NlaSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJdGVzdFByajEuY3JlYXRlVHlwZShwZiwgIlNlaTMuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTNOYW1lXCIsIHRhcmdldE5hbWVzcGFjZT1cImh0dHA6Ly9jb20uc2FwLnRlc3QvXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMyB7fSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJYXNzZXJ0QmVmb3JlQWZ0ZXJBcmVUaGVTYW1lKCk7DQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcmoxID0gZG9tVXRpbC5maW5kUHJvamVjdEJ5TmFtZSh0YXJnZXQuZ2V0RE9NKCksIHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaTMgPSBkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJqMSwgImNvbS5zYXAudGVzdC5uZXdzZWkuU2VpMyIpOw0KLQkJYXNzZXJ0Tm90TnVsbCgiTmV3bHkgYWRkZWQgU0VJIG5vdCBzeW5jaGVkIGludG8gdGhlIG1vZGVsIixzZWkzKTsNCi0JCWFzc2VydEVxdWFscygiSmF2YSBJbnRmIGZvciBuZXdseSBhZGRlZCBTRUkgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIiwgImNvbS5zYXAudGVzdC5uZXdzZWkuU2VpMyIsIHNlaTMuZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoIlRhcmdldCBOUyBmb3IgbmV3bHkgYWRkZWQgU0VJIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCIsICJodHRwOi8vY29tLnNhcC50ZXN0LyIsIHNlaTMuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbmFtZSBvZiB0aGUgbmV3bHkgYWRkZWQgc2VpIGRvZXNuJ3QgbWF0Y2giLCAiU2VpM05hbWUiLCBzZWkzLmdldE5hbWUoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF91bnJlU29sdmVkU2VpUmVmR2V0c1Jlc29sdmVkQWZ0ZXJTZWlBZGRlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uDQotCXsNCi0JCXZlcmlmeVNldFVwTW9kZWxFbnRpdGVzTm90Q2hhbmdlZCgpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwZiA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5uZXd3cyIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCS8vTWFrZSB0aGUgV1MgYmUgY3JlYXRlZCB3aXRoIGEgcmVmZXJlbmNlIHRvICJjb20uc2FwLnRlc3QubmV3c2VpLlNlaTMiIHdoaWNoIGRvZXNuJ3QgZXhpc3QgeWV0LiANCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCXRlc3RQcmoxLmNyZWF0ZVR5cGUocGYsICJXUzMuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzNOYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwiY29tLnNhcC50ZXN0Lm5ld3NlaS5TZWkzXCIpIHB1YmxpYyBjbGFzcyBXUzMge30iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWFzc2VydEJlZm9yZUFmdGVyQXJlVGhlU2FtZSgpOw0KLQkJDQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcmoxID0gZG9tVXRpbC5maW5kUHJvamVjdEJ5TmFtZSh0YXJnZXQuZ2V0RE9NKCksIHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQlmaW5hbCBJV2ViU2VydmljZSB3czMgPSBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCAiY29tLnNhcC50ZXN0Lm5ld3dzLldTMyIpOw0KLQkJYXNzZXJ0Tm90TnVsbCgiV2ViIFNlcnZpY2Ugbm90IHN5bmNocm9uaXplZCBhZnRlciBuZXcgY29tcGlsYXRpb24gdW5pdCB3aXRoIHdzIHdhcyBhZGRlZCIsIHdzMyk7DQotCQkvL2FkZCBhIG5ldyBzZWkgYW5kIHRlc3QgdGhhdCBpdCBoYXMgYmVlbiBzeW5jaGVkLg0KLQkJdGVzdF9uZXdTZWlDb21waWxhdGlvblVuaXRzU3luY2hlZCgpOw0KLQkJLy9ub3cgY2hlY2sgdGFodCB0aGUgU2VpIHJlZiBpbiB3czMgaGFzIGJlZW4gcHJvcGVybHkgcmVzb2x2ZWQNCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgbmV3bHlBZGRlZFNlaSA9IGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoxLCAiY29tLnNhcC50ZXN0Lm5ld3NlaS5TZWkzIik7DQotCQlhc3NlcnROb3ROdWxsKCJOZXdseSBhZGRlZCBzZWkgbm90IGZvdW5kIGluIHRoZSBtb2RlbC4gUHJvYmFibHkgdGhlIHRlc3RfbmV3U2VpQ29tcGlsYXRpb25Vbml0c1N5bmNoZWQoKSB0ZXN0IG1ldGhvZCBoYXMgY2hhbmdlZCB0aGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIGl0IHdvcmtzIHdpdGgiLCBuZXdseUFkZGVkU2VpKTsNCi0JCWFzc2VydFNhbWUoIldlYiBTZXJ2aWNlIFJlZmVyZW5jZSBub3QgcmVzb2x2ZWQgcHJvcGVybHkiLCBuZXdseUFkZGVkU2VpLCB3czMuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X25ld1NvdXJjZUZvbGRlcldpdGhKYXZhQ29udGVudFN5bmNoZWRXaGVuQWRkZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbg0KLQl7DQotCS8vCXZlcmlmeVNldFVwTW9kZWxFbnRpdGVzTm90Q2hhbmdlZCgpOw0KLQkJLy9jcmVhdGUgbmV3IGZvbGRlciwgd2hpY2ggd2lsbCBsYXRlciBvbiBiZSBtYWRlIGEgc291cmUgZm9sZGVyDQotCQlJRm9sZGVyIGZvbGRlciA9IHRlc3RQcmoxLmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYzEiKTsNCi0JCWZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7DQotCQkvL21ha2UgdGhlIGZvbGRlciBhIHNvdXJjZSBmb2xkZXIgbm93IGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgdHlwZSBpbiB0aGVyZS4NCi0JCWZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIG9sZEVudHJpZXMgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmdldFJhd0NsYXNzcGF0aCgpOw0KLQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gbmV3RW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb2xkRW50cmllcy5sZW5ndGggKyAxXTsNCi0JCS8vY3JlYXRlIGEgbmV3IHBhY2thZ2UgZnJhZ21lbnQgZm9sZGVyLiBOb3RlIGh0YXQgaXQgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIHR5cGUsIGFzIHRoZSBmb2xkZXIgaXMgbm90IHNvdXJjZSBmb2xkZXIgeWV0DQotCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIG9sZEVudHJpZXMubGVuZ3RoKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnRSb290IG5ld1NvdXJjZUZvbGRlciA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChmb2xkZXIpOw0KLQkJbmV3RW50cmllc1tvbGRFbnRyaWVzLmxlbmd0aF0gPSBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShuZXdTb3VyY2VGb2xkZXIuZ2V0UGF0aCgpKTsNCi0JCXRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuc2V0UmF3Q2xhc3NwYXRoKG5ld0VudHJpZXMsIG51bGwpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwZiA9IG5ld1NvdXJjZUZvbGRlci5jcmVhdGVQYWNrYWdlRnJhZ21lbnQoImNvbS5zYXAudGVzdC5uZXd3cyIsIHRydWUsIG51bGwpOw0KLQkJLy9ub3cgY3JlYXRlIHRoZSB0eXBlcw0KLQkJdGVzdFByajEuY3JlYXRlVHlwZShwZiwgIldTMy5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTM05hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uc2FwLnRlc3QubmV3c2VpLlNlaTNcIikgcHVibGljIGNsYXNzIFdTMyB7fSIpOw0KLQkJdGVzdFByajEuY3JlYXRlVHlwZShwZiwgIlNlaTMuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTNOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMyB7fSIpOw0KLQkJLy9hZnRlciB0aGUgdHlwZSBpcyBjcmVhdGVkIG1ha2UgdGhlIHNvdXJjZSBmb2xkZXIgYW4gb3JkaW5hcnkgc291cmNlIGFnYWluLiANCi0JCXRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuc2V0UmF3Q2xhc3NwYXRoKG9sZEVudHJpZXMsIG51bGwpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCS8vdGhlbiBzdGFydCBzeW5jaHJvbml6aW5nDQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQkvL2ZpbmFsbHkgdGhlIHJlc291cmNlIGlzIHN5Y2hucm9uaXppbmcgYW5kIGluIHRoZSBzYW1lIHRpbWUgd2UgaGF2ZSBhIGZvbGRlciB3aXRoIHNvdXJjZSBjb250ZW50LiBTbyBqdXN0IG1ha2UgaXQgYSBzb3VyY2UgZm9sZGVyIGFnYWluLg0KLQkJdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5zZXRSYXdDbGFzc3BhdGgobmV3RW50cmllcywgbnVsbCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcmoxID0gZG9tVXRpbC5maW5kUHJvamVjdEJ5TmFtZSh0YXJnZXQuZ2V0RE9NKCksIHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQlmaW5hbCBJV2ViU2VydmljZSB3czMgPSBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCAiY29tLnNhcC50ZXN0Lm5ld3dzLldTMyIpOw0KLQkJYXNzZXJ0Tm90TnVsbCgiV2ViIFNlcnZpY2Ugbm90IHN5bmNocm9uaXplZCBhZnRlciBhIHNvdXJjZSBmb2xkZXIgaW4gd2hpY2ggaXQgd2FzIGNvbnRhaW5lZCB3YXMgYWRkZWQiLCB3czMpOw0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkzID0gZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsICJjb20uc2FwLnRlc3QubmV3d3MuU2VpMyIpOw0KLQkJYXNzZXJ0Tm90TnVsbCgiU2VpIG5vdCBzeW5jaGVkIGFmdGVyIGEgc291cmNlIGZvbGRlciBpbiB3aGljaCBpdCB3YXMgY29udGFpbmVkIHdhcyBhZGRlZCIsIHNlaTMpOw0KLQkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlZFNvdXJjZUZvbGRlclN5Y2hlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbg0KLQl7DQotCQl0ZXN0X25ld1NvdXJjZUZvbGRlcldpdGhKYXZhQ29udGVudFN5bmNoZWRXaGVuQWRkZWQoKTsNCi0JCWZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIG9sZEVudHJpZXMgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmdldFJhd0NsYXNzcGF0aCgpOw0KLQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gIG5ld0VudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZEVudHJpZXMubGVuZ3RoIC0gMV07DQotCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIG5ld0VudHJpZXMubGVuZ3RoKTsNCi0JCXRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuc2V0UmF3Q2xhc3NwYXRoKG5ld0VudHJpZXMsIG51bGwpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJYXNzZXJ0TnVsbChkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCAiY29tLnNhcC50ZXN0Lm5ld3dzLldTMyIpKTsNCi0JCWFzc2VydE51bGwoZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsICJjb20uc2FwLnRlc3QubmV3d3MuU2VpMyIpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9yZW1vdmVkT3JDbG9zZWRQcm9qZWN0U3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMxID0gdGVzdFByajEuY3JlYXRlUGFja2FnZSgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzFfMSIpOw0KLQkJdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiV1MzLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MzTmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cImNvbS5zYXAudGVzdC5tb2RlbHN5bmMyXzEuU2VpM1wiKSBwdWJsaWMgY2xhc3MgV1MzIHt9Iik7DQotCQ0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMyID0gdGVzdFByajIuY3JlYXRlUGFja2FnZSgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzJfMSIpOw0KLQkJdGVzdFByajIuY3JlYXRlVHlwZShtb2RlbFN5bmMyLCAiU2VpMy5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpM05hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkzIHt9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQkNCi0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzMyA9IGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsICJjb20uc2FwLnRlc3QubW9kZWxzeW5jMV8xLldTMyIpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3czMpOw0KLQkJDQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaTMgPSBkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJqMiwgImNvbS5zYXAudGVzdC5tb2RlbHN5bmMyXzEuU2VpMyIpOw0KLQkJYXNzZXJ0Tm90TnVsbChzZWkzKTsNCi0JCWFzc2VydEVxdWFscyhzZWkzLCB3czMuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQkJZmluYWwgU3RyaW5nIHRlc3RQcmoyTmFtZSA9IHRlc3RQcmoyLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCXRlc3RQcmoyLmdldFByb2plY3QoKS5jbG9zZShudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQlhc3NlcnROdWxsKGRvbVV0aWwuZmluZFByb2plY3RCeU5hbWUodGFyZ2V0LmdldERPTSgpLCB0ZXN0UHJqMk5hbWUpKTsNCi0JCWFzc2VydE51bGwoIlRoZSB3ZWIgc2VydmljZSByZXR1cm5zIGEgc2VpIGluc3RhbmNlIHdoaWNoIGlzIGNvbnRhaW5lZCBpbiBhIGNsb3NlZCBwcm9qZWN0Iiwgd3MzLmdldFNlcnZpY2VFbmRwb2ludCgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9kZWxldGVkQ1VXaXRoU2VpU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBzZWkxQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHNlaTFJbXBsTmFtZSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQlzZWkxQ1UuZGVsZXRlKHRydWUsIG51bGwpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJYXNzZXJ0RmFsc2Uod3NQcmoxLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKS5jb250YWlucyhzZWkxKSk7DQotCQlhc3NlcnROdWxsKHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfZGVsZXRlZENVV2l0aFdTU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3czFDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUod3MxSW1wbE5hbWUpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJd3MxQ1UuZGVsZXRlKHRydWUsIG51bGwpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJYXNzZXJ0RmFsc2Uod3NQcmoxLmdldFdlYlNlcnZpY2VzKCkuY29udGFpbnMod3MxKSk7DQotCQlhc3NlcnRGYWxzZShzZWkxLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuY29udGFpbnMod3MxKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF9kZWxldGVkQ3VDb250ZW50V2l0aFNlaVN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgc2VpMUN1ID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShzZWkxSW1wbE5hbWUpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJdGVzdFV0aWwuc2V0Q29udGVudHMoc2VpMUN1LCAiIik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlhc3NlcnRGYWxzZSh3c1ByajEuZ2V0V2ViU2VydmljZXMoKS5jb250YWlucyhzZWkxKSk7DQotCQlhc3NlcnROdWxsKHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfZGVsZXRlZEN1Q29udGVudFdpdGhXc1N5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3MxQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHdzMUltcGxOYW1lKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHdzMUNVLCAiIik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlhc3NlcnRGYWxzZSh3c1ByajEuZ2V0V2ViU2VydmljZXMoKS5jb250YWlucyh3czEpKTsNCi0JCWFzc2VydEZhbHNlKHNlaTEuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5jb250YWlucyh3czEpKTsNCi0JfQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfbW92ZWRDVVdpdGhXU0luT3RoZXJQcm9qZWN0V2l0aFNhbWVKYXZhTmFtZVN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3MxQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHdzMUltcGxOYW1lKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW92ZUluID0gdGVzdFByajIuZ2V0U291cmNlRm9sZGVyKCkuY3JlYXRlUGFja2FnZUZyYWdtZW50KHdzMUNVLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCksIHRydWUsIG51bGwpOw0KLQkJd3MxQ1UubW92ZShtb3ZlSW4sIG51bGwsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWFzc2VydEZhbHNlKHdzUHJqMS5nZXRXZWJTZXJ2aWNlcygpLmNvbnRhaW5zKHdzMSkpOw0KLQkJYXNzZXJ0VHJ1ZSh3c1ByajIuZ2V0V2ViU2VydmljZXMoKS5jb250YWlucyh3czEpKTsNCi0JCWFzc2VydFRydWUoc2VpMS5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLmNvbnRhaW5zKHdzMSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X21vdmVkQ1VXaXRoU2VpSW5PdGhlclByb2plY3RXaXRoU2FtZUphdmFOYW1lU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBzZTFDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoc2VpMUltcGxOYW1lKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW92ZUluID0gdGVzdFByajIuZ2V0U291cmNlRm9sZGVyKCkuY3JlYXRlUGFja2FnZUZyYWdtZW50KHNlMUNVLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCksIHRydWUsIG51bGwpOw0KLQkJc2UxQ1UubW92ZShtb3ZlSW4sIG51bGwsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWFzc2VydEZhbHNlKHdzUHJqMS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuY29udGFpbnMoc2VpMSkpOw0KLQkJYXNzZXJ0VHJ1ZSh3c1ByajIuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLmNvbnRhaW5zKHNlaTEpKTsNCi0JCWFzc2VydFNhbWUod3MxLmdldFNlcnZpY2VFbmRwb2ludCgpLCBzZWkxKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9yZW5hbWVkQ1VXaXRoU2VpU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBzZTFDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoc2VpMUltcGxOYW1lKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCXNlMUNVLmZpbmRQcmltYXJ5VHlwZSgpLnJlbmFtZSgiU2VpMU5ld05hbWUiLCBmYWxzZSwgbnVsbCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBzZTFDVVJlbmFtZWQgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMS5TZWkxTmV3TmFtZSIpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoIlNlaTFOZXdOYW1lLmphdmEiLCBzZTFDVVJlbmFtZWQuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHJlbmFtZWRTZWkxID0gZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsIHNlMUNVUmVuYW1lZC5maW5kUHJpbWFyeVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCQlhc3NlcnROb3ROdWxsKHJlbmFtZWRTZWkxKTsNCi0JCWFzc2VydE51bGwod3MxLmdldFNlcnZpY2VFbmRwb2ludCgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlbmFtZWRDVVdpdGhXU1N5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3MxQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHdzMUltcGxOYW1lKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCXdzMUNVLmZpbmRQcmltYXJ5VHlwZSgpLnJlbmFtZSgiV1MxTmV3TmFtZSIsIGZhbHNlLCBudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHdzMUNVUmVuYW1lZCA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxLldTMU5ld05hbWUiKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKCJXUzFOZXdOYW1lLmphdmEiLCB3czFDVVJlbmFtZWQuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQlJV2ViU2VydmljZSByZW5hbWVkV1MxID0gZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgd3MxQ1VSZW5hbWVkLmZpbmRQcmltYXJ5VHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCWFzc2VydE5vdE51bGwocmVuYW1lZFdTMSk7DQotCQlhc3NlcnRGYWxzZShzZWkxLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuY29udGFpbnMod3MxKSk7DQotCQlhc3NlcnRUcnVlKHNlaTEuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5jb250YWlucyhyZW5hbWVkV1MxKSk7DQotCQlhc3NlcnRTYW1lKHNlaTEsIHJlbmFtZWRXUzEuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZWRXU0Fubm90YXRpb25Gcm9tU2VpU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBzZTFDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoc2VpMUltcGxOYW1lKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHNlMUNVLCAicHVibGljIGludGVyZmFjZSBTZWkxIHt9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJYXNzZXJ0TnVsbChkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJqMSwgc2VpMUltcGxOYW1lKSk7DQotCQlhc3NlcnROdWxsKHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlZFdTQW5ub3RhdGlvbkZyb21XU1N5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgc2UxQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHdzMUltcGxOYW1lKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHNlMUNVLCAicHVibGljIGNsYXNzIFdTMSB7fSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCWFzc2VydE51bGwoZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsIHdzMUltcGxOYW1lKSk7DQotCQlhc3NlcnRUcnVlKHNlaTEuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5zaXplKCkgPT0gMCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfYWRkZWRXU0Fubm90YWlvblRvQ2xhc3NTeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYzQgPSB0ZXN0UHJqMS5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3QubW9kZWxzeW5jNCIpOw0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3czRDVSA9IHRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jNCwgIldTNC5qYXZhIiwgInB1YmxpYyBjbGFzcyBXUzQge30iKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHdzNENVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1M0TmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxLlNlaTFcIiwgcG9ydE5hbWU9XCJUZXN0UG9ydE5hbWVcIiwgdGFyZ2V0TmFtZXNwYWNlPVwiaHR0cDovL2NvbS5zYXAvdGVzdFwiLCB3c2RsTG9jYXRpb249XCJDOi90ZXN0L3dzZGwvbG9jYXRpb25cIikgcHVibGljIGNsYXNzIFdTNCB7fSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJZmluYWwgSVdlYlNlcnZpY2UgYWRkZWRXUzQgPSBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCB3czRDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCQlhc3NlcnROb3ROdWxsKGFkZGVkV1M0KTsNCi0JCWFzc2VydFRydWUoYWRkZWRXUzQuZ2V0U2VydmljZUVuZHBvaW50KCkgPT0gc2VpMSk7DQotCQlhc3NlcnRFcXVhbHMoInBvcnROYW1lIG5vdCBzYW1lIiwgIlRlc3RQb3J0TmFtZSIsIGFkZGVkV1M0LmdldFBvcnROYW1lKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJ0YXJnZXROYW1lc3BhY2Ugbm90IHNhbWUiLCAiaHR0cDovL2NvbS5zYXAvdGVzdCIsIGFkZGVkV1M0LmdldFRhcmdldE5hbWVzcGFjZSgpKTsNCi0JCWFzc2VydEVxdWFscygid3NkbExvY2F0aW9uIG5vdCBzYW1lIiwgIkM6L3Rlc3Qvd3NkbC9sb2NhdGlvbiIsIGFkZGVkV1M0LmdldFdzZGxMb2NhdGlvbigpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9hZGRlZFdTQW5ub3RhdGlvblRvU2VpU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmM0ID0gdGVzdFByajEuY3JlYXRlUGFja2FnZSgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzQiKTsNCi0JCQ0KLQkJZmluYWwgSVR5cGUgd3M0VHlwZSA9IHRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jNCwgIldTNC5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTNE5hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uc2FwLnRlc3QubW9kZWxzeW5jNC5TZWk0XCIpIHB1YmxpYyBjbGFzcyBXUzQge30iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzNCA9IGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsIHdzNFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3czQpOw0KLQkJYXNzZXJ0TnVsbCh3czQuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQkJDQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHNlaTRDVSA9IHRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jNCwgIlNlaTQuamF2YSIsICJwdWJsaWMgaW50ZXJmYWNlIFNlaTQge30iKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHNlaTRDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpNE5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWk0IHt9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGFkZGVkV1M0ID0gZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsIHNlaTRDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCQlhc3NlcnROb3ROdWxsKGFkZGVkV1M0KTsNCi0JCWFzc2VydFNhbWUod3M0LmdldFNlcnZpY2VFbmRwb2ludCgpLCBhZGRlZFdTNCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfY2hhbmdlZFNlaVJlZlN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3MxQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHdzMS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHdzMUNVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MxTmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cImNvbS5zYXAudGVzdC5tb2RlbHN5bmMyLlNlaTJcIikgcHVibGljIGNsYXNzIFdTMSB7fSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJYXNzZXJ0U2FtZShzZWkyLCB3czEuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQkJYXNzZXJ0U2FtZSh3czEsIGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsIHdzMS5nZXRJbXBsZW1lbnRhdGlvbigpKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfY2hhbmdlZFNlaVJlZldpdGhVbnhlc2lzdGluZ1N5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3MxQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHdzMS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHdzMUNVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MxTmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cImNvbS5zYXAudGVzdC5tb2RlbHN5bmMyLlNlaVVuZXhpc3RpbmdcIikgcHVibGljIGNsYXNzIFdTMSB7fSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJYXNzZXJ0TnVsbCh3czEuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQkJYXNzZXJ0U2FtZSh3czEsIGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsIHdzMS5nZXRJbXBsZW1lbnRhdGlvbigpKSk7DQotCX0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRGcm9tRXhwbGljaXRUb0ltcGxpY2l0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHdzMUNVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSh3czEuZ2V0SW1wbGVtZW50YXRpb24oKSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyh3czFDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMU5hbWVcIiwgbmFtZT1cIkltcGxpY2l0SW50ZXJmYWNlTmFtZVwiKSBwdWJsaWMgY2xhc3MgV1MxIHt9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlhc3NlcnROb3RTYW1lKHNlaTIsIHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSk7DQotCQlhc3NlcnRUcnVlKHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKS5pc0ltcGxpY2l0KCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdEludGVyZmFjZU5hbWUiLCB3czEuZ2V0U2VydmljZUVuZHBvaW50KCkuZ2V0TmFtZSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9kZWxldGVkUGFja2FnZVN5bmNoZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYzMgPSB0ZXN0UHJqMS5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMyIpOw0KLQkJdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMzLCAiV1M0LmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MxTmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxLlNlaTFcIikgcHVibGljIGNsYXNzIFdTNCB7fSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3M0ID0gZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgImNvbS5zYXAudGVzdC5tb2RlbHN5bmMzLldTNCIpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3czQpOw0KLQkJYXNzZXJ0U2FtZShzZWkxLCB3czQuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwZiA9IHRlc3RQcmoxLmdldFNvdXJjZUZvbGRlcigpLmdldFBhY2thZ2VGcmFnbWVudCgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEiKTsNCi0JCXBmLmRlbGV0ZSh0cnVlLCBudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWFzc2VydE51bGwoZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsIHNlaTFJbXBsTmFtZSkpOw0KLQkJYXNzZXJ0TnVsbChkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCB3czFJbXBsTmFtZSkpOw0KLQkJYXNzZXJ0TnVsbCh3czQuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X2FkZGVkUGFja2FnZVdpdGhDb21waWxhdGlvblVuaXRzU3luY2hlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBGaWxlIGlvUGFja2FnZSA9IG5ldyBGaWxlKHRlc3RQcmoxLmdldFNvdXJjZUZvbGRlcigpLmdldFJlc291cmNlKCkuZ2V0UmF3TG9jYXRpb24oKS50b09TU3RyaW5nKCksICJjb20vc2FwL3Rlc3QvbW9kZWxzeW5jNCIpOw0KLQkJaW9QYWNrYWdlLm1rZGlycygpOw0KLQkJZmluYWwgRmlsZVdyaXRlciB3cml0ZXIgPSBuZXcgRmlsZVdyaXRlcihuZXcgRmlsZShpb1BhY2thZ2UsICJXUzQuamF2YSIpKTsNCi0JCXRyeSB7DQotCQkJd3JpdGVyLndyaXRlKCJwYWNrYWdlIGNvbS5zYXAudGVzdC5tb2RlbHN5bmM0O1xuIEBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMU5hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMS5TZWkxXCIpIHB1YmxpYyBjbGFzcyBXUzQge30iKTsNCi0JCQl3cml0ZXIuZmx1c2goKTsNCi0JCX0gZmluYWxseSANCi0JCXsNCi0JCQl3cml0ZXIuY2xvc2UoKTsNCi0JCX0NCi0JCXRlc3RQcmoxLmdldFNvdXJjZUZvbGRlcigpLmdldFJlc291cmNlKCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSxudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgImNvbS5zYXAudGVzdC5tb2RlbHN5bmM0LldTNCIpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRDbGFzc1RvSW50ZXJmYWNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMgPSB0ZXN0UHJqMS5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3QubW9kZWxzeW5jNCIpOwkJDQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHdzQ1UgPSB0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYywgIldTNC5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZSgpIHB1YmxpYyBjbGFzcyBXUzQge30iKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQlJV2ViU2VydmljZSB3czQgPSBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCB3c0NVLmZpbmRQcmltYXJ5VHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCWFzc2VydE5vdE51bGwod3M0KTsNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHdzQ1UsICJAamF2YXguandzLldlYlNlcnZpY2UoKSBwdWJsaWMgaW50ZXJmYWNlIFdTNCB7fSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCXdzNCA9IGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsIHdzQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQkJYXNzZXJ0TnVsbCh3czQpOw0KLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJqMSwgd3NDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCQlhc3NlcnROb3ROdWxsKHNlaSk7DQotCQlhc3NlcnRGYWxzZShzZWkuaXNJbXBsaWNpdCgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRJbnRlcmZhY2VUb0NsYXNzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMgPSB0ZXN0UHJqMS5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3QubW9kZWxzeW5jNCIpOwkJDQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHdzQ1UgPSB0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYywgIldTNC5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZSgpIHB1YmxpYyBpbnRlcmZhY2UgV1M0IHt9IikuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoxLCB3c0NVLmZpbmRQcmltYXJ5VHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCWFzc2VydE5vdE51bGwoc2VpKTsNCi0JCWFzc2VydEZhbHNlKHNlaS5pc0ltcGxpY2l0KCkpOwkJDQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyh3c0NVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKCkgcHVibGljIGNsYXNzIFdTNCB7fSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJc2VpID0gZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsIHdzQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQkJYXNzZXJ0Tm90TnVsbChzZWkpOw0KLQkJYXNzZXJ0VHJ1ZShzZWkuaXNJbXBsaWNpdCgpKTsNCi0JCUlXZWJTZXJ2aWNlIHdzNCA9IGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsIHdzQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3czQpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRJbnRlcmZhY2VBbmRDbGFzc1dpdGhTaW1pbGFyTmFtZXNOb3RSZW1vdmVkRnJvbURvbSgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jID0gdGVzdFByajEuY3JlYXRlUGFja2FnZSgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzUiKTsJCQ0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3c0NVID0gdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMsICJUZXN0LmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKCkgcHVibGljIGNsYXNzIFRlc3Qge30iKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgd3NDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpOwkJDQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHNlaUNVID0gdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMsICJUZXN0U2VpLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKCkgcHVibGljIGludGVyZmFjZSBUZXN0U2VpIHt9IikuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJYXNzZXJ0Tm90TnVsbChkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJqMSwgc2VpQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKTsNCi0JCQ0KLQkJdGVzdFV0aWwuc2V0Q29udGVudHMod3NDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIlRlc3RTZXJ2aWNlXCIpIHB1YmxpYyBjbGFzcyBUZXN0IHt9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJYXNzZXJ0Tm90TnVsbChkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJqMSwgc2VpQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKTsNCi0JCWFzc2VydE5vdE51bGwoZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgd3NDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpOwkJDQotCX0JDQotDQotCXB1YmxpYyB2b2lkIHRlc3RfV3NDaGFuZ2VkVG9Vc2VFeHBsaWNpdFNFSSgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jID0gdGVzdFByajEuY3JlYXRlUGFja2FnZSgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzQiKTsJCQ0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3c0NVID0gdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMsICJXUzQuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UoKSBwdWJsaWMgY2xhc3MgV1M0IHt9IikuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJqMSwgd3NDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCQlhc3NlcnROb3ROdWxsKHNlaSk7DQotCQlhc3NlcnRUcnVlKHNlaS5pc0ltcGxpY2l0KCkpOwkJDQotCQkNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHdzQ1UsICJAamF2YXguandzLldlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMS5TZWkxXCIpIHB1YmxpYyBjbGFzcyBXUzQge30iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQlzZWkgPSBkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJqMSwgd3NDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCQlhc3NlcnROdWxsKHNlaSk7CQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9Xc09wZW5lZEluV29ya2luZ0NvcHlDb250ZW50Q2hhbmdlZFJlY29uY2lsZUNhbGxlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsJDQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYyA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmM0Iik7CQkNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3NDdSA9IHRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jLCAiV1MzLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKCkgcHVibGljIGNsYXNzIFdTMyB7fSIpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCUlXZWJTZXJ2aWNlIHdzMyA9IGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsIHdzQ3UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoMCwgd3MzLmdldFNlcnZpY2VFbmRwb2ludCgpLmdldFdlYk1ldGhvZHMoKS5zaXplKCkpOw0KLQkJLy8gdXBkYXRlIGNvbXBpbGF0aW9uIHVuaXQgd2l0aG91dCB1cGRhdGluZyB0aGUgdW5kZXJseWluZyByZXNvdXJjZQ0KLQkJd3NDdS5iZWNvbWVXb3JraW5nQ29weShudWxsKTsNCi0JCXdzQ3UuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMoIkBqYXZheC5qd3MuV2ViU2VydmljZSBwdWJsaWMgY2xhc3MgV1MzIHsiICsNCi0JCQkJInB1YmxpYyB2b2lkIHRlc3QoKSB7fSIgKw0KLQkJCQkifSIpOw0KLQkJd3NDdS5yZWNvbmNpbGUoSUNvbXBpbGF0aW9uVW5pdC5OT19BU1QsIGZhbHNlLCBudWxsLCBudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWFzc2VydEVxdWFscygxLCB3czMuZ2V0U2VydmljZUVuZHBvaW50KCkuZ2V0V2ViTWV0aG9kcygpLnNpemUoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfV3NPcGVuZWRJbldvcmtpbmdDb3B5Q29udGVudENoYW5nZWRSZWNvbmNpbGVDYWxsZWRPbk5vbkphdmFDVSgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsJDQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQkNCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmdldFBhY2thZ2VGcmFnbWVudFJvb3QodGVzdFByajEuZ2V0UHJvamVjdCgpKTsNCi0JCUlQYWNrYWdlRnJhZ21lbnQgcGYgPSByb290LmdldFBhY2thZ2VGcmFnbWVudCgiIik7DQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gcGYuY3JlYXRlQ29tcGlsYXRpb25Vbml0KCJOb3RXUy5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZSBwdWJsaWMgY2xhc3MgTm90V1Mge30iLCB0cnVlLCBudWxsKTsNCi0JCWN1LmJlY29tZVdvcmtpbmdDb3B5KG51bGwpOw0KLQkJY3UuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMoIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIk5ld05vdFdzXCIpIHB1YmxpYyBjbGFzcyBOb3RXUyB7fSIpOw0KLQkJY3UucmVjb25jaWxlKElDb21waWxhdGlvblVuaXQuTk9fQVNULCBmYWxzZSwgbnVsbCwgbnVsbCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlmb3IgKElXZWJTZXJ2aWNlIHdzIDogd3NQcmoxLmdldFdlYlNlcnZpY2VzKCkpIHsNCi0JCQlpZiAod3MuZ2V0TmFtZSgpLmVxdWFscygiTmV3Tm90V3MiKSkgew0KLQkJCQlmYWlsKCJyZWNvbmNpbGUgb24gamF2YSBmaWxlIHdoaWNoIGlzIG5vdCBvbiBwcm9qZWN0J3MgYnVpbGQgcGF0aCBwcm9jZXNzZWQgaW5jb3JyZWN0bHkiKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSBjcmVhdGVUYXJnZXQoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoamF2YU1vZGVsKSANCi0JCXsNCi0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgYm9vbGVhbiBhcHByb3ZlUHJvamVjdChJSmF2YVByb2plY3QgcHJqKSB7DQotCQkJCWZvciAoU3RyaW5nIGFsbG93ZWRQcmogOiBhbGxvd2VkUHJvamVjdHMpDQotCQkJCXsNCi0JCQkJCWlmIChwcmouZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoYWxsb3dlZFByaikpDQotCQkJCQl7DQotCQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJcmV0dXJuIGZhbHNlOw0KLQkJCX0NCi0JCX07DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNldFVwTW9kZWxFbnRpdGVzTm90Q2hhbmdlZCgpDQotCXsNCi0JCWZpbmFsIEFkYXB0ZXIgYWRhcHRlciA9IG5ldyBBZGFwdGVySW1wbCgpDQotCQl7DQotDQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKQ0KLQkJCXsNCi0JCQkJZmFpbCgic2hvdWxkIG5vdCBiZSBjYWxsZWQsIGJlY2F1c2UgdGhlIG9iamVjdHMgY3JlYXRlZCBpbiB0aGUgc2V0dXAgc2hvdWxkIG5vdCBoYXZlIGJlZW4gY2hhbmdlZCBkdXJpbmcgdGhpcyB0ZXN0Iik7DQotCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsNCi0JCQl9DQotCQkJDQotCQl9Ow0KLQkJdGhpcy53czEuZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOw0KLQkJdGhpcy5zZWkxLmVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsNCi0JCXRoaXMud3MyLmVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsNCi0JCXRoaXMuc2VpMi5lQWRhcHRlcnMoKS5hZGQoYWRhcHRlcik7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvT25FdmVudE1vZGVsU3luY3Jvbml6ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9PbkV2ZW50TW9kZWxTeW5jcm9uaXplclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmQ0NzZjYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9PbkV2ZW50TW9kZWxTeW5jcm9uaXplclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlLlNlcnZpY2VNb2RlbERhdGE7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jLk9uRXZlbnRNb2RlbFN5bmNocm9uaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgT25FdmVudE1vZGVsU3luY3Jvbml6ZXJUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlIA0KLXsNCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRDaGFuZ2VkUmVzb3VyY2VMb2FkQ2hhbmdlZCgpDQotCXsNCi0JCUpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShudWxsKSB7DQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIGJvb2xlYW4gaXNMb2FkQ25hY2VsZWQoKSB7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0gOw0KLQkJDQotCQlPbkV2ZW50TW9kZWxTeW5jaHJvbml6ZXIgc3luYyA9IG5ldyBPbkV2ZW50TW9kZWxTeW5jaHJvbml6ZXIocmVzb3VyY2UsIG51bGwpOw0KLQkJLy8gaW4gY2FzZSByZXNvdXJjZSBsb2FkIGNhbmNlbCBpcyBub3QgcHJvY2Vzc2VkIGNhbGwgdG8gZWxlbWVudCBkZWx0YSB3aWxsIGZhaWwgd2l0aCBOUEUNCi0JCXN5bmMuZWxlbWVudENoYW5nZWQobnVsbCk7CQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEd1ZXNzUHJpbWFyeVR5cGVOYW1lQ3VJbkRlZmF1bHRQYWNrYWdlKCkNCi0Jew0KLQkJZmluYWwgTW9jazxJSmF2YU1vZGVsPiBqYXZhTW9kZWwgPSBtb2NrKElKYXZhTW9kZWwuY2xhc3MpOw0KLQkJZmluYWwgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKGphdmFNb2RlbC5wcm94eSgpKTsNCi0JCQ0KLQkJZmluYWwgTW9jazxJSmF2YUVsZW1lbnQ+IHBhcmVudCA9IG1vY2soSUphdmFFbGVtZW50LmNsYXNzKTsNCi0JCXBhcmVudC5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJnZXRFbGVtZW50TmFtZSIpLndpbGwocmV0dXJuVmFsdWUoIiIpKTsNCi0JCQ0KLQkJZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9ICJNeVRlc3QiOw0KLQkJZmluYWwgTW9jazxJQ29tcGlsYXRpb25Vbml0PiBjdSA9IG1vY2soSUNvbXBpbGF0aW9uVW5pdC5jbGFzcyk7DQotCQljdS5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJnZXRQYXJlbnQiKS53aWxsKHJldHVyblZhbHVlKHBhcmVudC5wcm94eSgpKSk7DQotCQljdS5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJnZXRFbGVtZW50TmFtZSIpLndpbGwocmV0dXJuVmFsdWUoY2xhc3NOYW1lICsgIi5qYXZhIikpOw0KLQ0KLQkJZmluYWwgTXlPbkV2ZW50TW9kZWxTeW5jaHJvbml6ZXIgc3luYyA9IG5ldyBNeU9uRXZlbnRNb2RlbFN5bmNocm9uaXplcihyZXNvdXJjZSwgbnVsbCk7DQotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBuYW1lIGd1ZXNzZWQiLCBjbGFzc05hbWUsIHN5bmMuZ3Vlc3NQcmltYXJ5VHlwZU5hbWUoY3UucHJveHkoKSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R3Vlc3NQcmltYXJ5VHlwZU5hbWVDdUluU29tZVBhY2thZ2UoKQ0KLQl7DQotCQlmaW5hbCBNb2NrPElKYXZhTW9kZWw+IGphdmFNb2RlbCA9IG1vY2soSUphdmFNb2RlbC5jbGFzcyk7DQotCQlmaW5hbCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlID0gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoamF2YU1vZGVsLnByb3h5KCkpOw0KLQkJDQotCQlmaW5hbCBTdHJpbmcgcGFjayA9ICJjb20uc2FwLmRlbW8iOw0KLQkJZmluYWwgTW9jazxJSmF2YUVsZW1lbnQ+IHBhcmVudCA9IG1vY2soSUphdmFFbGVtZW50LmNsYXNzKTsNCi0JCXBhcmVudC5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJnZXRFbGVtZW50TmFtZSIpLndpbGwocmV0dXJuVmFsdWUocGFjaykpOw0KLQkJDQotCQlmaW5hbCBTdHJpbmcgY2xhc3NOYW1lID0gIk15VGVzdCI7DQotCQlmaW5hbCBNb2NrPElDb21waWxhdGlvblVuaXQ+IGN1ID0gbW9jayhJQ29tcGlsYXRpb25Vbml0LmNsYXNzKTsNCi0JCWN1LmV4cGVjdHMob25jZSgpKS5tZXRob2QoImdldFBhcmVudCIpLndpbGwocmV0dXJuVmFsdWUocGFyZW50LnByb3h5KCkpKTsNCi0JCWN1LmV4cGVjdHMob25jZSgpKS5tZXRob2QoImdldEVsZW1lbnROYW1lIikud2lsbChyZXR1cm5WYWx1ZShjbGFzc05hbWUgKyAiLmphdmEiKSk7DQotDQotCQlmaW5hbCBNeU9uRXZlbnRNb2RlbFN5bmNocm9uaXplciBzeW5jID0gbmV3IE15T25FdmVudE1vZGVsU3luY2hyb25pemVyKHJlc291cmNlLCBudWxsKTsNCi0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IG5hbWUgZ3Vlc3NlZCIsIHBhY2sgKyAiLiIgKyBjbGFzc05hbWUsIHN5bmMuZ3Vlc3NQcmltYXJ5VHlwZU5hbWUoY3UucHJveHkoKSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVjdXJzZXZpbHlIYW5kbGVBZGRlZFBhY2thZ2VzRG9lc05vdFByb2Nlc3NOb25Xc1Byb2plY3RzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBNb2NrPElKYXZhTW9kZWw+IGphdmFNb2RlbCA9IG1vY2soSUphdmFNb2RlbC5jbGFzcyk7DQotCQlmaW5hbCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlID0gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoamF2YU1vZGVsLnByb3h5KCkpOw0KLQkJZmluYWwgTXlPbkV2ZW50TW9kZWxTeW5jaHJvbml6ZXIgc3luYyA9IG5ldyBNeU9uRXZlbnRNb2RlbFN5bmNocm9uaXplcihyZXNvdXJjZSwgbnVsbCk7DQotCQlmaW5hbCBNb2NrPElKYXZhRWxlbWVudERlbHRhPiBkZWx0YSA9IG1vY2soSUphdmFFbGVtZW50RGVsdGEuY2xhc3MpOw0KLQkJLy8gaXQgaXMgZXhwZWN0ZWQgdGhhdCBJSmF2YUVsZW1lbnREZWx0YSNnZXRBZmZlY3RlZENoaWxkcmVuKCkgbWV0aG9kIHdpbGwgbm90IGJlIGNhbGxlZA0KLQkJc3luYy5yZWN1cnNldmlseUhhbmRsZUFkZGVkUGFja2FnZXMoZGVsdGEucHJveHkoKSk7DQotCX0NCi0JDQotCXB1YmxpYyBjbGFzcyBNeU9uRXZlbnRNb2RlbFN5bmNocm9uaXplciBleHRlbmRzIE9uRXZlbnRNb2RlbFN5bmNocm9uaXplcg0KLQl7DQotCQlwdWJsaWMgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdDsNCi0JCQ0KLQkJcHVibGljIE15T25FdmVudE1vZGVsU3luY2hyb25pemVyKEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UsIFNlcnZpY2VNb2RlbERhdGEgc2VydmljZURhdGEpIHsNCi0JCQlzdXBlcihyZXNvdXJjZSwgc2VydmljZURhdGEpOw0KLQkJfQ0KLQkJDQotCQlAT3ZlcnJpZGUNCi0JCXByb3RlY3RlZCBTdHJpbmcgZ3Vlc3NQcmltYXJ5VHlwZU5hbWUoSUNvbXBpbGF0aW9uVW5pdCBjdSkgew0KLQkJCXJldHVybiBzdXBlci5ndWVzc1ByaW1hcnlUeXBlTmFtZShjdSk7DQotCQl9DQotCQkNCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIHZvaWQgcmVjdXJzZXZpbHlIYW5kbGVBZGRlZFBhY2thZ2VzKElKYXZhRWxlbWVudERlbHRhIHJvb3REZWx0YSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQotCQkJc3VwZXIucmVjdXJzZXZpbHlIYW5kbGVBZGRlZFBhY2thZ2VzKHJvb3REZWx0YSk7DQotCQl9DQotCQkNCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIElXZWJTZXJ2aWNlUHJvamVjdCBmaW5kUHJvamVjdEJ5RGVsdGEoSUphdmFFbGVtZW50RGVsdGEgcm9vdERlbHRhKSB7DQotCQkJcmV0dXJuIHdzUHJvamVjdDsNCi0JCX0NCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9TZWlNZXRob2RTeW5jcm9uaXphdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL1NlaU1ldGhvZFN5bmNyb25pemF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNjRmMTRkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL1NlaU1ldGhvZFN5bmNyb25pemF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuRG9tVGVzdFV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmpvYnMuSm9iVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5GaWxlVXRpbHM7DQotDQotcHVibGljIGNsYXNzIFNlaU1ldGhvZFN5bmNyb25pemF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCi0NCi0JcHJpdmF0ZSBUZXN0UHJvamVjdCB0ZXN0UHJqMTsgDQotCXByaXZhdGUgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSB0YXJnZXQ7DQotCXByaXZhdGUgSUphdmFNb2RlbCBqYXZhTW9kZWw7DQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBzZWkxQ1U7DQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBzb21lSW50ZkNVOw0KLQkNCi0JcHJpdmF0ZSBJV2ViU2VydmljZVByb2plY3Qgd3NQcmoxOw0KLQlwcml2YXRlIElXZWJTZXJ2aWNlIHdzMTsNCi0JcHJpdmF0ZSBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaTE7DQotCQ0KLQlwcml2YXRlIERvbVRlc3RVdGlscyB0ZXN0VXRpbCA9IG5ldyBEb21UZXN0VXRpbHMoKTsNCi0JcHJpdmF0ZSBEb21VdGlsIGRvbVV0aWwgPSBuZXcgRG9tVXRpbCgpOw0KLQkJDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB3czFJbXBsTmFtZSA9ICJjb20uc2FwLnRlc3QubW9kZWxzeW5jMS5XUzEiOw0KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzb21lSW50ZkltcGxOYW1lID0gImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxLlNvbWVJbnRmIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNlaTFJbXBsTmFtZSA9ICJjb20uc2FwLnRlc3QubW9kZWxzeW5jMS5TZWkxIjsNCi0JDQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJamF2YU1vZGVsID0gSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOw0KLQkJdGFyZ2V0ID0gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoamF2YU1vZGVsKSANCi0JCXsNCi0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgYm9vbGVhbiBhcHByb3ZlUHJvamVjdChJSmF2YVByb2plY3QgcHJqKSB7DQotCQkJCXJldHVybiBwcmouZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHModGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCQl9DQotCQl9Ow0KLQkJdGVzdFByajEgPSBuZXcgVGVzdFByb2plY3QoIlRlc3RQcm9qZWN0MSIpOw0KLQkJdGVzdFByajEuY3JlYXRlU291cmNlRm9sZGVyKCJzcmMiKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jMSA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxIik7DQotCQkNCi0JCXNvbWVJbnRmQ1UgPSB0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJTb21lSW50Zi5qYXZhIiwgInB1YmxpYyBpbnRlcmZhY2UgU29tZUludGZ7XG4iICsNCi0JCQkJInB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzTm9Bbm5vdGF0aW9uSW5QYXJlbnQoKTtcbiIgKw0KLQkJCQkifSIpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJDQotCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJTZWkxLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkxTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTEgZXh0ZW5kcyBTb21lSW50ZiB7XG4iICsNCi0JCQkJInB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzTm9Bbm5vdGF0aW9uKCk7XG4iICsNCi0JCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJ3ZWJOYW1lXCIsIGV4Y2x1ZGU9dHJ1ZSkgcHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NXaXRoQW5ub3RhdGlvbigpO1xuIiArDQotCQkJCSJ9Iik7DQotCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJXUzEuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzFOYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEuU2VpMVwiKSBwdWJsaWMgY2xhc3MgV1MxIHt9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQl0YXJnZXQubG9hZChudWxsKTsNCi0JCWFzc2VydEVxdWFscygiT25lIHByb2plY3RzIHdlcmUgZGVmaW5lZCBidXQgYSBkaWZmZXJlbnQgbnVtYmVyIHdlcmUgZm91bmQgaW4gdGhlIERPTSIsIDEsIHRhcmdldC5nZXRET00oKS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHRhcmdldC5nZXRET00oKS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5nZXQoMCkuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgdGFyZ2V0LmdldERPTSgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpLmdldCgwKS5nZXRXZWJTZXJ2aWNlcygpLnNpemUoKSk7DQotCQl3c1ByajEgPSBkb21VdGlsLmZpbmRQcm9qZWN0QnlOYW1lKHRhcmdldC5nZXRET00oKSwgdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCWFzc2VydE5vdE51bGwod3NQcmoxKTsNCi0JCXdzMSA9IGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsIHdzMUltcGxOYW1lKTsNCi0JCWFzc2VydE5vdE51bGwod3MxKTsNCi0JCXNlaTEgPSBkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJqMSwgc2VpMUltcGxOYW1lKTsNCi0JCWFzc2VydE5vdE51bGwoc2VpMSk7DQotCQlzZWkxQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHNlaTEuZ2V0SW1wbGVtZW50YXRpb24oKSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3Rfdm9pZE1ldGhvZFdpdGhOb0FyZ3NOb0Fubm90YXRpb25TeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZEVsZW0gPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHNlaTEuZ2V0SW1wbGVtZW50YXRpb24oKSkuZ2V0TWV0aG9kKCJ2b2lkTWV0aG9kV2l0aE5vQXJnc05vQW5ub3RhdGlvbiIsIG5ldyBTdHJpbmdbMF0pOw0KLQkJZmluYWwgSVdlYk1ldGhvZCB3bSA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtKSk7DQotCQlhc3NlcnROb3ROdWxsKHdtKTsNCi0JCWFzc2VydEVxdWFscyhtZXRob2RFbGVtLmdldEVsZW1lbnROYW1lKCksIHdtLmdldE5hbWUoKSk7DQotCQlhc3NlcnRUcnVlKHdtLmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOw0KLQkJYXNzZXJ0RXF1YWxzKGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW0pLCB3bS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWFzc2VydEZhbHNlKHdtLmlzRXhjbHVkZWQoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3Rfdm9pZE1ldGhvZFdpdGhOb0FyZ3NXaXRoQW5ub3RhdGlvblN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kRWxlbSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoc2VpMS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRNZXRob2QoInZvaWRNZXRob2RXaXRoTm9BcmdzV2l0aEFubm90YXRpb24iLCBuZXcgU3RyaW5nWzBdKTsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd20gPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kRWxlbSkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3bSk7DQotCQlhc3NlcnRFcXVhbHMoIndlYk5hbWUiLCB3bS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0VHJ1ZSh3bS5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsNCi0JCWFzc2VydEVxdWFscyhkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtKSwgd20uZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQlhc3NlcnRUcnVlKHdtLmlzRXhjbHVkZWQoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3Rfd2ViTmFtZUNoYW5nZWRTeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZEVsZW0gPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHNlaTEuZ2V0SW1wbGVtZW50YXRpb24oKSkuZ2V0TWV0aG9kKCJ2b2lkTWV0aG9kV2l0aE5vQXJnc1dpdGhBbm5vdGF0aW9uIiwgbmV3IFN0cmluZ1swXSk7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdtID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW0pKTsNCi0JCWFzc2VydE5vdE51bGwod20pOw0KLQkJYXNzZXJ0RXF1YWxzKCJ3ZWJOYW1lIiwgd20uZ2V0TmFtZSgpKTsNCi0JCWFzc2VydFRydWUod20uZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7DQotCQlhc3NlcnRFcXVhbHMoZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kRWxlbSksIHdtLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJYXNzZXJ0VHJ1ZSh3bS5pc0V4Y2x1ZGVkKCkpOw0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJRmlsZVV0aWxzLmdldEluc3RhbmNlKCkuc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudChzZWkxQ1UsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTFOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMSB7XG4iICsNCi0JCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJ3ZWJOYW1lTmV3XCIsIGV4Y2x1ZGU9dHJ1ZSkgcHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NXaXRoQW5ub3RhdGlvbigpO1xuIiArDQotCQkJCSJ9IiwgZmFsc2UsIG51bGwpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKCJ3ZWJOYW1lTmV3Iiwgd20uZ2V0TmFtZSgpKTsNCi0JCWFzc2VydFRydWUod20uZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7DQotCQlhc3NlcnRFcXVhbHMoZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kRWxlbSksIHdtLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJYXNzZXJ0VHJ1ZSh3bS5pc0V4Y2x1ZGVkKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X2V4Y2x1ZGVkQ2hhbmdlZFN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kRWxlbSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoc2VpMS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRNZXRob2QoInZvaWRNZXRob2RXaXRoTm9BcmdzV2l0aEFubm90YXRpb24iLCBuZXcgU3RyaW5nWzBdKTsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd20gPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kRWxlbSkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3bSk7DQotCQlhc3NlcnRFcXVhbHMoIndlYk5hbWUiLCB3bS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0VHJ1ZSh3bS5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsNCi0JCWFzc2VydEVxdWFscyhkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtKSwgd20uZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQlhc3NlcnRUcnVlKHdtLmlzRXhjbHVkZWQoKSk7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlGaWxlVXRpbHMuZ2V0SW5zdGFuY2UoKS5zZXRDb21waWxhdGlvblVuaXRDb250ZW50KHNlaTFDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpMU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkxIHtcbiIgKw0KLQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cIndlYk5hbWVcIiwgZXhjbHVkZT1mYWxzZSkgcHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NXaXRoQW5ub3RhdGlvbigpO1xuIiArDQotCQkJCSJ9IiwgZmFsc2UsIG51bGwpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKCJ3ZWJOYW1lIiwgd20uZ2V0TmFtZSgpKTsNCi0JCWFzc2VydFRydWUod20uZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7DQotCQlhc3NlcnRFcXVhbHMoZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kRWxlbSksIHdtLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJYXNzZXJ0RmFsc2Uod20uaXNFeGNsdWRlZCgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X2RlbGV0ZWRNZXRob2RTeW5jZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kVG9EZWxldGUgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHNlaTEuZ2V0SW1wbGVtZW50YXRpb24oKSkuZ2V0TWV0aG9kKCJ2b2lkTWV0aG9kV2l0aE5vQXJnc05vQW5ub3RhdGlvbiIsIG5ldyBTdHJpbmdbMF0pOw0KLQkJZmluYWwgU3RyaW5nIG1ldGhvZFRvRGVsZXRlSW1wbD0gZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kVG9EZWxldGUpOw0KLQkNCi0JCUZpbGVVdGlscy5nZXRJbnN0YW5jZSgpLnNldENvbXBpbGF0aW9uVW5pdENvbnRlbnQoc2VpMUNVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkxTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTEge1xuIiArDQotCQkJCSJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwid2ViTmFtZVwiLCBleGNsdWRlPXRydWUpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzV2l0aEFubm90YXRpb24oKTtcbiIgKw0KLQkJCQkifSIsIGZhbHNlLCBudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWFzc2VydE51bGwoZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIG1ldGhvZFRvRGVsZXRlSW1wbCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X292ZXJsb2FkZWRNZXRob2RMb2FkZWRQcm9wZXJseSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSU1ldGhvZCBuZXdNZXRob2QgPSBzZWkxQ1UuZmluZFByaW1hcnlUeXBlKCkuY3JlYXRlTWV0aG9kKCJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwid2ViTmFtZVwiLCBleGNsdWRlPXRydWUpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzV2l0aEFubm90YXRpb24oaW50IGkpOyIsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWZpbmFsIElXZWJNZXRob2QgbmV3V2ViTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG5ld01ldGhvZCkpOw0KLQkJYXNzZXJ0Tm90TnVsbChuZXdXZWJNZXRob2QpOw0KLQkJZmluYWwgSU1ldGhvZCBvbGRNZXRob2QgPSBzZWkxQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJ2b2lkTWV0aG9kV2l0aE5vQXJnc1dpdGhBbm5vdGF0aW9uIiwgbmV3IFN0cmluZ1swXSk7DQotCQlhc3NlcnROb3RTYW1lKG5ld1dlYk1ldGhvZCwgZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG9sZE1ldGhvZCkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9NZXRob2RzRnJvbVN1cGVyVHlwZUxvYWRlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSU1ldGhvZCBwYXJlbnRNZXRob2QgPSBzb21lSW50ZkNVLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgidm9pZE1ldGhvZFdpdGhOb0FyZ3NOb0Fubm90YXRpb25JblBhcmVudCIsIG5ldyBTdHJpbmdbMF0pOw0KLQkJYXNzZXJ0Tm90TnVsbChkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24ocGFyZW50TWV0aG9kKSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X092ZXJyaWRlTWV0aG9kc0xvYWRlZFByb3Blcmx5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlzZWkxQ1UuZmluZFByaW1hcnlUeXBlKCkuY3JlYXRlTWV0aG9kKCJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwid2ViTmFtZVwiLCBleGNsdWRlPXRydWUpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzTm9Bbm5vdGF0aW9uSW5QYXJlbnQoKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQ0KLQkJZmluYWwgSU1ldGhvZCBvdmVycmlkZW5NZXRob2QgPSBzZWkxQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJ2b2lkTWV0aG9kV2l0aE5vQXJnc05vQW5ub3RhdGlvbkluUGFyZW50IiwgIG5ldyBTdHJpbmdbMF0pOw0KLQkJZmluYWwgSVdlYk1ldGhvZCB3bSA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihvdmVycmlkZW5NZXRob2QpKTsNCi0JCWFzc2VydE5vdE51bGwod20pOw0KLQkJYXNzZXJ0RXF1YWxzKCJ3ZWJOYW1lIiwgd20uZ2V0TmFtZSgpKTsNCi0JCWFzc2VydFRydWUod20uaXNFeGNsdWRlZCgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9DaGFuZ2VkTWV0aG9kSW5QYXJlbnRJbnRlcmZhY2VTeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlzb21lSW50ZkNVLmdldEJ1ZmZlcigpLnNhdmUobnVsbCwgZmFsc2UpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJZmluYWwgSU1ldGhvZCBwYXJlbnRNZXRob2QgPSBzb21lSW50ZkNVLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgidm9pZE1ldGhvZFdpdGhOb0FyZ3NOb0Fubm90YXRpb25JblBhcmVudCIsIG5ldyBTdHJpbmdbMF0pOw0KLQkJZmluYWwgSVdlYk1ldGhvZCB3bSA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihwYXJlbnRNZXRob2QpKTsNCi0JCWFzc2VydEVxdWFscygidm9pZE1ldGhvZFdpdGhOb0FyZ3NOb0Fubm90YXRpb25JblBhcmVudCIsIHdtLmdldE5hbWUoKSk7DQotCQlhc3NlcnRGYWxzZSh3bS5pc0V4Y2x1ZGVkKCkpOw0KLQkJRmlsZVV0aWxzLmdldEluc3RhbmNlKCkuc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudChzb21lSW50ZkNVLCAicHVibGljIGludGVyZmFjZSBTb21lSW50ZntcbiIgKw0KLQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cIk1ldGhvZEluUGFyZW50Q2xhc3NXaXRoTmV3TmFtZVwiLCBleGNsdWRlPXRydWUpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzTm9Bbm5vdGF0aW9uSW5QYXJlbnQoKTtcbiIgKw0KLQkJCQkifSIsIGZhbHNlLCBudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwod20pOw0KLQkJYXNzZXJ0RXF1YWxzKCJNZXRob2RJblBhcmVudENsYXNzV2l0aE5ld05hbWUiLCB3bS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0VHJ1ZSh3bS5pc0V4Y2x1ZGVkKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X0NoYW5nZWRTb2FwQmluZGluZ1N5bmNoZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsJDQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyhzZWkxQ1UsICJAamF2YXguandzLldlYlNlcnZpY2UoKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTEgeyBwdWJsaWMgdm9pZCBzb2FwQmluZGluZ01ldGhvZCgpOyB9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlmaW5hbCBJTWV0aG9kIG5ld01ldGhvZCA9IHNlaTFDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoInNvYXBCaW5kaW5nTWV0aG9kIiwgbmV3IFN0cmluZ1swXSk7DQotCQlmaW5hbCBJV2ViTWV0aG9kIG5ld1dlYk1ldGhvZCA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihuZXdNZXRob2QpKTsNCi0JCWFzc2VydE5vdE51bGwobmV3V2ViTWV0aG9kKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5ULCBuZXdXZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdTdHlsZSgpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1VzZS5MSVRFUkFMLCBuZXdXZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdVc2UoKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVELCBuZXdXZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpKTsNCi0JCQ0KLQkJdGVzdFV0aWwuc2V0Q29udGVudHMoc2VpMUNVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKCkgcHVibGljIGludGVyZmFjZSBTZWkxIHsgXG4iICsNCi0JCQkJIkBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyhzdHlsZT1TdHlsZS5SUEMsIHVzZT1Vc2UuRU5DT0RFRCwgcGFyYW1ldGVyU3R5bGU9UGFyYW1ldGVyU3R5bGUuQkFSRSlcbiIgKw0KLQkJCQkicHVibGljIHZvaWQgc29hcEJpbmRpbmdNZXRob2QoKTsgfSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nU3R5bGUuUlBDLCBuZXdXZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdTdHlsZSgpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1VzZS5FTkNPREVELCBuZXdXZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdVc2UoKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFLCBuZXdXZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9Tb2FwQmluZGluZ09uU2VpU3luY2hlZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOwkNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHNlaTFDVSwgIkBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyhzdHlsZT1TdHlsZS5SUEMsIHVzZT1Vc2UuRU5DT0RFRCwgcGFyYW1ldGVyU3R5bGU9UGFyYW1ldGVyU3R5bGUuQkFSRSlcbiIgKyANCi0JCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZSgpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMSB7IHB1YmxpYyB2b2lkIHNvYXBCaW5kaW5nTWV0aG9kKCk7IH0iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWZpbmFsIElNZXRob2QgbmV3TWV0aG9kID0gc2VpMUNVLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgic29hcEJpbmRpbmdNZXRob2QiLCBuZXcgU3RyaW5nWzBdKTsNCi0JCWZpbmFsIElXZWJNZXRob2QgbmV3V2ViTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG5ld01ldGhvZCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nU3R5bGUuUlBDLCBuZXdXZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdTdHlsZSgpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1VzZS5FTkNPREVELCBuZXdXZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdVc2UoKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFLCBuZXdXZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9Tb2FwQmluZGluZ09uU2VpT3ZlcmxhcHBpbmdBbm5vdGF0aW9uT25NZXRob2RTeW5jaGVkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyhzZWkxQ1UsICJAamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcoc3R5bGU9U3R5bGUuUlBDLCB1c2U9VXNlLkVOQ09ERUQsIHBhcmFtZXRlclN0eWxlPVBhcmFtZXRlclN0eWxlLkJBUkUpXG4iICsgDQotCQkJCSJAamF2YXguandzLldlYlNlcnZpY2UoKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTEgeyAiICsNCi0JCQkJCSJAamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcoc3R5bGU9U3R5bGUuRE9DVU1FTlQsIHVzZT1Vc2UuTElURVJBTCwgcGFyYW1ldGVyU3R5bGU9UGFyYW1ldGVyU3R5bGUuV1JBUFBFRCkiICsNCi0JCQkJCSJwdWJsaWMgdm9pZCBzb2FwQmluZGluZ01ldGhvZCgpOyIgKyANCi0JCQkJIn0iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWZpbmFsIElNZXRob2QgbmV3TWV0aG9kID0gc2VpMUNVLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgic29hcEJpbmRpbmdNZXRob2QiLCBuZXcgU3RyaW5nWzBdKTsNCi0JCWZpbmFsIElXZWJNZXRob2QgbmV3V2ViTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG5ld01ldGhvZCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQsIG5ld1dlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1N0eWxlKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nVXNlLkxJVEVSQUwsIG5ld1dlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1VzZSgpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQsIG5ld1dlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkpOw0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9Tb2FwQmluZGluZ09uU2VpV3JvbmdPdmVybGFwcGluZ0Fubm90YXRpb25Pbk1ldGhvZFN5bmNoZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsJDQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyhzZWkxQ1UsICJAamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcoc3R5bGU9U3R5bGUuUlBDLCB1c2U9VXNlLkVOQ09ERUQsIHBhcmFtZXRlclN0eWxlPVBhcmFtZXRlclN0eWxlLkJBUkUpXG4iICsgDQotCQkJCSJAamF2YXguandzLldlYlNlcnZpY2UoKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTEgeyAiICsNCi0JCQkJCSJAamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcoc3R5bGU9U3R5bGUuRE9DVU1FTlQxLCB1c2U9VXNlLkxJVEVSQUwxLCBwYXJhbWV0ZXJTdHlsZT1QYXJhbWV0ZXJTdHlsZS5XUkFQUEVEMSkiICsNCi0JCQkJCSJwdWJsaWMgdm9pZCBzb2FwQmluZGluZ01ldGhvZCgpOyIgKyANCi0JCQkJIn0iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWZpbmFsIElNZXRob2QgbmV3TWV0aG9kID0gc2VpMUNVLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgic29hcEJpbmRpbmdNZXRob2QiLCBuZXcgU3RyaW5nWzBdKTsNCi0JCWZpbmFsIElXZWJNZXRob2QgbmV3V2ViTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG5ld01ldGhvZCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nU3R5bGUuUlBDLCBuZXdXZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdTdHlsZSgpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1VzZS5FTkNPREVELCBuZXdXZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdVc2UoKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFLCBuZXdXZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpKTsNCi0JfQkNCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvU2VpU3luY3Jvbml6YXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9TZWlTeW5jcm9uaXphdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOThlYWUxYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9TZWlTeW5jcm9uaXphdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qb2JzLkpvYlV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuSmF4V3NVdGlsczsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgU2VpU3luY3Jvbml6YXRpb25UZXN0IGV4dGVuZHMgU3luY2hyb25pemF0aW9uVGVzdEZpeHR1cmUNCi17DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRTZWlOYW1lU3luY2hlZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBzZWkxQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHNlaTEuZ2V0SW1wbGVtZW50YXRpb24oKSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyhzZWkxQ1UsICJAamF2YXguandzLldlYlNlcnZpY2UoKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTEge30iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQlhc3NlcnRFcXVhbHMoIlNlaTEiLCBzZWkxLmdldE5hbWUoKSk7IC8vIGNoZWNrIGRlZmF1bHQgdmFsdWUNCi0JCQ0KLQkJdGVzdFV0aWwuc2V0Q29udGVudHMoc2VpMUNVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkxTmV3TmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTEge30iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQlhc3NlcnRFcXVhbHMoIlNlaTFOZXdOYW1lIiwgc2VpMS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0VHJ1ZShzZWkxLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuY29udGFpbnMod3MxKSk7DQotCQlhc3NlcnRTYW1lKHNlaTEsIGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoxLCBzZWkxLmdldEltcGxlbWVudGF0aW9uKCkpKTsNCi0JCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRTZWlUYXJnZXROYW1lc3BhY2VTeW5jaGVkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlhc3NlcnRFcXVhbHMoSmF4V3NVdGlscy5jb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2UocHJqMVBja05hbWUpLCBzZWkxLmdldFRhcmdldE5hbWVzcGFjZSgpKTsgLy8gY2hlY2sgZGVmYXVsdCB2YWx1ZQ0KLQkJDQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHNlaTFDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoc2VpMS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHNlaTFDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpMU5ld05hbWVcIiwgdGFyZ2V0TmFtZXNwYWNlPVwiaHR0cDovL2NvbS5zYXAvdGVzdFwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTEge30iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQlhc3NlcnRFcXVhbHMoIlNlaTFOZXdOYW1lIiwgc2VpMS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0VHJ1ZShzZWkxLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuY29udGFpbnMod3MxKSk7DQotCQlhc3NlcnRTYW1lKHNlaTEsIGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoxLCBzZWkxLmdldEltcGxlbWVudGF0aW9uKCkpKTsNCi0JCWFzc2VydEVxdWFscygiU0VJIHRhcmdldE5hbWVzcGFjZSBub3Qgc3luY2hlZCIsICJodHRwOi8vY29tLnNhcC90ZXN0Iiwgc2VpMS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7CQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9Tb2FwQmluZGluZ1N0eWxlQ2hhbmdlZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQsIHNlaTEuZ2V0U29hcEJpbmRpbmdTdHlsZSgpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1VzZS5MSVRFUkFMLCBzZWkxLmdldFNvYXBCaW5kaW5nVXNlKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCwgc2VpMS5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkpOw0KLQ0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBzZWkxQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHNlaTEuZ2V0SW1wbGVtZW50YXRpb24oKSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyhzZWkxQ1UsICJAamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcoc3R5bGU9U3R5bGUuUlBDLCB1c2U9VXNlLkVOQ09ERUQsIHBhcmFtZXRlclN0eWxlPVBhcmFtZXRlclN0eWxlLkJBUkUpIiArIA0KLQkJCQkiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKCkgcHVibGljIGludGVyZmFjZSBTZWkxIHt9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nU3R5bGUuUlBDLCBzZWkxLmdldFNvYXBCaW5kaW5nU3R5bGUoKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdVc2UuRU5DT0RFRCwgc2VpMS5nZXRTb2FwQmluZGluZ1VzZSgpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUsIHNlaTEuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpKTsJCQ0KLQl9DQotLy8JDQotLy8JcHVibGljIHZvaWQgdGVzdF9Mb2NhdGlvbkludGVyZmFjZUFkYXB0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotLy8Jew0KLS8vCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHNlaTFDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoc2VpMS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0vLwkJdGVzdFV0aWwuc2V0Q29udGVudHMoc2VpMUNVLCAiQGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nKHN0eWxlPVN0eWxlLlJQQywgdXNlPVVzZS5FTkNPREVELCBwYXJhbWV0ZXJTdHlsZT1QYXJhbWV0ZXJTdHlsZS5CQVJFKSIgKyANCi0vLwkJCQkiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKCkgcHVibGljIGludGVyZmFjZSBTZWkxIHt9Iik7DQotLy8JCQ0KLS8vCQlJTG9jYXRvckFkYXB0ZXIgYWRhcHRlciA9IChJTG9jYXRvckFkYXB0ZXIpZmluZEFkYXB0ZXIoc2VpMSwgSUxvY2F0b3JBZGFwdGVyLmNsYXNzKTsNCi0vLwkJYXNzZXJ0Tm90TnVsbChhZGFwdGVyKTsNCi0vLwkJSUFubm90YXRpb25Mb2NhdG9yIGxvY2F0b3IgPSBhZGFwdGVyLmdldEFubm90YXRpb25Mb2NhdG9yKFdTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT04pOw0KLS8vCQlwcmludExvY2F0b3IoIldTIiwgbG9jYXRvci5nZXRMb2NhdGlvbigpKTsNCi0vLwkJbG9jYXRvciA9IGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbkxvY2F0b3IoU0JBbm5vdGF0aW9uRmVhdHVyZXMuU0JfQU5OT1RBVElPTik7DQotLy8JCXByaW50TG9jYXRvcigiU0IiLCBsb2NhdG9yLmdldExvY2F0aW9uKCkpOw0KLS8vCQlwcmludExvY2F0b3IoInVzZSIsIGxvY2F0b3IuZ2V0QXR0cmlidXRlTmFtZUxvY2F0aW9uKCJ1c2UiKSk7DQotLy8JCXByaW50TG9jYXRvcigidXNlVmFsIiwgbG9jYXRvci5nZXRBdHRyaWJ1dGVWYWx1ZUxvY2F0aW9uKCJ1c2UiKSk7DQotLy8JfQ0KLS8vCQ0KLS8vCXByaXZhdGUgdm9pZCBwcmludExvY2F0b3IoU3RyaW5nIG5hbWUsIElMb2NhdG9yIGxvY2F0b3IpDQotLy8Jew0KLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4obmFtZSArICItLS0tLS0iKTsNCi0vLwkJU3lzdGVtLm91dC5wcmludGxuKGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0vLwkJU3lzdGVtLm91dC5wcmludGxuKGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOwkJDQotLy8JfQkNCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvU3luY2hyb25pemF0aW9uVGVzdEZpeHR1cmUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL1N5bmNocm9uaXphdGlvblRlc3RGaXh0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0OTBkNzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvU3luY2hyb25pemF0aW9uVGVzdEZpeHR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VEZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Eb21VdGlsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5Eb21UZXN0VXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmpvYnMuSm9iVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0RWpiM1Byb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdDsNCi0NCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uVGVzdEZpeHR1cmUgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UNCi17DQotCXByb3RlY3RlZCBUZXN0UHJvamVjdCB0ZXN0UHJqMTsgDQotCXByb3RlY3RlZCBUZXN0UHJvamVjdCB0ZXN0UHJqMjsNCi0JcHJvdGVjdGVkIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgdGFyZ2V0Ow0KLQlwcm90ZWN0ZWQgSUphdmFNb2RlbCBqYXZhTW9kZWw7DQotCQ0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBwcmoxUGNrTmFtZSA9ICJjb20uc2FwLnRlc3QubW9kZWxzeW5jMSI7CQ0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBwcmoyUGNrTmFtZSA9ICJjb20uc2FwLnRlc3QubW9kZWxzeW5jMiI7DQotCQ0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyB3czFJbXBsTmFtZSA9IHByajFQY2tOYW1lICsgIi5XUzEiOw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBzZWkxSW1wbE5hbWUgPSBwcmoxUGNrTmFtZSArICIuU2VpMSI7DQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIHdzMkltcGxOYW1lID0gcHJqMlBja05hbWUgKyAiLldTMiI7DQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIHNlaTJJbXBsTmFtZSA9IHByajJQY2tOYW1lICsgIi5TZWkyIjsJDQotCQ0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqMTsNCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlIHdzMTsNCi0JcHJvdGVjdGVkIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpMTsNCi0JDQotCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3Qgd3NQcmoyOw0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2Ugd3MyOw0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkyOw0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxTdHJpbmc+IGFsbG93ZWRQcm9qZWN0czsNCi0JDQotCXByb3RlY3RlZCBEb21VdGlsIGRvbVV0aWwgPSAgbmV3IERvbVV0aWwoKTsNCi0JcHJvdGVjdGVkIERvbVRlc3RVdGlscyB0ZXN0VXRpbCA9ICBuZXcgRG9tVGVzdFV0aWxzKCk7DQotDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlhbGxvd2VkUHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMyk7DQotCQlqYXZhTW9kZWwgPSBKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7DQotCQl0YXJnZXQgPSBjcmVhdGVUYXJnZXQoKTsNCi0JCXRlc3RQcmoxID0gbmV3IFRlc3RQcm9qZWN0KG5ldyBUZXN0RWpiM1Byb2plY3QoIlRlc3RQcm9qZWN0MSIpLmdldFByb2plY3QoKSk7DQotCQl0ZXN0UHJqMS5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMxID0gdGVzdFByajEuY3JlYXRlUGFja2FnZSgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEiKTsNCi0JCWZpbmFsIFN0cmluZyBqYXZhTW9kZWxFcnJvck1lc3NhZ2UgPSAiSmF2YSBNb2RlbCBFcnJvci4gSnVzdCBjcmVhdGVkIHR5cGUgbm90IGZvdW5kIGluIHRoZSBqYXZhIG1vZGVsIjsNCi0JCWFzc2VydE5vdE51bGwoamF2YU1vZGVsRXJyb3JNZXNzYWdlLCB0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJTZWkxLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkxTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTEge30iKSk7DQotCQlhc3NlcnROb3ROdWxsKGphdmFNb2RlbEVycm9yTWVzc2FnZSwgdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiV1MxLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MxTmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxLlNlaTFcIikgcHVibGljIGNsYXNzIFdTMSB7fSIpKTsNCi0JCQkJDQotCQl0ZXN0UHJqMiA9IG5ldyBUZXN0UHJvamVjdChuZXcgVGVzdEVqYjNQcm9qZWN0KCJUZXN0UHJvamVjdDIiKS5nZXRQcm9qZWN0KCkpOw0KLQkJdGVzdFByajIuY3JlYXRlU291cmNlRm9sZGVyKCJzcmMiKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jMiA9IHRlc3RQcmoyLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmMyIik7DQotCQlhc3NlcnROb3ROdWxsKGphdmFNb2RlbEVycm9yTWVzc2FnZSwgdGVzdFByajIuY3JlYXRlVHlwZShtb2RlbFN5bmMyLCAiU2VpMi5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpMk5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkyIHt9IikpOw0KLQkJYXNzZXJ0Tm90TnVsbChqYXZhTW9kZWxFcnJvck1lc3NhZ2UsIHRlc3RQcmoyLmNyZWF0ZVR5cGUobW9kZWxTeW5jMiwgIldTMi5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMk5hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMS5TZWkyXCIpIHB1YmxpYyBjbGFzcyBXUzIge30iKSk7DQotCQkNCi0JCWFsbG93ZWRQcm9qZWN0cy5hZGQodGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCWFsbG93ZWRQcm9qZWN0cy5hZGQodGVzdFByajIuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCXRhcmdldC5sb2FkKG51bGwpOw0KLQkJd3NQcmoxID0gZG9tVXRpbC5maW5kUHJvamVjdEJ5TmFtZSh0YXJnZXQuZ2V0RE9NKCksIHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQlhc3NlcnROb3ROdWxsKHdzUHJqMSk7DQotCQkNCi0JCWFzc2VydEVxdWFscygxLCB3c1ByajEuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgd3NQcmoxLmdldFdlYlNlcnZpY2VzKCkuc2l6ZSgpKTsNCi0JCQkJDQotCQl3czEgPSBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCB3czFJbXBsTmFtZSk7DQotCQlhc3NlcnROb3ROdWxsKHdzMSk7DQotCQlzZWkxID0gZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsIHNlaTFJbXBsTmFtZSk7DQotCQlhc3NlcnROb3ROdWxsKHNlaTEpOw0KLQkJd3NQcmoyID0gZG9tVXRpbC5maW5kUHJvamVjdEJ5TmFtZSh0YXJnZXQuZ2V0RE9NKCksIHRlc3RQcmoyLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQlhc3NlcnROb3ROdWxsKHdzUHJqMik7DQotCQlhc3NlcnRFcXVhbHMoMSwgd3NQcmoyLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzUHJqMi5nZXRXZWJTZXJ2aWNlcygpLnNpemUoKSk7DQotCQkNCi0JCXdzMiA9IGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajIsIHdzMkltcGxOYW1lKTsNCi0JCWFzc2VydE5vdE51bGwod3MyKTsNCi0JCXNlaTIgPSBkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJqMiwgc2VpMkltcGxOYW1lKTsNCi0JCWFzc2VydE5vdE51bGwoc2VpMik7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBiZWZvcmVUZXN0Q2FzZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWVuYWJsZUF1dG9CdWlsZChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCksIGZhbHNlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIGFmdGVyVGVzdENhc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQllbmFibGVBdXRvQnVpbGQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLCB0cnVlKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUF1dG9CdWlsZChJV29ya3NwYWNlIHdzLCBib29sZWFuIGVuYWJsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2MgPSB3cy5nZXREZXNjcmlwdGlvbigpOw0KLQkJZGVzYy5zZXRBdXRvQnVpbGRpbmcoZW5hYmxlKTsNCi0JCXdzLnNldERlc2NyaXB0aW9uKGRlc2MpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgQWRhcHRlciBmaW5kQWRhcHRlcihFT2JqZWN0IG9iamVjdCwgQ2xhc3M8Pz4gY2xhenopIHsNCi0JCWZvciAoQWRhcHRlciBhZGFwdGVyOiBvYmplY3QuZUFkYXB0ZXJzKCkpIHsNCi0JCQlpZiAoYWRhcHRlci5pc0FkYXB0ZXJGb3JUeXBlKGNsYXp6KSkgew0KLQkJCQlyZXR1cm4gYWRhcHRlcjsgDQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkJDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdG9wU3luY2hyb25pemluZygpOw0KLQkJdGVzdFByajEuZGlzcG9zZSgpOw0KLQkJdGVzdFByajIuZGlzcG9zZSgpOw0KLQl9DQotCQ0KLQlwcml2YXRlIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgY3JlYXRlVGFyZ2V0KCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKGphdmFNb2RlbCkgDQotCQl7DQotDQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIGJvb2xlYW4gYXBwcm92ZVByb2plY3QoSUphdmFQcm9qZWN0IHByaikgew0KLQkJCQlmb3IgKFN0cmluZyBhbGxvd2VkUHJqIDogYWxsb3dlZFByb2plY3RzKQ0KLQkJCQl7DQotCQkJCQlpZiAocHJqLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKGFsbG93ZWRQcmopKQ0KLQkJCQkJew0KLQkJCQkJCXJldHVybiB0cnVlOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCXJldHVybiBmYWxzZTsNCi0JCQl9DQotCQl9Ow0KLQl9CQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9Xc1N5bmNocm9uaXphdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL1dzU3luY2hyb25pemF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzODU5ZTllLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL1dzU3luY2hyb25pemF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qb2JzLkpvYlV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuSmF4V3NVdGlsczsNCi0NCi1wdWJsaWMgY2xhc3MgV3NTeW5jaHJvbml6YXRpb25UZXN0IGV4dGVuZHMgU3luY2hyb25pemF0aW9uVGVzdEZpeHR1cmUgDQotew0KLQlwdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRXU25hbWVTeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHdzMUNVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSh3czEuZ2V0SW1wbGVtZW50YXRpb24oKSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyh3czFDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMU5ld05hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMS5TZWkxXCIpIHB1YmxpYyBjbGFzcyBXUzEge30iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWFzc2VydEVxdWFscygiV1MxTmV3TmFtZSIsIHdzMS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0U2FtZShzZWkxLCB3czEuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQkJYXNzZXJ0U2FtZSh3czEsIGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsIHdzMS5nZXRJbXBsZW1lbnRhdGlvbigpKSk7DQotCX0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWROYW1lT2ZJbXBsaWNpdEludGVyZmFjZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMzID0gdGVzdFByajEuY3JlYXRlUGFja2FnZSgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzMiKTsNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3MzQ1UgPSB0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzMsICJXUzMuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzNOYW1lXCIsIG5hbWU9XCJJbXBsaWNpdEludGVyZmFjZU5hbWVcIikgcHVibGljIGNsYXNzIFdTMyB7fSIpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MzID0gZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgd3MzQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBpbXBsU2VpID0gd3MzLmdldFNlcnZpY2VFbmRwb2ludCgpOw0KLQkJYXNzZXJ0VHJ1ZShpbXBsU2VpLmlzSW1wbGljaXQoKSk7DQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyh3czNDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTM05hbWVcIiwgbmFtZT1cIkltcGxpY2l0SW50ZXJmYWNlTmV3TmFtZVwiKSBwdWJsaWMgY2xhc3MgV1MzIHt9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlhc3NlcnRTYW1lKGltcGxTZWksIHdzMy5nZXRTZXJ2aWNlRW5kcG9pbnQoKSk7DQotCQlhc3NlcnRUcnVlKGltcGxTZWkuaXNJbXBsaWNpdCgpKTsNCi0JCWFzc2VydEVxdWFscygiSW1wbGljaXRJbnRlcmZhY2VOZXdOYW1lIiwgaW1wbFNlaS5nZXROYW1lKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRUYXJnZXROYW1lc3BhY2VTeW5jaGVkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlhc3NlcnRFcXVhbHMoSmF4V3NVdGlscy5jb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2UocHJqMVBja05hbWUpLCB3czEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOw0KLQkJDQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHdzQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHdzMS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHdzQ1UsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzFOYW1lXCIsIHRhcmdldE5hbWVzcGFjZT1cImh0dHA6Ly9jb20uc2FwLi90ZXN0XCIpIHB1YmxpYyBjbGFzcyBXUzEge30iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWFzc2VydEVxdWFscygidGFyZ2V0TmFtZXNwYWNlIG5vdCBzeW5jaHJvbml6ZWQiLCAiaHR0cDovL2NvbS5zYXAuL3Rlc3QiLCB3czEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRQb3J0TmFtZVN5bmNoZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3NDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUod3MxLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJYXNzZXJ0RXF1YWxzKCJXUzFQb3J0Iiwgd3MxLmdldFBvcnROYW1lKCkpOw0KLQkJDQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyh3c0NVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHBvcnROYW1lPVwiQ2hhbmdlZFBvcnROYW1lXCIpIHB1YmxpYyBjbGFzcyBXUzEge30iKTs7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoInBvcnROYW1lIG5vdCBzeW5jaHJvbml6ZWQiLCAiQ2hhbmdlZFBvcnROYW1lIiwgd3MxLmdldFBvcnROYW1lKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRXc2RsTG9jYXRpb25TeW5jaGVkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHdzQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHdzMS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCWFzc2VydEVxdWFscyhudWxsLCB3czEuZ2V0V3NkbExvY2F0aW9uKCkpOw0KLQkJDQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyh3c0NVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHdzZGxMb2NhdGlvbj1cIkM6L2NoYW5nZWQvd3NkbC9sb2NhdGlvblwiKSBwdWJsaWMgY2xhc3MgV1MxIHt9Iik7Ow0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKCJ3c2RsTG9jYXRpb24gbm90IHN5bmNocm9uaXplZCIsICJDOi9jaGFuZ2VkL3dzZGwvbG9jYXRpb24iLCB3czEuZ2V0V3NkbExvY2F0aW9uKCkpOw0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkSW1wbGljaXRTZWlTb2FwQmluZGluZygpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3c0NVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSh3czEuZ2V0SW1wbGVtZW50YXRpb24oKSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQkNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHdzQ1UsICJAamF2YXguandzLldlYlNlcnZpY2UoKSBwdWJsaWMgY2xhc3MgV1MxIHt9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5ULCBzZWkuZ2V0U29hcEJpbmRpbmdTdHlsZSgpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1VzZS5MSVRFUkFMLCBzZWkuZ2V0U29hcEJpbmRpbmdVc2UoKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVELCBzZWkuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpKTsNCi0NCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHdzQ1UsICJAamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcoc3R5bGU9U3R5bGUuUlBDLCB1c2U9VXNlLkVOQ09ERUQsIHBhcmFtZXRlclN0eWxlPVBhcmFtZXRlclN0eWxlLkJBUkUpXG4iICsgDQotCQkJCSJAamF2YXguandzLldlYlNlcnZpY2UoKSBwdWJsaWMgY2xhc3MgV1MxIHt9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdTdHlsZS5SUEMsIHNlaS5nZXRTb2FwQmluZGluZ1N0eWxlKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nVXNlLkVOQ09ERUQsIHNlaS5nZXRTb2FwQmluZGluZ1VzZSgpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUsIHNlaS5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkpOwkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9Db250cnVjdG9ySXNOb3RJbmNsdWRlZEluV2ViTWV0aG9kcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3c0NVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSh3czEuZ2V0SW1wbGVtZW50YXRpb24oKSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQkNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHdzQ1UsICJAamF2YXguandzLldlYlNlcnZpY2UoKXB1YmxpYyBjbGFzcyBXUzF7cHVibGljIFdTMSgpe307cHVibGljIFdTMShTdHJpbmcgcyl7fXB1YmxpYyB2b2lkIG15TWV0aG9kKCl7fX0iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gd3MxLmdldFNlcnZpY2VFbmRwb2ludCgpOw0KLQkJZmluYWwgRUxpc3Q8SVdlYk1ldGhvZD4gbWV0aG9kcyA9IHNlaS5nZXRXZWJNZXRob2RzKCk7DQotCQlhc3NlcnRFcXVhbHMoIk9uZSBtZXRob2QgZXhwZWN0ZWQgaW4gdGhlIFNFSSIsIDEsIG1ldGhvZHMuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscygiVW5wZXhwZWN0ZWQgbWV0aG9kIG5hbWUgaW4gU0VJIiwgIm15TWV0aG9kIiwgbWV0aG9kcy5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS91dGlsL0RvbTJSZXNvdXJjZU1hcHBlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS91dGlsL0RvbTJSZXNvdXJjZU1hcHBlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWU2Y2YwNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdXRpbC9Eb20yUmVzb3VyY2VNYXBwZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnV0aWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Eb21VdGlsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RPTVJ1bnRpbWVFeHRlbnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01SdW50aW1lTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuRG9tMlJlc291cmNlTWFwcGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdEVqYjNQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3Q7DQotDQotLyoqDQotICogVGVzdHMgZm9yIHtAbGluayBEb20yUmVzb3VyY2VNYXBwZXJ9IGNsYXNzDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEb20yUmVzb3VyY2VNYXBwZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgDQotew0KLQlwcml2YXRlIERvbTJSZXNvdXJjZU1hcHBlciBtYXBwZXIgPSBEb20yUmVzb3VyY2VNYXBwZXIuSU5TVEFOQ0U7DQotCXByaXZhdGUgVGVzdFByb2plY3QgdGVzdFByb2plY3Q7DQotCXByaXZhdGUgVGVzdFByb2plY3QgdGVzdFByb2plY3QxOw0KLQkNCi0JcHJpdmF0ZSBJVHlwZSBzZWlUeXBlOw0KLQlwcml2YXRlIElUeXBlIHdzVHlwZTsJDQotCXByaXZhdGUgSURPTSBkb207IA0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgkNCi0Jew0KLQkJdGVzdFByb2plY3QgPSBwcmVwYXJlUHJvamVjdCgpOw0KLQkJSVBhY2thZ2VGcmFnbWVudCBwY2sgPSB0ZXN0UHJvamVjdC5jcmVhdGVQYWNrYWdlKCJ0ZXN0Iik7DQotCQlzZWlUeXBlID0gdGVzdFByb2plY3QuY3JlYXRlVHlwZShwY2ssICJTZWkuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UgcHVibGljIGludGVyZmFjZSBTZWkgeyBcbiIgKw0KLQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2QgcHVibGljIHZvaWQgdGVzdChpbnQgYSk7IFxuIiArDQotCQkJCSJ9Iik7DQotCQkNCi0JCXRlc3RQcm9qZWN0MSA9IHByZXBhcmVQcm9qZWN0KCk7DQotCQlwY2sgPSB0ZXN0UHJvamVjdDEuY3JlYXRlUGFja2FnZSgidGVzdCIpOw0KLQkJd3NUeXBlID0gdGVzdFByb2plY3QxLmNyZWF0ZVR5cGUocGNrLCAiV3MuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UgcHVibGljIGNsYXNzIFdzIHt9Iik7DQotCQkNCi0JCQ0KLQkJZmluYWwgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBkb21SdW50aW1lID0gV3NET01SdW50aW1lTWFuYWdlci5pbnN0YW5jZSgpLmdldERPTVJ1bnRpbWUoIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uamVlNSIpOw0KLQkJZG9tUnVudGltZS5jcmVhdGVET00obnVsbCk7DQotCQlkb20gPSBkb21SdW50aW1lLmdldERPTSgpOwkJDQotCX0NCi0JDQotCXByaXZhdGUgVGVzdFByb2plY3QgcHJlcGFyZVByb2plY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCVRlc3RFamIzUHJvamVjdCB0cCA9IG5ldyBUZXN0RWpiM1Byb2plY3QoIkVqYiIpOwkJDQotCQlyZXR1cm4gbmV3IFRlc3RQcm9qZWN0KHRwLmdldFByb2plY3QoKSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpDQotCXsNCi0JCXRyeSB7DQotCQkJdGVzdFByb2plY3QuZGlzcG9zZSgpOw0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIF8pIHt9DQotCQl0cnkgew0KLQkJCXRlc3RQcm9qZWN0MS5kaXNwb3NlKCk7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gXykge30JCQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RGaW5kUHJvamVjdCgpIA0KLQl7DQotCQlJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gRG9tVXRpbC5JTlNUQU5DRS5maW5kUHJvamVjdEJ5TmFtZShkb20sIHRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpOw0KLQkJSVByb2plY3QgcHJvamVjdCA9IG1hcHBlci5maW5kUHJvamVjdCh3c1Byb2plY3QpOw0KLQkJYXNzZXJ0RXF1YWxzKHRlc3RQcm9qZWN0LmdldFByb2plY3QoKSwgcHJvamVjdCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEZpbmRSZXNvdXJjZVNlaSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCUlXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgPSBEb21VdGlsLklOU1RBTkNFLmZpbmRQcm9qZWN0QnlOYW1lKGRvbSwgdGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IERvbVV0aWwuSU5TVEFOQ0UuZmluZFNlaUJ5SW1wbE5hbWUod3NQcm9qZWN0LCAidGVzdC5TZWkiKTsNCi0JCWFzc2VydE5vdE51bGwoc2VpKTsNCi0JCQ0KLQkJLy8gZmluZCB1c2luZyBTRUkNCi0JCUlUeXBlIHR5cGUgPSBtYXBwZXIuZmluZFR5cGUoc2VpKTsNCi0JCWFzc2VydE5vdE51bGwodHlwZSk7DQotCQlhc3NlcnRFcXVhbHMoc2VpVHlwZSwgdHlwZSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEZpbmRSZXNvdXJjZVdzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCA9IERvbVV0aWwuSU5TVEFOQ0UuZmluZFByb2plY3RCeU5hbWUoZG9tLCB0ZXN0UHJvamVjdDEuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7DQotCQlJV2ViU2VydmljZSB3cyA9IERvbVV0aWwuSU5TVEFOQ0UuZmluZFdzQnlJbXBsTmFtZSh3c1Byb2plY3QsICJ0ZXN0LldzIik7DQotCQlhc3NlcnROb3ROdWxsKHdzKTsNCi0JCQ0KLQkJSVR5cGUgdHlwZSA9IG1hcHBlci5maW5kVHlwZSh3cyk7DQotCQlhc3NlcnROb3ROdWxsKHR5cGUpOw0KLQkJYXNzZXJ0RXF1YWxzKHdzVHlwZSwgdHlwZSk7CQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEZpbmRSZXNvdXJjZVdlYk1ldGhvZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCUlXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgPSBEb21VdGlsLklOU1RBTkNFLmZpbmRQcm9qZWN0QnlOYW1lKGRvbSwgdGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IERvbVV0aWwuSU5TVEFOQ0UuZmluZFNlaUJ5SW1wbE5hbWUod3NQcm9qZWN0LCAidGVzdC5TZWkiKTsNCi0JCWFzc2VydE5vdE51bGwoc2VpKTsNCi0JCQ0KLQkJSVR5cGUgdHlwZSA9IG1hcHBlci5maW5kVHlwZShzZWkuZ2V0V2ViTWV0aG9kcygpLmdldCgwKSk7DQotCQlhc3NlcnROb3ROdWxsKHR5cGUpOw0KLQkJYXNzZXJ0RXF1YWxzKHNlaVR5cGUsIHR5cGUpOwkJDQotCQkNCi0JCWZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYk1ldGhvZCgpOyAJCQkNCi0JCXR5cGUgPSBtYXBwZXIuZmluZFR5cGUod2ViTWV0aG9kKTsNCi0JCWFzc2VydE51bGwodHlwZSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RGaW5kUmVzb3VyY2VXZWJQYXJhbSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCUlXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgPSBEb21VdGlsLklOU1RBTkNFLmZpbmRQcm9qZWN0QnlOYW1lKGRvbSwgdGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IERvbVV0aWwuSU5TVEFOQ0UuZmluZFNlaUJ5SW1wbE5hbWUod3NQcm9qZWN0LCAidGVzdC5TZWkiKTsNCi0JCWFzc2VydE5vdE51bGwoc2VpKTsNCi0NCi0JCUlUeXBlIHR5cGUgPSBtYXBwZXIuZmluZFR5cGUoc2VpLmdldFdlYk1ldGhvZHMoKS5nZXQoMCkuZ2V0UGFyYW1ldGVycygpLmdldCgwKSk7DQotCQlhc3NlcnROb3ROdWxsKHR5cGUpOw0KLQkJYXNzZXJ0RXF1YWxzKHNlaVR5cGUsIHR5cGUpOwkJCQ0KLQl9CQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdXRpbC9Eb21VdGlsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3V0aWwvRG9tVXRpbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWNmZGQyMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdXRpbC9Eb21VdGlsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnV0aWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Eb21VdGlsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgRG9tVXRpbFRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UNCi17DQotCXByaXZhdGUgRG9tVXRpbCB1dGlsOyANCi0JDQotCXB1YmxpYyB2b2lkIHNldFVwKCkNCi0Jew0KLQkJdXRpbCA9IG5ldyBEb21VdGlsKCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdElzT3V0aWRlSW5XZWJTZXJ2aWNlKCkNCi0Jew0KLQkJTW9jazxJV2ViU2VydmljZT4gd3MgPSBtb2NrKElXZWJTZXJ2aWNlLmNsYXNzKTsNCi0JCXdzLnN0dWJzKCkubWV0aG9kKCJnZXRXc2RsTG9jYXRpb24iKS53aWxsKHJldHVyblZhbHVlKCJDOi90ZXN0L3dzZGwvbG9jYXRpb24iKSk7DQotCQlNb2NrPElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+IHNlaSA9IG1vY2soSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcyk7DQotCQlFTGlzdDxJV2ViU2VydmljZT4gaW1wbGVtZXRpbmdXcyA9IG5ldyBCYXNpY0VMaXN0PElXZWJTZXJ2aWNlPigpOw0KLQkJaW1wbGVtZXRpbmdXcy5hZGQod3MucHJveHkoKSk7DQotCQkNCi0JCXNlaS5zdHVicygpLm1ldGhvZCgiZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMiKS53aWxsKHJldHVyblZhbHVlKGltcGxlbWV0aW5nV3MpKTsNCi0JCWFzc2VydFRydWUodXRpbC5pc091dHNpZGVJbldlYlNlcnZpY2Uoc2VpLnByb3h5KCkpKTsNCi0JCQ0KLQkJd3Muc3R1YnMoKS5tZXRob2QoImdldFdzZGxMb2NhdGlvbiIpLndpbGwocmV0dXJuVmFsdWUobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2UodXRpbC5pc091dHNpZGVJbldlYlNlcnZpY2Uoc2VpLnByb3h5KCkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEZpbmRXc1Byb2plY3QoKQ0KLQl7DQotCQlJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0KCk7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0JCUlXZWJNZXRob2QgbWV0aG9kID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYk1ldGhvZCgpOw0KLQkJc2VpLmdldFdlYk1ldGhvZHMoKS5hZGQobWV0aG9kKTsNCi0JCXdzUHJvamVjdC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuYWRkKHNlaSk7DQotCQkNCi0JCWFzc2VydEVxdWFscyh3c1Byb2plY3QsIHV0aWwuZmluZFdzUHJvamVjdChtZXRob2QpKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FsY1VuaXF1ZUltcGwoKQ0KLQl7DQotCQlJV2ViTWV0aG9kIG1ldGhvZCA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJNZXRob2QoKTsNCi0JCW1ldGhvZC5lU2V0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sICJtZXRob2QoSSkiKTsNCi0JCUlXZWJQYXJhbSBwYXJhbSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJQYXJhbSgpOw0KLQkJcGFyYW0uZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCAiYSIpOw0KLQkJbWV0aG9kLmdldFBhcmFtZXRlcnMoKS5hZGQocGFyYW0pOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZChJKSIsIHV0aWwuY2FsY1VuaXF1ZUltcGwobWV0aG9kKSk7DQotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZChJKVthXSIsIHV0aWwuY2FsY1VuaXF1ZUltcGwocGFyYW0pKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTBkNzc5Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5tb2RlbC5Db25zdHJhaW50U2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnNlcnZpY2UuSUNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLkFubm90YXRpb25BZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uSUFubm90YXRpb25BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLmFubm90YXRpb24uaW1wbC5BYnN0cmFjdExvY2F0b3JzVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uSUNvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uSVByb2JsZW1Mb2NhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUxvY2F0b3I7DQotDQotcHVibGljIGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnRUZXN0IGV4dGVuZHMgQWJzdHJhY3RMb2NhdG9yc1Rlc3QgDQotew0KLQlwcml2YXRlIE15QWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludCBjb25zdHJhaW50Ow0KLQlwcml2YXRlIE1vY2s8SVJlc291cmNlPiByZXNvdXJjZTsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpDQotCXsNCi0JCXN1cGVyLnNldFVwKCk7DQotCQlyZXNvdXJjZSA9IG1vY2soSVJlc291cmNlLmNsYXNzKTsJCQ0KLQkJTW9jazxJQ29uc3RyYWludERlc2NyaXB0b3I+IGRlc2NyaXB0b3IgPSBtb2NrKElDb25zdHJhaW50RGVzY3JpcHRvci5jbGFzcyk7DQotCQlkZXNjcmlwdG9yLnN0dWJzKCkubWV0aG9kKCJnZXRQbHVnaW5JZCIpLndpbGwocmV0dXJuVmFsdWUoInBsdWdpbi5pZCIpKTsNCi0JCWRlc2NyaXB0b3Iuc3R1YnMoKS5tZXRob2QoImdldFNldmVyaXR5Iikud2lsbChyZXR1cm5WYWx1ZShDb25zdHJhaW50U2V2ZXJpdHkuRVJST1IpKTsNCi0JCWRlc2NyaXB0b3Iuc3R1YnMoKS5tZXRob2QoImdldFN0YXR1c0NvZGUiKS53aWxsKHJldHVyblZhbHVlKC0xKSk7DQotCQkNCi0JCWNvbnN0cmFpbnQgPSBuZXcgTXlBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50KGRlc2NyaXB0b3IucHJveHkoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVPa1N0YXR1cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCUlXZWJTZXJ2aWNlIHdzID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2UoKTsJCQ0KLQkJSUNvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZCBjcyA9IGNvbnN0cmFpbnQuY3JlYXRlT2tTdGF0dXMod3MpOw0KLQkJYXNzZXJ0Tm90TnVsbCgiQ29uc3RyYWludCBzdGF0dXMgaXMgbnVsbCIsIGNzKTsNCi0JCWFzc2VydFRydWUoY3MuaXNPSygpKTsNCi0JCWFzc2VydEVxdWFscygwLCBjcy5nZXRSZXN1bHRMb2N1cygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoMCwgY3MuZ2V0UHJvYmxlbUxvY2F0aW9ucygpLnNpemUoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUVycm9yU3RhdHVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJSVdlYlNlcnZpY2Ugd3MgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpOwkJDQotCQlJQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkIGNzID0gY29uc3RyYWludC5jcmVhdGVTdGF0dXMod3MsICJlcnJvciBtZXNzYWdlIiwgbnVsbCwgbnVsbCk7DQotCQlhc3NlcnROb3ROdWxsKGNzKTsNCi0JCWFzc2VydEZhbHNlKGNzLmlzT0soKSk7IA0KLQkJSVByb2JsZW1Mb2NhdGlvbiBwbCA9IGNzLmdldFByb2JsZW1Mb2NhdGlvbnMoKS5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydEVxdWFscyhyZXNvdXJjZS5wcm94eSgpLCBwbC5nZXRSZXNvdXJjZSgpKTsNCi0JCWFzc2VydE5vdE51bGwocGwuZ2V0TG9jYXRvcigpKTsNCi0JCWFzc2VydEVxdWFscygwLCBwbC5nZXRMb2NhdG9yKCkuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCWFzc2VydEVxdWFscygwLCBwbC5nZXRMb2NhdG9yKCkuZ2V0TGVuZ3RoKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRMb2NhdG9yTm9Bbm5vdGF0aW9ucygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCUlXZWJTZXJ2aWNlIHdzID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2UoKTsJCQ0KLQkJSVByb2JsZW1Mb2NhdGlvbiBwbCA9IGNvbnN0cmFpbnQuZ2V0TG9jYXRvcih3cywgbnVsbCwgbnVsbCk7DQotCQlhc3NlcnRFcXVhbHMocmVzb3VyY2UucHJveHkoKSwgcGwuZ2V0UmVzb3VyY2UoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRMb2NhdG9yRm9yQW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJSVdlYlNlcnZpY2Ugd3MgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpOw0KLQkJTW9jazxJSmF2YUVsZW1lbnQ+IGphdmFFbGVtZW50ID0gbW9jayhJSmF2YUVsZW1lbnQuY2xhc3MpOw0KLQkJamF2YUVsZW1lbnQuc3R1YnMoKS5tZXRob2QoImdldFJlc291cmNlIikud2lsbChyZXR1cm5WYWx1ZShyZXNvdXJjZS5wcm94eSgpKSk7DQotCQlhbm5vdGF0aW9uLnN0dWJzKCkubWV0aG9kKCJnZXRBcHBsaWVkRWxlbWVudCIpLndpbGwocmV0dXJuVmFsdWUoamF2YUVsZW1lbnQucHJveHkoKSkpOw0KLQkJDQotCQlmaW5hbCBJQW5ub3RhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChJQW5ub3RhdGlvbkFkYXB0ZXIpQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdzLCBJQW5ub3RhdGlvbkFkYXB0ZXIuY2xhc3MpOw0KLQkJYWRhcHRlci5hZGRBbm5vdGF0aW9uKFdTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT04sIGFubm90YXRpb24ucHJveHkoKSk7DQotCQlJUHJvYmxlbUxvY2F0aW9uIHBsID0gY29uc3RyYWludC5nZXRMb2NhdG9yKHdzLCBXU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OLCBudWxsKTsNCi0JCWFzc2VydEVxdWFscyhyZXNvdXJjZS5wcm94eSgpLCBwbC5nZXRSZXNvdXJjZSgpKTsNCi0JCWFzc2VydEVxdWFscyhhbm5vdGF0aW9uLnByb3h5KCkuZ2V0TG9jYXRvcigpLCBwbC5nZXRMb2NhdG9yKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TG9jYXRvckZvckF0dHJpYnV0ZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJSVdlYlNlcnZpY2Ugd3MgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpOwkNCi0JCU1vY2s8SUphdmFFbGVtZW50PiBqYXZhRWxlbWVudCA9IG1vY2soSUphdmFFbGVtZW50LmNsYXNzKTsNCi0JCWphdmFFbGVtZW50LnN0dWJzKCkubWV0aG9kKCJnZXRSZXNvdXJjZSIpLndpbGwocmV0dXJuVmFsdWUocmVzb3VyY2UucHJveHkoKSkpOw0KLQkJYW5ub3RhdGlvbi5zdHVicygpLm1ldGhvZCgiZ2V0QXBwbGllZEVsZW1lbnQiKS53aWxsKHJldHVyblZhbHVlKGphdmFFbGVtZW50LnByb3h5KCkpKTsNCi0JCQ0KLQkJZmluYWwgSUFubm90YXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSUFubm90YXRpb25BZGFwdGVyKUFubm90YXRpb25BZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdCh3cywgSUFubm90YXRpb25BZGFwdGVyLmNsYXNzKTsNCi0JCWFkYXB0ZXIuYWRkQW5ub3RhdGlvbihXU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OLCBhbm5vdGF0aW9uLnByb3h5KCkpOw0KLQkJSVByb2JsZW1Mb2NhdGlvbiBwbCA9IGNvbnN0cmFpbnQuZ2V0TG9jYXRvcih3cywgV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTiwgInBhcmFtMSIpOw0KLQkJYXNzZXJ0RXF1YWxzKHJlc291cmNlLnByb3h5KCksIHBsLmdldFJlc291cmNlKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKHBhcmFtMS5nZXRWYWx1ZSgpLmdldExvY2F0b3IoKSwgcGwuZ2V0TG9jYXRvcigpKTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgY2xhc3MgTXlBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludA0KLQl7DQotCQlwdWJsaWMgTXlBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50KElDb25zdHJhaW50RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7DQotCQkJc3VwZXIoZGVzY3JpcHRvcik7DQotCQl9DQotDQotCQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgY3R4KSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotCQkNCi0JCUBPdmVycmlkZQ0KLQkJcHVibGljIElDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWQgY3JlYXRlT2tTdGF0dXMoRU9iamVjdCBvYmplY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KLQkJCXJldHVybiBzdXBlci5jcmVhdGVPa1N0YXR1cyhvYmplY3QpOw0KLQkJfQ0KLQkJDQotCQlAT3ZlcnJpZGUNCi0JCXByb3RlY3RlZCBJQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkIGNyZWF0ZVN0YXR1cyhFT2JqZWN0IG9iamVjdCwgU3RyaW5nIGVycm9yTWVzc2FnZSwgU3RyaW5nIGFubkZRTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KLQkJCXJldHVybiBzdXBlci5jcmVhdGVTdGF0dXMob2JqZWN0LCBlcnJvck1lc3NhZ2UsIGFubkZRTmFtZSwgYXR0cmlidXRlTmFtZSk7DQotCQl9DQotCQkNCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIElSZXNvdXJjZSBmaW5kUmVzb3VyY2UoRU9iamVjdCBlT2JqZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsJCQkNCi0JCQlyZXR1cm4gcmVzb3VyY2UucHJveHkoKTsNCi0JCX0NCi0JCQ0KLQkJcHVibGljIElQcm9ibGVtTG9jYXRpb24gZ2V0TG9jYXRvcihFT2JqZWN0IGVPYmplY3QsIFN0cmluZyBhbm5GUU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JCQlyZXR1cm4gc3VwZXIuZ2V0TG9jYXRvcihlT2JqZWN0LCBhbm5GUU5hbWUsIGF0dHJpYnV0ZU5hbWUpOw0KLQkJfQ0KLQkJDQotCQlAT3ZlcnJpZGUNCi0JCXByb3RlY3RlZCBJTG9jYXRvciBnZXRMb2NhdG9yRm9ySW1wbGVtZW50YXRpb24oZmluYWwgRU9iamVjdCBlT2JqZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQkJew0KLQkJCXJldHVybiBuZXcgSUxvY2F0b3IoKSB7DQotCQkJCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgeyByZXR1cm4gMDsgfQ0KLQkJCQlwdWJsaWMgaW50IGdldFN0YXJ0UG9zaXRpb24oKSB7IHJldHVybiAwOyB9DQotCQkJCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsgcmV0dXJuIDA7IH0NCi0JCQl9Ow0KLQkJfQ0KLQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1ZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL0NvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL0NvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzFjNzcwOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9Db25zdHJhaW50U3RhdHVzRXh0ZW5kZWRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuQ29uc3RyYWludFNldmVyaXR5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5tb2RlbC5JTW9kZWxDb25zdHJhaW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5zZXJ2aWNlLklDb25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uSVByb2JsZW1Mb2NhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uaW1wbC5Db25zdHJhaW50U3RhdHVzRXh0ZW5kZWQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotDQotcHVibGljIGNsYXNzIENvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZFRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UNCi17DQotCXByaXZhdGUgTW9jazxJUHJvYmxlbUxvY2F0aW9uPiBsb2NhdGlvbk1vY2s7IA0KLQlwcml2YXRlIE1vY2s8SU1vZGVsQ29uc3RyYWludD4gbW9kZWxDb25zdHJhaW50Ow0KLQlwcml2YXRlIE1vY2s8RU9iamVjdD4gdGFyZ2V0T2JqZWN0Ow0KLQkNCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlsb2NhdGlvbk1vY2sgPSBtb2NrKElQcm9ibGVtTG9jYXRpb24uY2xhc3MpOw0KLQkJbW9kZWxDb25zdHJhaW50ID0gbW9jayhJTW9kZWxDb25zdHJhaW50LmNsYXNzKTsNCi0JCXRhcmdldE9iamVjdCA9IG1vY2soRU9iamVjdC5jbGFzcyk7DQotCQkNCi0JCWZpbmFsIE1vY2s8SUNvbnN0cmFpbnREZXNjcmlwdG9yPiBjb25zdHJhaW50RGVzY3IgPSBtb2NrKElDb25zdHJhaW50RGVzY3JpcHRvci5jbGFzcyk7DQotCQljb25zdHJhaW50RGVzY3Iuc3R1YnMoKS5tZXRob2QoImdldFNldmVyaXR5Iikud2lsbChyZXR1cm5WYWx1ZShDb25zdHJhaW50U2V2ZXJpdHkuRVJST1IpKTsNCi0JCWNvbnN0cmFpbnREZXNjci5zdHVicygpLm1ldGhvZCgiZ2V0U3RhdHVzQ29kZSIpLndpbGwocmV0dXJuVmFsdWUoMCkpOw0KLQkJY29uc3RyYWludERlc2NyLnN0dWJzKCkubWV0aG9kKCJnZXRQbHVnaW5JZCIpLndpbGwocmV0dXJuVmFsdWUoIm15dGVzdHBsdWdpbmlkIikpOw0KLQkJbW9kZWxDb25zdHJhaW50LnN0dWJzKCkubWV0aG9kKCJnZXREZXNjcmlwdG9yIikud2lsbChyZXR1cm5WYWx1ZShjb25zdHJhaW50RGVzY3IucHJveHkoKSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlV2l0aE51bGxMb2NhdGlvbigpDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCW5ldyBDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWQobW9kZWxDb25zdHJhaW50LnByb3h5KCksIHRhcmdldE9iamVjdC5wcm94eSgpLCBJU3RhdHVzLk9LLCAwLCAiVEVTVCIsIG51bGwpOw0KLQkJCWZhaWwoIk5QRSBleHBlY3RlZCIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQkvL2V4cGVjdGVkDQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RQcm9ibGVtTG9jYXRpb25Jbml0aWFsaXplZCgpDQotCXsNCi0JCWZpbmFsIFNldDxJUHJvYmxlbUxvY2F0aW9uPiBsb2NhdGlvbnMgID0gbmV3IEhhc2hTZXQ8SVByb2JsZW1Mb2NhdGlvbj4oKTsNCi0JCWxvY2F0aW9ucy5hZGQobG9jYXRpb25Nb2NrLnByb3h5KCkpOw0KLQkJDQotCQlmaW5hbCBDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWQgc3RhdHVzID0gbmV3IENvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZChtb2RlbENvbnN0cmFpbnQucHJveHkoKSwgdGFyZ2V0T2JqZWN0LnByb3h5KCksIElTdGF0dXMuRVJST1IsIDAsICJURVNUIiwgbG9jYXRpb25zKTsNCi0JCWFzc2VydFRydWUoIlByb2JsZW0gbG9jYXRpb24gbm90IGluaXRpYWxpemVkIHByb3Blcmx5Iiwgc3RhdHVzLmdldFByb2JsZW1Mb2NhdGlvbnMoKS5zaXplKCkgPT0gMSk7DQotCQlhc3NlcnRUcnVlKCJQcm9ibGVtIGxvY2F0aW9uIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseSIsIHN0YXR1cy5nZXRQcm9ibGVtTG9jYXRpb25zKCkuaXRlcmF0b3IoKS5uZXh0KCkgPT0gbG9jYXRpb25Nb2NrLnByb3h5KCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RQcm9ibGVtTG9jYXRpb25Jbml0aWFsaXplZDIoKQ0KLQl7DQotCQlmaW5hbCBTZXQ8SVByb2JsZW1Mb2NhdGlvbj4gbG9jYXRpb25zICA9IG5ldyBIYXNoU2V0PElQcm9ibGVtTG9jYXRpb24+KCk7DQotCQlsb2NhdGlvbnMuYWRkKGxvY2F0aW9uTW9jay5wcm94eSgpKTsNCi0JCQ0KLQkJZmluYWwgQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkIHN0YXR1cyA9IG5ldyBDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWQobW9kZWxDb25zdHJhaW50LnByb3h5KCksIHRhcmdldE9iamVjdC5wcm94eSgpLCAiVEVTVCIsIGxvY2F0aW9ucyk7DQotCQlhc3NlcnRUcnVlKCJQcm9ibGVtIGxvY2F0aW9uIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseSIsIHN0YXR1cy5nZXRQcm9ibGVtTG9jYXRpb25zKCkuc2l6ZSgpID09IDEpOw0KLQkJYXNzZXJ0VHJ1ZSgiUHJvYmxlbSBsb2NhdGlvbiBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkiLCBzdGF0dXMuZ2V0UHJvYmxlbUxvY2F0aW9ucygpLml0ZXJhdG9yKCkubmV4dCgpID09IGxvY2F0aW9uTW9jay5wcm94eSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFByb2JsZW1Mb2NhdGlvbklzTm90TW9kaWZpYWJsZSgpDQotCXsNCi0JCWZpbmFsIFNldDxJUHJvYmxlbUxvY2F0aW9uPiBsb2NhdGlvbnMgID0gbmV3IEhhc2hTZXQ8SVByb2JsZW1Mb2NhdGlvbj4oKTsNCi0JCWZpbmFsIENvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZCBzdGF0dXMgPSBuZXcgQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkKG1vZGVsQ29uc3RyYWludC5wcm94eSgpLCB0YXJnZXRPYmplY3QucHJveHkoKSwgSVN0YXR1cy5FUlJPUiwgMCwgIlRFU1QiLCBsb2NhdGlvbnMpOw0KLQkJdHJ5DQotCQl7DQotCQkJc3RhdHVzLmdldFByb2JsZW1Mb2NhdGlvbnMoKS5hZGQobG9jYXRpb25Nb2NrLnByb3h5KCkpOw0KLQkJCWZhaWwoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkIik7IA0KLQkJfQ0KLQkJY2F0Y2goVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkNCi0JCXsNCi0JCQkvL2V4cGVjdGVkDQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vRG9tVmFsaWRhdGlvbkNvbnN0cmFpbnREZXNjcmlwdG9yVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vRG9tVmFsaWRhdGlvbkNvbnN0cmFpbnREZXNjcmlwdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NWQ3N2ExLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL0RvbVZhbGlkYXRpb25Db25zdHJhaW50RGVzY3JpcHRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLkNvbnN0cmFpbnRTZXZlcml0eTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuRXZhbHVhdGlvbk1vZGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLkRvbVZhbGlkYXRpb25Db25zdHJhaW50RGVzY3JpcHRvcjsNCi0NCi1wdWJsaWMgY2xhc3MgRG9tVmFsaWRhdGlvbkNvbnN0cmFpbnREZXNjcmlwdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIA0KLXsNCi0JcHJpdmF0ZSBEb21WYWxpZGF0aW9uQ29uc3RyYWludERlc2NyaXB0b3IgZGVzYzsNCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHNldFVwKCkNCi0Jew0KLQkJZGVzYyA9IG5ldyBEb21WYWxpZGF0aW9uQ29uc3RyYWludERlc2NyaXB0b3IoKXsNCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkge3JldHVybiBudWxsO30NCi0JCQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkge3JldHVybiBudWxsO30NCi0JCQlwdWJsaWMgQ29uc3RyYWludFNldmVyaXR5IGdldFNldmVyaXR5KCkge3JldHVybiBudWxsO30NCi0JCQlwdWJsaWMgaW50IGdldFN0YXR1c0NvZGUoKSB7cmV0dXJuIDA7fX07DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3REZXNjcmlwdG9yKCkNCi0Jew0KLQkJYXNzZXJ0TnVsbChkZXNjLmdldEJvZHkoKSk7DQotCQlhc3NlcnROb3ROdWxsKGRlc2MuZ2V0RGVzY3JpcHRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoRXZhbHVhdGlvbk1vZGUuQkFUQ0gsIGRlc2MuZ2V0RXZhbHVhdGlvbk1vZGUoKSk7DQotCQlhc3NlcnROdWxsKGRlc2MuZ2V0TWVzc2FnZVBhdHRlcm4oKSk7DQotCQlhc3NlcnROb3ROdWxsKGRlc2MuZ2V0TmFtZSgpKTsNCi0JCWFzc2VydFRydWUoZGVzYy50YXJnZXRzRXZlbnQobnVsbCkpOw0KLQkJYXNzZXJ0VHJ1ZShkZXNjLnRhcmdldHNUeXBlT2YobnVsbCkpOwkJDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vRG9tVmFsaWRhdG9yRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL0RvbVZhbGlkYXRvckZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFmNGM4OWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vRG9tVmFsaWRhdG9yRmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5Eb21WYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5JRG9tVmFsaWRhdG9yOw0KLQ0KLS8qKg0KLSAqIFRlc3RzIGZvciB7QGxpbmsgRG9tVmFsaWRhdG9yRmFjdG9yeX0gY2xhc3MuDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEb21WYWxpZGF0b3JGYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIA0KLXsNCi0JcHVibGljIHZvaWQgdGVzdEdldFJlZ2lzdGVyZWRWYWxpZGF0b3JzKCkNCi0Jew0KLQkJQ29sbGVjdGlvbjxJRG9tVmFsaWRhdG9yPiB2YWxpZGF0b3JzID0gRG9tVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRS5nZXRSZWdpc3RlcmVkVmFsaWRhdG9ycygpOw0KLQkJYXNzZXJ0VHJ1ZSgiTm8gdmFsaWRhdG9ycyBmb3VuZCIsIHZhbGlkYXRvcnMuc2l6ZSgpID4gMCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vRW5kcG9pbnRJc1Nlc3Npb25CZWFuQ29uc3RyYWludFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL0VuZHBvaW50SXNTZXNzaW9uQmVhbkNvbnN0cmFpbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzYmE3NzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vRW5kcG9pbnRJc1Nlc3Npb25CZWFuQ29uc3RyYWludFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLm1lc3NhZ2VzLlZhbGlkYXRpb25NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5JV2FpdENvbmRpdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5hc3NlcnRpb25zLkFzc2VydGlvbnM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuYXNzZXJ0aW9ucy5Db25kaXRpb25DaGVja0V4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qb2JzLkpvYlV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdHNVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25Xcml0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmRvbS52YWxpZGF0aW9uLkRvbVZhbGlkYXRpb25Db25zdGFudHM7DQotDQotcHVibGljIGNsYXNzIEVuZHBvaW50SXNTZXNzaW9uQmVhbkNvbnN0cmFpbnRUZXN0IGV4dGVuZHMgVGVzdENhc2UNCi17DQotCXByaXZhdGUgVGVzdFByb2plY3QgZWpiUHJvamVjdDsNCi0JcHJpdmF0ZSBUZXN0UHJvamVjdCB3ZWJQcm9qZWN0Ow0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VfTkFNRSA9ICJNeVRlc3RDbGFzcyI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVV9QQUNLQUdFID0gInRlc3QiOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VfQ09OVEVOVCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJwdWJsaWMgY2xhc3MgezB9ICd7J3B1YmxpYyB2b2lkIHRlc3QoKSd7J319IiwgQ1VfTkFNRSk7DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc3VwZXIuc2V0VXAoKTsNCi0NCi0JCVRlc3RQcm9qZWN0c1V0aWxzLmRlbGV0ZVdvcmtzcGFjZVByb2plY3RzKCk7DQotCQkNCi0JCWVqYlByb2plY3QgPSBuZXcgVGVzdFByb2plY3QoVGVzdFByb2plY3RzVXRpbHMuY3JlYXRlRWpiM1Byb2plY3QoIkVKQjMiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpLmdldFByb2plY3QoKSk7DQotCQljcmVhdGVDb21waWxhdGlvblVuaXQoZWpiUHJvamVjdCk7DQotCQl3ZWJQcm9qZWN0ID0gbmV3IFRlc3RQcm9qZWN0KFRlc3RQcm9qZWN0c1V0aWxzLmNyZWF0ZVdlYjI1UHJvamVjdCgiV2ViMjUiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpLmdldFByb2plY3QoKSk7DQotCQljcmVhdGVDb21waWxhdGlvblVuaXQod2ViUHJvamVjdCk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChmaW5hbCBUZXN0UHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IHBrZyA9IHByb2plY3QuY3JlYXRlUGFja2FnZShDVV9QQUNLQUdFKTsNCi0JCWZpbmFsIElUeXBlIGN1ID0gcHJvamVjdC5jcmVhdGVUeXBlKHBrZywgQ1VfTkFNRSArICIuamF2YSIsIENVX0NPTlRFTlQpOw0KLQkJcmVmcmVzaEFuZEJ1aWxkUHJvamVjdChwcm9qZWN0KTsNCi0JCWFzc2VydEVxdWFscygiTm8gZXJyb3JzIGV4cGVjdGVkIiwgMCwgY3UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhEb21WYWxpZGF0aW9uQ29uc3RhbnRzLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9PTkUpLmxlbmd0aCk7DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCByZWZyZXNoQW5kQnVpbGRQcm9qZWN0KGZpbmFsIFRlc3RQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXByb2plY3QuZ2V0UHJvamVjdCgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOw0KLQkJcHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsNCi0JCS8vRklYTUUgQ2hhbmdlZCBmcm9tIHdhaXRGb3JKb2JzKCkuIGNoZWNrTWFya2VycyBpbnRlcm1pdHRlbnRseSBmYWlsaW5nIGluIGJ1aWxkLiANCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzU2xvdygpOw0KLQl9DQotDQotCXByaXZhdGUgSVR5cGUgZmluZFRlc3RFbmRwb2ludChmaW5hbCBUZXN0UHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElKYXZhUHJvamVjdCBqYXZhUCA9IHByb2plY3QuZ2V0SmF2YVByb2plY3QoKTsNCi0JCWZpbmFsIElUeXBlIHJlc3VsdCA9IGphdmFQLmZpbmRUeXBlKENVX1BBQ0tBR0UgKyAiLiIgKyBDVV9OQU1FKTsNCi0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXB1YmxpYyB2b2lkIHRlc3RXc0Fubm90YXRpb25JbkVqYlN0YXRlZnVsKCkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24sIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVR5cGUgZW5kcG9pbnRUeXBlID0gZmluZFRlc3RFbmRwb2ludChlamJQcm9qZWN0KTsNCi0NCi0JCWZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiB3c2FubiA9IChJQW5ub3RhdGlvbjxJVHlwZT4pIEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTiwgZW5kcG9pbnRUeXBlLCBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCkpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KHdzYW5uLCBlbmRwb2ludFR5cGUpOw0KLQkJcmVmcmVzaEFuZEJ1aWxkUHJvamVjdChlamJQcm9qZWN0KTsNCi0JCWNoZWNrTWFya2VycyhlbmRwb2ludFR5cGUuZ2V0UmVzb3VyY2UoKSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgMSwgVmFsaWRhdGlvbk1lc3NhZ2VzLldzVmFsaWRhdGlvbl9Xc0Fubm90YXRpb25Pbk5vblNlc3Npb25CZWFuX0Vycm9yKTsNCi0NCi0JCWZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiBiZWFuQW5ub3RhdGlvbiA9IChJQW5ub3RhdGlvbjxJVHlwZT4pIEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImNvbS5zdW4ueG1sLmludGVybmFsLndzLmRldmVsb3Blci5TdGF0ZWZ1bCIsIGVuZHBvaW50VHlwZSwgbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChiZWFuQW5ub3RhdGlvbiwgZW5kcG9pbnRUeXBlKTsNCi0JCXJlZnJlc2hBbmRCdWlsZFByb2plY3QoZWpiUHJvamVjdCk7DQotCQljaGVja01hcmtlcnMoZW5kcG9pbnRUeXBlLmdldFJlc291cmNlKCksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIDAsIFZhbGlkYXRpb25NZXNzYWdlcy5Xc1ZhbGlkYXRpb25fV3NBbm5vdGF0aW9uT25Ob25TZXNzaW9uQmVhbl9FcnJvcik7DQotCX0NCi0NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXB1YmxpYyB2b2lkIHRlc3RXc0Fubm90YXRpb25JbldlYigpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElUeXBlIGVuZHBvaW50VHlwZSA9IGZpbmRUZXN0RW5kcG9pbnQod2ViUHJvamVjdCk7DQotDQotCQlmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZT4gd3Nhbm4gPSAoSUFubm90YXRpb248SVR5cGU+KSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKFdTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT04sIGVuZHBvaW50VHlwZSwgbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudCh3c2FubiwgZW5kcG9pbnRUeXBlKTsNCi0JCXJlZnJlc2hBbmRCdWlsZFByb2plY3Qod2ViUHJvamVjdCk7DQotCQljaGVja01hcmtlcnMoZW5kcG9pbnRUeXBlLmdldFJlc291cmNlKCksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIDAsIFZhbGlkYXRpb25NZXNzYWdlcy5Xc1ZhbGlkYXRpb25fV3NBbm5vdGF0aW9uT25Ob25TZXNzaW9uQmVhbl9FcnJvcik7DQotDQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTWFya2VycyhmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIGludCBzZXZlcml0eSwgZmluYWwgaW50IGV4cGVjdGVkTWFya2VycywgZmluYWwgU3RyaW5nIGV4cGVjdGVkTWFya2VyTWVzc2FnZSkNCi0Jew0KLQkJQXNzZXJ0aW9ucy53YWl0QXNzZXJ0KG5ldyBJV2FpdENvbmRpdGlvbigpDQotCQl7DQotCQkJcHVibGljIGJvb2xlYW4gY2hlY2tDb25kaXRpb24oKSB0aHJvd3MgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24NCi0JCQl7DQotCQkJCXRyeQ0KLQkJCQl7DQotCQkJCQlmaW5hbCBJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKERvbVZhbGlkYXRpb25Db25zdGFudHMuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX09ORSk7DQotCQkJCQlmaW5hbCBMaXN0PElNYXJrZXI+IG1hdGNoZWRNYXJrZXJzID0gbmV3IEFycmF5TGlzdDxJTWFya2VyPigpOw0KLQkJCQkJZm9yIChJTWFya2VyIG0gOiBtYXJrZXJzKQ0KLQkJCQkJew0KLQkJCQkJCWlmIChtLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSA9PSBudWxsIHx8IG0uZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkgPT0gbnVsbCkNCi0JCQkJCQl7DQotCQkJCQkJCWNvbnRpbnVlOw0KLQkJCQkJCX0NCi0NCi0JCQkJCQlpZiAoKChJbnRlZ2VyKSBtLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSA9PSBzZXZlcml0eSkgJiYgKGV4cGVjdGVkTWFya2VyTWVzc2FnZS5lcXVhbHMoKFN0cmluZykgbS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSkpKQ0KLQkJCQkJCXsNCi0JCQkJCQkJbWF0Y2hlZE1hcmtlcnMuYWRkKG0pOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0NCi0JCQkJCXJldHVybiBtYXRjaGVkTWFya2Vycy5zaXplKCkgPT0gZXhwZWN0ZWRNYXJrZXJzOw0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpDQotCQkJCXsNCi0JCQkJCXRocm93IG5ldyBDb25kaXRpb25DaGVja0V4Y2VwdGlvbihlKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0sICJleHBlY3RlZCBtYXJrZXJzIG5vdCBmb3VuZCIpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc3VwZXIudGVhckRvd24oKTsNCi0JCWVqYlByb2plY3QuZGlzcG9zZSgpOw0KLQkJd2ViUHJvamVjdC5kaXNwb3NlKCk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vSmF4V3NEb21WYWxpZGF0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9KYXhXc0RvbVZhbGlkYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjZhOTJlOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9KYXhXc0RvbVZhbGlkYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uRG9tVmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uSURvbVZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uSmF4V3NEb21WYWxpZGF0b3I7DQotDQotLyoqDQotICogVGVzdHMgZm9yIHtAbGluayBKYXhXc0RvbVZhbGlkYXRvcn0NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEpheFdzRG9tVmFsaWRhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIA0KLXsNCi0JcHJpdmF0ZSBKYXhXc0RvbVZhbGlkYXRvciB2YWxpZGF0b3I7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7DQotCQl2YWxpZGF0b3IgPSBuZXcgSmF4V3NEb21WYWxpZGF0b3IoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFJlZ2lzdGVyZWQoKQ0KLQl7DQotCQlDb2xsZWN0aW9uPElEb21WYWxpZGF0b3I+IHZhbGlkYXRvcnMgPSBEb21WYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmdldFJlZ2lzdGVyZWRWYWxpZGF0b3JzKCk7DQotCQlJRG9tVmFsaWRhdG9yIHZhbGlkYXRvcj1udWxsOw0KLQkJZm9yIChJRG9tVmFsaWRhdG9yIGRvbVZhbGlkYXRvciA6IHZhbGlkYXRvcnMpIHsNCi0JCQlpZihkb21WYWxpZGF0b3IgaW5zdGFuY2VvZiBKYXhXc0RvbVZhbGlkYXRvcikgew0KLQkJCQl2YWxpZGF0b3IgPSBkb21WYWxpZGF0b3I7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCgiSmF4LXdzIHZhbGlkYXRvciBub3QgZm91bmQiLCB2YWxpZGF0b3IpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3VwcG9ydGVkRG9tUnVudGltZSgpIHsNCi0JCWFzc2VydEVxdWFscyhKZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uLklELCB2YWxpZGF0b3IuZ2V0U3VwcG9ydGVkRG9tUnVudGltZSgpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9TZWlWYWxpZGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vU2VpVmFsaWRhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjIyYTQ2Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9TZWlWYWxpZGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5Xc1Byb2JsZW1zUmVwb3J0ZXI7DQotDQotLyoqDQotICogVGVzdHMgZm9yIFNFSSB2YWxpZGF0aW9uIGNvbnN0cmFpbnRzIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2VpVmFsaWRhdGlvblRlc3QgZXh0ZW5kcyBWYWxpZGF0aW9uVGVzdHNTZXRVcCANCi17DQotCXByb3RlY3RlZCBJVHlwZSBzZWlUeXBlOw0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc3VwZXIuc2V0VXAoKTsNCi0JCXNlaVR5cGUgPSB0ZXN0UHJvamVjdC5jcmVhdGVUeXBlKHRlc3RQYWNrLCAiU2VpLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWlOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHt9Iik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFNlcnZpY2VOYW1lSXNOQ05hbWUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7CQkNCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gZmluZFNlaSgidGVzdC5TZWkiKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZShzZWkpOw0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMCwgbWFya2Vycy5sZW5ndGgpOw0KLQkJDQotCQlzZXRDb250ZW50cyhzZWlUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCItLS1cIikgcHVibGljIGludGVyZmFjZSBTZWkge30iKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZShzZWkpOw0KLQkJbWFya2VycyA9IHNlaVR5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwkJDQotCQlhc3NlcnRFcXVhbHMoMSwgbWFya2Vycy5sZW5ndGgpOw0KLQkJYXNzZXJ0RXF1YWxzKDQwLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQpKTsNCi0JCWFzc2VydEVxdWFscyg0NSwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDIsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIpKTsNCi0JCWFzc2VydEVxdWFscyhJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXROc0lzVmFsaWRVcmkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IGZpbmRTZWkoInRlc3QuU2VpIik7DQotCQl2YWxpZGF0b3IudmFsaWRhdGUoc2VpKTsNCi0JCUlNYXJrZXIgW10gbWFya2VycyA9IHNlaVR5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcmtlcnMubGVuZ3RoKTsNCi0JCQ0KLQkJc2V0Q29udGVudHMoc2VpVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgIkBqYXZheC5qd3MuV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2U9XCJeXl5cIikgcHVibGljIGludGVyZmFjZSBTZWkge30iKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZShzZWkpOw0KLQkJbWFya2VycyA9IHNlaVR5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIG1hcmtlcnMubGVuZ3RoKTsNCi0JCWFzc2VydEVxdWFscyg1MSwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJUKSk7DQotCQlhc3NlcnRFcXVhbHMoNTYsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQpKTsNCi0JCWFzc2VydEVxdWFscyhJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFJlZHVuZGFuZEF0dHJpYnV0ZXNPbkV4cGxpY2l0U2VpKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJc2V0Q29udGVudHMoc2VpVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiTmFtZVwiLCBwb3J0TmFtZT1cIlBvcnROYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHt9Iik7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IGZpbmRTZWkoInRlc3QuU2VpIik7CQkNCi0JCXZhbGlkYXRvci52YWxpZGF0ZShzZWkpOw0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgbWFya2Vycy5sZW5ndGgpOw0KLQkJYXNzZXJ0RXF1YWxzKDEzLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQpKTsNCi0JCWFzc2VydEVxdWFscyg2OCwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCkpOw0KLQkJYXNzZXJ0RXF1YWxzKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFJlZHVuZGFuZEF0dHJpYnV0ZXNPbkltcGxpY2l0U2VpKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJdGVzdFByb2plY3QuY3JlYXRlVHlwZSh0ZXN0UGFjaywgIldzLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJOYW1lXCIsIHBvcnROYW1lPVwiUG9ydE5hbWVcIikgcHVibGljIGNsYXNzIFdzIHt9Iik7CQkNCi0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gZmluZFNlaSgidGVzdC5XcyIpOw0KLQkJDQotCQl2YWxpZGF0b3IudmFsaWRhdGUoc2VpKTsNCi0JCUlNYXJrZXIgW10gbWFya2VycyA9IHNlaVR5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcmtlcnMubGVuZ3RoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFNlaUNsYXNzQ29ycmVjdEV4cGxpY2l0U2VpKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJc2V0Q29udGVudHMoc2VpVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgIkBqYXZheC5qd3MuV2ViU2VydmljZSBpbnRlcmZhY2UgU2VpIHt9Iik7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IGZpbmRTZWkoInRlc3QuU2VpIik7CQkNCi0JCXZhbGlkYXRvci52YWxpZGF0ZShzZWkpOw0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgbWFya2Vycy5sZW5ndGgpOw0KLQkJYXNzZXJ0RXF1YWxzKDEzLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQpKTsNCi0JCWFzc2VydEVxdWFscygzNCwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCkpOw0KLQkJYXNzZXJ0RXF1YWxzKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFNlaUNsYXNzQ29ycmVjdEltcGxpY2l0U2VpKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJdGVzdFByb2plY3QuY3JlYXRlVHlwZSh0ZXN0UGFjaywgIldzLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlIHB1YmxpYyBjbGFzcyBXcyB7fSIpOwkJDQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IGZpbmRTZWkoInRlc3QuV3MiKTsNCi0JCQ0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHNlaSk7DQotCQlJTWFya2VyIFtdIG1hcmtlcnMgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygwLCBtYXJrZXJzLmxlbmd0aCk7DQotCX0NCi19DQotCQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL1ZhbGlkYXRpb25UZXN0c1NldFVwLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9WYWxpZGF0aW9uVGVzdHNTZXRVcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYmI2ZGNiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL1ZhbGlkYXRpb25UZXN0c1NldFVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnZhbGlkYXRpb247DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Eb21VdGlsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uSmF4V3NEb21WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuSVdhaXRDb25kaXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuYXNzZXJ0aW9ucy5Bc3NlcnRpb25zOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmFzc2VydGlvbnMuQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5GaWxlVXRpbHM7DQotDQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25UZXN0c1NldFVwIGV4dGVuZHMgVGVzdENhc2UNCi17DQotCXByb3RlY3RlZCBUZXN0UHJvamVjdCB0ZXN0UHJvamVjdDsNCi0JcHJvdGVjdGVkIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgdGFyZ2V0Ow0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCB0ZXN0UGFjazsNCi0JcHJvdGVjdGVkIEpheFdzRG9tVmFsaWRhdG9yIHZhbGlkYXRvcjsNCi0JcHJvdGVjdGVkIERvbVV0aWwgdXRpbCA9IERvbVV0aWwuSU5TVEFOQ0U7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRlc3RQcm9qZWN0ID0gbmV3IFRlc3RQcm9qZWN0KCk7DQotCQl0ZXN0UHJvamVjdC5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOw0KLQkJdGVzdFBhY2sgPSB0ZXN0UHJvamVjdC5jcmVhdGVQYWNrYWdlKCJ0ZXN0Iik7DQotCQl2YWxpZGF0b3IgPSBuZXcgSmF4V3NEb21WYWxpZGF0b3IoKTsNCi0JCQ0KLQkJSUphdmFNb2RlbCBqYXZhTW9kZWwgPSBKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7DQotCQl0YXJnZXQgPSBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwpIA0KLQkJew0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBib29sZWFuIGFwcHJvdmVQcm9qZWN0KElKYXZhUHJvamVjdCBwcmopIHsNCi0JCQkJcmV0dXJuIHByai5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyh0ZXN0UHJvamVjdC5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJCX0NCi0JCX07DQotCQl0YXJnZXQubG9hZChudWxsKTsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgdGVhckRvd24oKQ0KLQl7DQotCQl0cnkgew0KLQkJCXRlc3RQcm9qZWN0LmRpc3Bvc2UoKTsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBfKSB7fQ0KLQl9DQotDQotCXByb3RlY3RlZCBJV2ViU2VydmljZSBmaW5kV3MoU3RyaW5nIHdzRlFOYW1lKQ0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gdXRpbC5maW5kUHJvamVjdEJ5TmFtZSh0YXJnZXQuZ2V0RE9NKCksIHRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpOw0KLQkJcmV0dXJuIHV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1Byb2plY3QsIHdzRlFOYW1lKTsJCQkNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBmaW5kU2VpKFN0cmluZyBzZWlGUU5hbWUpIA0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gdXRpbC5maW5kUHJvamVjdEJ5TmFtZSh0YXJnZXQuZ2V0RE9NKCksIHRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpOw0KLQkJcmV0dXJuIHV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcm9qZWN0LCBzZWlGUU5hbWUpOwkJDQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIHNldENvbnRlbnRzKGZpbmFsIElDb21waWxhdGlvblVuaXQgY3UsIGZpbmFsIFN0cmluZyBjb250ZW50cykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJU3RyaW5nIG5ld0NvbnRlbnQgPSAiaW1wb3J0ICIgKyB0ZXN0UGFjay5nZXRFbGVtZW50TmFtZSgpICsgIjtcbiIgKyBjb250ZW50czsNCi0JCUZpbGVVdGlscy5nZXRJbnN0YW5jZSgpLnNldENvbXBpbGF0aW9uVW5pdENvbnRlbnQoY3UsIG5ld0NvbnRlbnQsIGZhbHNlLCBudWxsKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIHZvaWQgd2FpdFVudGlsTWFya2Vyc0FwcGVhcihmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFN0cmluZyBtYXJrZXJJZCwgZmluYWwgYm9vbGVhbiBpbmNsdWRlU3VidHlwZXMsIGZpbmFsIGludCBkZXB0aCkNCi0Jew0KLQkJZmluYWwgSVdhaXRDb25kaXRpb24gY29uZGl0aW9uID0gbmV3IElXYWl0Q29uZGl0aW9uKCl7DQotCQkJcHVibGljIGJvb2xlYW4gY2hlY2tDb25kaXRpb24oKSB0aHJvd3MgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24NCi0JCQl7DQotCQkJCXRyeQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gcmVzb3VyY2UuZmluZE1hcmtlcnMobWFya2VySWQsIGluY2x1ZGVTdWJ0eXBlcywgZGVwdGgpLmxlbmd0aCA+IDA7DQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkNCi0JCQkJew0KLQkJCQkJdGhyb3cgbmV3IENvbmRpdGlvbkNoZWNrRXhjZXB0aW9uKGUpOw0KLQkJCQl9DQotCQkJfX07DQotCQlBc3NlcnRpb25zLndhaXRBc3NlcnQoY29uZGl0aW9uLCAiRXJyb3IgbWFya2VycyBkaWQgbm90IGRpc2FwcGVhciIpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCB3YWl0VW50aWxNYXJrZXJzRGlzYXBwZWFyKGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgU3RyaW5nIG1hcmtlcklkLCBmaW5hbCBib29sZWFuIGluY2x1ZGVTdWJ0eXBlcywgZmluYWwgaW50IGRlcHRoKQ0KLQl7DQotCQlmaW5hbCBJV2FpdENvbmRpdGlvbiBjb25kaXRpb24gPSBuZXcgSVdhaXRDb25kaXRpb24oKXsNCi0JCQlwdWJsaWMgYm9vbGVhbiBjaGVja0NvbmRpdGlvbigpIHRocm93cyBDb25kaXRpb25DaGVja0V4Y2VwdGlvbg0KLQkJCXsNCi0JCQkJdHJ5DQotCQkJCXsNCi0JCQkJCXJldHVybiByZXNvdXJjZS5maW5kTWFya2VycyhtYXJrZXJJZCwgaW5jbHVkZVN1YnR5cGVzLCBkZXB0aCkubGVuZ3RoID09IDA7DQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkNCi0JCQkJew0KLQkJCQkJdGhyb3cgbmV3IENvbmRpdGlvbkNoZWNrRXhjZXB0aW9uKGUpOw0KLQkJCQl9DQotCQkJfX07DQotCQkJQXNzZXJ0aW9ucy53YWl0QXNzZXJ0KGNvbmRpdGlvbiwgIkVycm9yIG1hcmtlcnMgZGlkIG5vdCBhcHBlYXIiKTsNCi0JfQ0KLQkNCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vV21WYWxpZGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vV21WYWxpZGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOTBkYTY1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL1dtVmFsaWRhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uV3NQcm9ibGVtc1JlcG9ydGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBXbVZhbGlkYXRpb25UZXN0IGV4dGVuZHMgVmFsaWRhdGlvblRlc3RzU2V0VXANCi17DQotCXByaXZhdGUgSVR5cGUgc2VpVHlwZTsNCi0JcHJpdmF0ZSBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaTsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc3VwZXIuc2V0VXAoKTsNCi0JCXNlaVR5cGUgPSB0ZXN0UHJvamVjdC5jcmVhdGVUeXBlKHRlc3RQYWNrLCAiU2VpLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWlOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHtcbiIgKw0KLQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cInRlc3RcIikgcHVibGljIHZvaWQgdGVzdCgpOyIgKw0KLQkJCQkifSIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZUlzTkNOYW1lKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLS8vCQl2YWxpZGF0b3IudmFsaWRhdGUoc2VpKTsNCi0JCUlNYXJrZXIgW10gbWFya2VycyA9IHNlaVR5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcmtlcnMubGVuZ3RoKTsNCi0JCQ0KLQkJc2V0Q29udGVudHMoc2VpVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkge1xuIiArDQotCQkJCSJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwiLS0tXCIpIHB1YmxpYyB2b2lkIHRlc3QoKTsgXG4iICsgIn0iKTsNCi0JCQ0KLQkJc2VpID0gZmluZFNlaSgidGVzdC5TZWkiKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZShzZWkpOw0KLQkJd2FpdFVudGlsTWFya2Vyc0FwcGVhcihzZWlUeXBlLmdldFJlc291cmNlKCksIFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQltYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgbWFya2Vycy5sZW5ndGgpOw0KLQkJYXNzZXJ0RXF1YWxzKDEwOSwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJUKSk7DQotCQlhc3NlcnRFcXVhbHMoMTE0LCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7DQotCQlhc3NlcnRFcXVhbHMoMywgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUikpOw0KLQkJYXNzZXJ0RXF1YWxzKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdE5hbWVJc1VuaXF1ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXNldENvbnRlbnRzKHNlaVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWlOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHtcbiIgKw0KLQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cIk9wTmFtZVwiKSBwdWJsaWMgdm9pZCBmaXJzdCgpOyBcbiIgKw0KLQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cIk9wTmFtZVwiKSBwdWJsaWMgdm9pZCBzZWNvbmQoKTsgXG4iICsgDQotCQkJCSJ9Iik7DQotCQkNCi0JCXNlaSA9IGZpbmRTZWkoInRlc3QuU2VpIik7DQotCQl2YWxpZGF0b3IudmFsaWRhdGUoc2VpKTsNCi0JCXdhaXRVbnRpbE1hcmtlcnNBcHBlYXIoc2VpVHlwZS5nZXRSZXNvdXJjZSgpLCBXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMiwgbWFya2Vycy5sZW5ndGgpOw0KLQkJDQotCQlhc3NlcnRUcnVlKCgoSW50ZWdlciltYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQpKSA+IDApOw0KLQkJYXNzZXJ0VHJ1ZSgoKEludGVnZXIpbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCkpID4gMCk7DQotCQlhc3NlcnRFcXVhbHMoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkpOw0KLQkJYXNzZXJ0VHJ1ZSgoKEludGVnZXIpbWFya2Vyc1sxXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJUKSkgPiAwKTsNCi0JCWFzc2VydFRydWUoKChJbnRlZ2VyKW1hcmtlcnNbMV0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQpKSA+IDApOw0KLQkJYXNzZXJ0RXF1YWxzKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIG1hcmtlcnNbMV0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZUlzVW5pcXVlRXhjbHVkZWRNZXRob2QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7CQ0KLQkJc2V0Q29udGVudHMoc2VpVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaSB7XG4iICsNCi0JCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKGV4Y2x1ZGU9dHJ1ZSkgcHVibGljIHZvaWQgZmlyc3QoKTsgXG4iICsNCi0JCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJmaXJzdFwiKSBwdWJsaWMgdm9pZCBzZWNvbmQoKTsgXG4iICsgDQotCQkJCSJ9Iik7DQotCQkNCi0JCXNlaSA9IGZpbmRTZWkoInRlc3QuU2VpIik7DQotCQl2YWxpZGF0b3IudmFsaWRhdGUoc2VpKTsNCi0JCXdhaXRVbnRpbE1hcmtlcnNBcHBlYXIoc2VpVHlwZS5nZXRSZXNvdXJjZSgpLCBXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQkvLyBvbmx5IHRoZSBtYXJrZXIgZm9yIGluY29ycmVjdCAnZXhjbHVkZWQ9dHJ1ZScgc2hvdWxkIGJlIGF2YWlsYWJsZQ0KLQkJYXNzZXJ0RXF1YWxzKDEsIG1hcmtlcnMubGVuZ3RoKTsNCi0JCWFzc2VydEVxdWFscygxMDMsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEwNywgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCkpOw0KLQkJYXNzZXJ0RXF1YWxzKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpKTsNCi0JfQ0KLQ0KLQkvKiogDQotCSAqIHRoaXMgdGVzdCBjdXJyZW50bHkgZG9lcyBub3RoaW5nIGJlY2F1c2UgZXhjbHVkZWQgbWV0aG9kcyBhcmUgbm90IGNvbnRhaW5lZCBpbiANCi0JICogdGhlIG1vZGVsLiANCi0JICogDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkgKi8gDQotCXB1YmxpYyB2b2lkIHRlc3RSZWR1bmRhbnRBdHRyaWJ1dGVzRm9yRXhjbHVkZWRNZXRob2QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotLy8JCXNldENvbnRlbnRzKHNlaVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaU5hbWVcIikgcHVibGljIGNsYXNzIFNlaSB7XG4iICsNCi0vLwkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2QoZXhjbHVkZT10cnVlLCBvcGVyYXRpb25OYW1lPVwiT3BOYW1lXCIpIHB1YmxpYyB2b2lkIGZpcnN0KCk7IFxuIiArDQotLy8JCQkJIn0iKTsNCi0vLwkJDQotLy8JCXNlaSA9IGZpbmRTZWkoInRlc3QuU2VpIik7DQotLy8JCUlXZWJTZXJ2aWNlIHdzID0gZmluZFdzKCJ0ZXN0LlNlaSIpOw0KLS8vCQkNCi0vLwkJdmFsaWRhdG9yLnZhbGlkYXRlKHNlaSk7DQotLy8JCUlNYXJrZXIgW10gbWFya2VycyA9IHNlaVR5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kQ2Fubm90QmVFeGNsdWRlZEluU0VJKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JewkJDQotCQlzZXRDb250ZW50cyhzZWlUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWlOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHtcbiIgKw0KLQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2QoZXhjbHVkZT10cnVlKSBwdWJsaWMgdm9pZCBmaXJzdCgpOyBcbiIgKw0KLQkJCQkifSIpOw0KLQkJDQotCQlzZWkgPSBmaW5kU2VpKCJ0ZXN0LlNlaSIpOw0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHNlaSk7DQotCQl3YWl0VW50aWxNYXJrZXJzQXBwZWFyKHNlaVR5cGUuZ2V0UmVzb3VyY2UoKSwgV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCUlNYXJrZXIgW10gbWFya2VycyA9IHNlaVR5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIG1hcmtlcnMubGVuZ3RoKTsNCi0JCWFzc2VydEVxdWFscygxMDMsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEwNywgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCkpOw0KLQkJYXNzZXJ0RXF1YWxzKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9XcFZhbGlkYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9XcFZhbGlkYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUzMWZjN2EuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vV3BWYWxpZGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5Xc1Byb2JsZW1zUmVwb3J0ZXI7DQotDQotcHVibGljIGNsYXNzIFdwVmFsaWRhdGlvblRlc3QgZXh0ZW5kcyBWYWxpZGF0aW9uVGVzdHNTZXRVcCANCi17DQotCXByb3RlY3RlZCBJVHlwZSBzZWlUeXBlOw0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWk7DQotDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzdXBlci5zZXRVcCgpOw0KLQkJc2VpVHlwZSA9IHRlc3RQcm9qZWN0LmNyZWF0ZVR5cGUodGVzdFBhY2ssICJTZWkuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkge30iKTsNCi0JCXNlaSA9IGZpbmRTZWkoc2VpVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lSXNOQ05hbWUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlzZXRDb250ZW50cyhzZWlUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWlOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHsiICsNCi0JCQkJInB1YmxpYyB2b2lkIHRlc3QoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwiLS0tXCIpaW50IGEpOyBcbiIgKyANCi0JCQkJIn0iKTsNCi0JCQ0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHNlaSk7DQotCQlJTWFya2VyIFtdIG1hcmtlcnMgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygxLCBtYXJrZXJzLmxlbmd0aCk7DQotCQlhc3NlcnRFcXVhbHMoMTE1LCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQpKTsNCi0JCWFzc2VydEVxdWFscygxMjAsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQpKTsNCi0JCWFzc2VydEVxdWFscygyLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkxJTkVfTlVNQkVSKSk7DQotCQlhc3NlcnRFcXVhbHMoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFydE5hbWVJc05DTmFtZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXNldENvbnRlbnRzKHNlaVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJpbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7XG4iICsNCi0JCQkJIkBTT0FQQmluZGluZyhzdHlsZT1TT0FQQmluZGluZy5TdHlsZS5SUEMpIiArDQotCQkJCSJAamF2YXguandzLldlYlNlcnZpY2UgcHVibGljIGludGVyZmFjZSBTZWkgeyIgKw0KLQkJCQkicHVibGljIHZvaWQgdGVzdChAamF2YXguandzLldlYlBhcmFtKHBhcnROYW1lPVwiLS0tXCIpaW50IGEpOyBcbiIgKyANCi0JCQkJIn0iKTsNCi0JCQ0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHNlaSk7DQotCQlJTWFya2VyIFtdIG1hcmtlcnMgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygxLCBtYXJrZXJzLmxlbmd0aCk7DQotCQlhc3NlcnRFcXVhbHMoMTc5LCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQpKTsNCi0JCWFzc2VydEVxdWFscygxODQsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQpKTsNCi0JCWFzc2VydEVxdWFscyhJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSk7DQotCX0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZUlzVW5pcWUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlzZXRDb250ZW50cyhzZWlUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWlOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHsiICsNCi0JCQkJInB1YmxpYyB2b2lkIHRlc3QoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwicGFyYW0xXCIpaW50IGEsIEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZT1cInBhcmFtMVwiKWludCBiKTsgXG4iICsgDQotCQkJCSJ9Iik7DQotCQkNCi0JCXZhbGlkYXRvci52YWxpZGF0ZShzZWkpOw0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMiwgbWFya2Vycy5sZW5ndGgpOw0KLQ0KLQkJSU1hcmtlciBmaXJzdDsNCi0JCUlNYXJrZXIgc2Vjb25kOw0KLQkJDQotCQlpZiAobWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJUKS5lcXVhbHMobmV3IEludGVnZXIoMTE1KSkgKSB7DQotCQkJZmlyc3QgPSBtYXJrZXJzWzBdOw0KLQkJCXNlY29uZCA9IG1hcmtlcnNbMV07DQotCQl9IGVsc2Ugew0KLQkJCWZpcnN0ID0gbWFya2Vyc1sxXTsNCi0JCQlzZWNvbmQgPSBtYXJrZXJzWzBdOw0KLQkJfQ0KLQkJDQotCQlhc3NlcnRFcXVhbHMoMTE1LCBmaXJzdC5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJUKSk7DQotCQlhc3NlcnRFcXVhbHMoMTIzLCBmaXJzdC5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCkpOw0KLQkJYXNzZXJ0RXF1YWxzKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIGZpcnN0LmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSk7DQotCQlhc3NlcnRFcXVhbHMoMTU2LCBzZWNvbmQuZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDE2NCwgc2Vjb25kLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7DQotCQlhc3NlcnRFcXVhbHMoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgc2Vjb25kLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSk7CQkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lTm90UmVkdW5kYW50KCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJLy8gaW4gUlBDIHN0eWxlIGlmIHBhcnROYW1lIGlzIG5vdCBwcmVzZW50IHRoZSBuYW1lIGlzIG5vdCByZWR1bmRhbnQNCi0JCXNldENvbnRlbnRzKHNlaVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJpbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7XG4iICsNCi0JCQkJIkBTT0FQQmluZGluZyhzdHlsZT1TT0FQQmluZGluZy5TdHlsZS5SUEMpIiArDQotCQkJCSJAamF2YXguandzLldlYlNlcnZpY2UgcHVibGljIGludGVyZmFjZSBTZWkgeyIgKw0KLQkJCQkicHVibGljIHZvaWQgdGVzdChAamF2YXguandzLldlYlBhcmFtKG5hbWU9XCJteU5hbWVcIilpbnQgYSk7IFxuIiArIA0KLQkJCQkifSIpOw0KLQkJDQotCQl2YWxpZGF0b3IudmFsaWRhdGUoc2VpKTsNCi0JCUlNYXJrZXIgW10gbWFya2VycyA9IHNlaVR5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcmtlcnMubGVuZ3RoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdE5hbWVSZWR1bmRhbnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQkvLyBpbiBSUEMgc3R5bGUgaWYgcGFydE5hbWUgaXMgcHJlc2VudCB0aGUgbmFtZSBpcyByZWR1bmRhbnQNCi0JCXNldENvbnRlbnRzKHNlaVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJpbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7XG4iICsNCi0JCQkJIkBTT0FQQmluZGluZyhzdHlsZT1TT0FQQmluZGluZy5TdHlsZS5SUEMpIiArDQotCQkJCSJAamF2YXguandzLldlYlNlcnZpY2UgcHVibGljIGludGVyZmFjZSBTZWkgeyIgKw0KLQkJCQkicHVibGljIHZvaWQgdGVzdChAamF2YXguandzLldlYlBhcmFtKG5hbWU9XCJteU5hbWVcIiwgcGFydE5hbWU9XCJteVBhcnRcIilpbnQgYSk7IFxuIiArIA0KLQkJCQkifSIpOw0KLQkJDQotCQl2YWxpZGF0b3IudmFsaWRhdGUoc2VpKTsNCi0JCUlNYXJrZXIgW10gbWFya2VycyA9IHNlaVR5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIG1hcmtlcnMubGVuZ3RoKTsNCi0JCWFzc2VydEVxdWFscygxNzUsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDE4MywgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCkpOw0KLQkJYXNzZXJ0RXF1YWxzKElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZUlzUmVxdWlyZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlzZXRDb250ZW50cyhzZWlUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nO1xuIiArDQotCQkJCSJAU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGU9U09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkiICsNCi0JCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZSBwdWJsaWMgaW50ZXJmYWNlIFNlaSB7IiArDQotCQkJCSJwdWJsaWMgaW50IHRlc3QoQGphdmF4Lmp3cy5XZWJQYXJhbShtb2RlPVdlYlBhcmFtLk1vZGUuSU5PVVQpIGludCBhKTsgXG4iICsgDQotCQkJCSJ9Iik7DQotDQotCQl2YWxpZGF0b3IudmFsaWRhdGUoc2VpKTsNCi0JCUlNYXJrZXIgW10gbWFya2VycyA9IHNlaVR5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIG1hcmtlcnMubGVuZ3RoKTsNCi0JCWFzc2VydEVxdWFscygxNjgsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDIxMywgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCkpOw0KLQkJYXNzZXJ0RXF1YWxzKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpKTsNCi0JfQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXROc1ZhbGlkVXJpKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJc2V0Q29udGVudHMoc2VpVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaSB7IiArDQotCQkJCSJwdWJsaWMgdm9pZCB0ZXN0KEBqYXZheC5qd3MuV2ViUGFyYW0odGFyZ2V0TmFtZXNwYWNlPVwiXl5eXCIpaW50IGEpOyBcbiIgKyANCi0JCQkJIn0iKTsNCi0NCi0JCXZhbGlkYXRvci52YWxpZGF0ZShzZWkpOw0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgbWFya2Vycy5sZW5ndGgpOw0KLQkJYXNzZXJ0RXF1YWxzKDEyNiwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJUKSk7DQotCQlhc3NlcnRFcXVhbHMoMTMxLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7DQotCQlhc3NlcnRFcXVhbHMoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkpOwkNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9Xc1ZhbGlkYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9Xc1ZhbGlkYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ5OWZlZDQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vV3NWYWxpZGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLldzUHJvYmxlbXNSZXBvcnRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5TdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXI7DQotDQotcHVibGljIGNsYXNzIFdzVmFsaWRhdGlvblRlc3QgZXh0ZW5kcyBWYWxpZGF0aW9uVGVzdHNTZXRVcCANCi17DQotCXByaXZhdGUgSVR5cGUgd3NUeXBlOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzdXBlci5zZXRVcCgpOw0KLQkJd3NUeXBlID0gdGVzdFByb2plY3QuY3JlYXRlVHlwZSh0ZXN0UGFjaywgIldzLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV3NOYW1lXCIpIHB1YmxpYyBjbGFzcyBXcyB7fSIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VydmljZU5hbWVJc05DTmFtZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzID0gZmluZFdzKCJ0ZXN0LldzIik7DQotCQl2YWxpZGF0b3IudmFsaWRhdGUod3MpOw0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gd3NUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygwLCBtYXJrZXJzLmxlbmd0aCk7DQotCQkNCi0JCXNldENvbnRlbnRzKHdzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIi0tLVwiKSBwdWJsaWMgY2xhc3MgV3Mge30iKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZSh3cyk7DQotCQkNCi0JCW1hcmtlcnMgPSB3c1R5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIG1hcmtlcnMubGVuZ3RoKTsNCi0JCWFzc2VydEVxdWFscyg0NywgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJUKSk7DQotCQlhc3NlcnRFcXVhbHMoNTIsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQpKTsNCi0JCWFzc2VydEVxdWFscygyLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkxJTkVfTlVNQkVSKSk7CQkNCi0JCWFzc2VydEVxdWFscyhJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSk7CQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFBvcnROYW1lSXNOQ05hbWUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZSB3cyA9IGZpbmRXcygidGVzdC5XcyIpOw0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHdzKTsNCi0JCUlNYXJrZXIgW10gbWFya2VycyA9IHdzVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMCwgbWFya2Vycy5sZW5ndGgpOw0KLQkJDQotCQlzZXRDb250ZW50cyh3c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UocG9ydE5hbWU9XCItLS1cIikgcHVibGljIGNsYXNzIFdzIHt9Iik7DQotCQl2YWxpZGF0b3IudmFsaWRhdGUod3MpOw0KLQkJDQotCQltYXJrZXJzID0gd3NUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygxLCBtYXJrZXJzLmxlbmd0aCk7DQotCQlhc3NlcnRFcXVhbHMoNDQsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDQ5LCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7DQotCQlhc3NlcnRFcXVhbHMoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkpOwkJDQotCX0JCQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFRhcmdldE5zSXNVcmkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSBmaW5kV3MoInRlc3QuV3MiKTsNCi0JCXNldENvbnRlbnRzKHdzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgIkBqYXZheC5qd3MuV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2U9XCJeXl5cIikgcHVibGljIGNsYXNzIFdzIHt9Iik7DQotCQl2YWxpZGF0b3IudmFsaWRhdGUod3MpOw0KLQ0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gd3NUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygxLCBtYXJrZXJzLmxlbmd0aCk7DQotCQlhc3NlcnRFcXVhbHMoNTEsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDU2LCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7DQotCQlhc3NlcnRFcXVhbHMoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkpOwkJDQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFNFSUV4aXN0cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZSB3cyA9IGZpbmRXcygidGVzdC5XcyIpOw0KLQkJc2V0Q29udGVudHMod3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKGVuZHBvaW50SW50ZXJmYWNlPVwiY29tLnNhcC5kZW1vLlRlc3RcIikgcHVibGljIGNsYXNzIFdzIHt9Iik7DQotCQl2YWxpZGF0b3IudmFsaWRhdGUod3MpOw0KLQ0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gd3NUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygxLCBtYXJrZXJzLmxlbmd0aCk7DQotCQlhc3NlcnRFcXVhbHMoNTMsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDcyLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7DQotCQlhc3NlcnRFcXVhbHMoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkpOwkJCQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lTWlzc2luZ0lmU2VpUmVmZXJlbmNlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQl7DQotCQlmaW5hbCBJVHlwZSBzZWkgPSB0ZXN0UHJvamVjdC5jcmVhdGVUeXBlKHRlc3RQYWNrLCAiU2VpLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWlOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHt9Iik7DQotCQlhc3NlcnROb3ROdWxsKHNlaSk7DQotCQlmaW5hbCBJV2ViU2VydmljZSB3cyA9IGZpbmRXcygidGVzdC5XcyIpOw0KLQkJc2V0Q29udGVudHMod3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKGVuZHBvaW50SW50ZXJmYWNlPVwidGVzdC5TZWlcIikgcHVibGljIGNsYXNzIFdzIHt9Iik7DQotCQl2YWxpZGF0b3IudmFsaWRhdGUod3MpOw0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gd3NUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsJCQ0KLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcmtlcnMubGVuZ3RoKTsNCi0JCQ0KLQkJc2V0Q29udGVudHMod3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJUZXN0XCIsIGVuZHBvaW50SW50ZXJmYWNlPVwidGVzdC5TZWlcIikgcHVibGljIGNsYXNzIFdzIHt9Iik7DQotCQl2YWxpZGF0b3IudmFsaWRhdGUod3MpOw0KLQkJbWFya2VycyA9IHdzVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgbWFya2Vycy5sZW5ndGgpOw0KLQkJYXNzZXJ0RXF1YWxzKDQwLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQpKTsNCi0JCWFzc2VydEVxdWFscyg0NiwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCkpOw0KLQkJYXNzZXJ0RXF1YWxzKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpKTsJCQ0KLQl9CQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0V3NkbExvY2F0aW9uSW5Qcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSBmaW5kV3MoInRlc3QuV3MiKTsNCi0JCUlGaWxlIGZpbGUgPSB0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RmlsZSgiVGVzdC53c2RsIik7DQotCQlmaWxlLmNyZWF0ZShuZXcgU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyKCIiKSwgdHJ1ZSwgbnVsbCk7DQotCQkNCi0JCXNldENvbnRlbnRzKHdzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiVGVzdFwiLCB3c2RsTG9jYXRpb249XCJUZXN0LndzZGxcIikgcHVibGljIGNsYXNzIFdzIHt9Iik7DQotCQl2YWxpZGF0b3IudmFsaWRhdGUod3MpOw0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gd3NUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygwLCBtYXJrZXJzLmxlbmd0aCk7CQkNCi0JCS8vIHdyb25nIGxvY2F0aW9uDQotCQlzZXRDb250ZW50cyh3c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlRlc3RcIiwgd3NkbExvY2F0aW9uPVwiVGVzdDEud3NkbFwiKSBwdWJsaWMgY2xhc3MgV3Mge30iKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZSh3cyk7DQotCQltYXJrZXJzID0gd3NUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygxLCBtYXJrZXJzLmxlbmd0aCk7DQotCQlhc3NlcnRFcXVhbHMoNjEsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDczLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7DQotCQlhc3NlcnRFcXVhbHMoSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSk7CQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0V3NkbExvY2F0aW9uSW5NZXRhSW5mQ29ycmVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzID0gZmluZFdzKCJ0ZXN0LldzIik7DQotCQlmaW5hbCBJRm9sZGVyIG1ldGFJbmYgPSAoKElGb2xkZXIpdGVzdFByb2plY3QuZ2V0U291cmNlRm9sZGVyKCkuZ2V0UmVzb3VyY2UoKSkuZ2V0Rm9sZGVyKCJNRVRBLUlORiIpOw0KLQkJbWV0YUluZi5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7DQotCQlJRmlsZSBmaWxlID0gbWV0YUluZi5nZXRGaWxlKCJUZXN0LndzZGwiKTsNCi0JCWZpbGUuY3JlYXRlKG5ldyBTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIoIiIpLCB0cnVlLCBudWxsKTsNCi0JCQ0KLQkJc2V0Q29udGVudHMod3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJUZXN0XCIsIHdzZGxMb2NhdGlvbj1cIk1FVEEtSU5GL1Rlc3Qud3NkbFwiKSBwdWJsaWMgY2xhc3MgV3Mge30iKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZSh3cyk7DQotCQlJTWFya2VyIFtdIG1hcmtlcnMgPSB3c1R5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcmtlcnMubGVuZ3RoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFdzZGxMb2NhdGlvbkluY29ycmVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzID0gZmluZFdzKCJ0ZXN0LldzIik7CQkNCi0JCS8vIGVtcHR5IGxvY2F0aW9uDQotCQlzZXRDb250ZW50cyh3c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlRlc3RcIiwgd3NkbExvY2F0aW9uPVwiXCIpIHB1YmxpYyBjbGFzcyBXcyB7fSIpOw0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHdzKTsNCi0JCUlNYXJrZXIgW10gbWFya2VycyA9IHdzVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgbWFya2Vycy5sZW5ndGgpOw0KLQkJYXNzZXJ0RXF1YWxzKDYxLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQpKTsNCi0JCWFzc2VydEVxdWFscyg2MywgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCkpOw0KLQkJYXNzZXJ0RXF1YWxzKElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkpOwkJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RW5kcG9pbnRDb3JyZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJc2V0Q29udGVudHMod3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlIGNsYXNzIFdzIHt9Iik7DQotCQlJV2ViU2VydmljZSB3cyA9IGZpbmRXcygidGVzdC5XcyIpOw0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHdzKTsNCi0JCUlNYXJrZXIgW10gbWFya2VycyA9IHdzVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgbWFya2Vycy5sZW5ndGgpOw0KLQkJYXNzZXJ0RXF1YWxzKDEzLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQpKTsNCi0JCWFzc2VydEVxdWFscygzNCwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCkpOw0KLQkJYXNzZXJ0RXF1YWxzKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpKTsJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RFbmRwb2ludEltcGxlbWVudHNTZWkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0Jew0KLQkJSVR5cGUgc2VpVHlwZSA9IHRlc3RQcm9qZWN0LmNyZWF0ZVR5cGUodGVzdFBhY2ssICJTZWkuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UgcHVibGljIGludGVyZmFjZSBTZWkgeyIgKyANCi0JCQkJInB1YmxpYyB2b2lkIHRlc3QoKTsiICsgDQotCQkJCSJwdWJsaWMgaW50IHNlY29uZChpbnQgYSwgaW50IGIsIFN0cmluZyBjKTsiICsgDQotCQkJCSJ9Iik7IA0KLQkJc2V0Q29udGVudHMod3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKGVuZHBvaW50SW50ZXJmYWNlPVwidGVzdC5TZWlcIikgcHVibGljIGNsYXNzIFdzIHsiICsgDQotCQkJCSJwdWJsaWMgdm9pZCB0ZXN0KCkge30iICsgDQotCQkJIn0iKTsNCi0JCQ0KLQkJSVdlYlNlcnZpY2Ugd3MgPSBmaW5kV3MoInRlc3QuV3MiKTsgDQotDQotCQl2YWxpZGF0b3IudmFsaWRhdGUod3MpOw0KLQkJSU1hcmtlcltdIG1hcmtlcnMgPSB3c1R5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIG1hcmtlcnMubGVuZ3RoKTsNCi0JCWFzc2VydEVxdWFscyhJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSk7DQotCQlhc3NlcnRFcXVhbHMoNTMsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDYzLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7DQotCQlhc3NlcnRFcXVhbHMoMiwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUikpOw0KLQkJDQotCQltYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMCwgbWFya2Vycy5sZW5ndGgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL3ZhbGlkYXRpb24vTWV0aG9kVmFsaWRhdG9yVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvdmFsaWRhdGlvbi9NZXRob2RWYWxpZGF0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEzMTRmMDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvdmFsaWRhdGlvbi9NZXRob2RWYWxpZGF0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLk1ldGhvZFZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuZXhjZXB0aW9ucy5BYnN0cmFjdENsYXNzTm90SW1wbGVtZW50ZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuQ29uc3RydWN0b3JOb3RFeHBvc2FibGVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuSGFzSW5hZG1pc2FibGVJbm5lclR5cGVzRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLkluaGVyaXRhbmNlQW5kSW1wbGVtZW50YXRpb25FeGVjcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuSW50ZXJmYWNlc05vdFN1cHBvcnRlZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuZXhjZXB0aW9ucy5NZXRob2ROb3RQdWJsaWNFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuTm9EZWZhdWx0Q29uc3RydWN0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuUmVtb3RlT2JqZWN0RXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuQ2xhc3NMb2FkaW5nVGVzdDsNCi0NCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikNCi1wdWJsaWMgY2xhc3MgTWV0aG9kVmFsaWRhdG9yVGVzdCBleHRlbmRzIENsYXNzTG9hZGluZ1Rlc3QNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUkMgPSAic3JjIjsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDSyA9ICJydW50aW1lLnR5cGUudmFsaWRhdGlvbi50ZXN0IjsNCi0NCi0JcHJpdmF0ZSBNZXRob2RWYWxpZGF0b3IgdmFsaWRhdG9yOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsNCi0NCi0JCWNyZWF0ZUNsYXNzZXMoIm1vY2svUnVudGltZUNsYXNzZXMuc3JjIik7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJtb2NrL0VuZHBvaW50LnNyYyIsICJFbmRwb2ludCIpOw0KLQ0KLQkJdmFsaWRhdG9yID0gbmV3IE1ldGhvZFZhbGlkYXRvcigpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDaGVja0dlbmVyYWxDYXNlcygpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nW10gZW1wdHlQYXJhbXMgPSBuZXcgU3RyaW5nW10ge307DQotDQotCQkvLyBjaGVjayBjb25zdHJ1Y3Rvcg0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoIkVuZHBvaW50IiwgZW1wdHlQYXJhbXMpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOw0KLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUik7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yTm90RXhwb3NhYmxlRXhjZXB0aW9uKTsNCi0NCi0JCS8vIGNoZWNrIHByaXZhdGUgbWV0aG9kDQotCQltZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoInByaXZhdGVNZXRob2QiLCBlbXB0eVBhcmFtcyk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7DQotCQlzdGF0dXMgPSB2YWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUik7DQotCQlhc3NlcnROb3ROdWxsKHN0YXR1cy5nZXRNZXNzYWdlKCkpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBNZXRob2ROb3RQdWJsaWNFeGNlcHRpb24pOw0KLQ0KLQkJLy8gY2hlY2sgcHJvdGVjdGVkDQotCQltZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoInByb3RlY3RlZE1ldGhvZCIsIGVtcHR5UGFyYW1zKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCXN0YXR1cyA9IHZhbGlkYXRvci5jaGVjayhtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKTsNCi0JCWFzc2VydE5vdE51bGwoc3RhdHVzLmdldE1lc3NhZ2UoKSk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIE1ldGhvZE5vdFB1YmxpY0V4Y2VwdGlvbik7DQotDQotCQkvLyBjaGVjayB1c2UgdW5zdXBwb3J0ZWQgamF2YXguKiBjbGFzcyBmb3IgcmV0dXJuIHR5cGUNCi0JCW1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgidXNlVW5zdXBwb3J0ZWRKYXZhVHlwZSIsIGVtcHR5UGFyYW1zKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCXN0YXR1cyA9IHZhbGlkYXRvci5jaGVjayhtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKTsNCi0JCWFzc2VydE5vdE51bGwoc3RhdHVzLmdldE1lc3NhZ2UoKSk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIE5vRGVmYXVsdENvbnN0cnVjdG9yRXhjZXB0aW9uKTsNCi0NCi0JCS8vIGNoZWNrIHVzZSB1bnN1cHBvcnRlZCBqYXZheC4qIGNsYXNzIGZvciByZXR1cm4gdHlwZQ0KLQkJbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJ1c2VTdXBwb3J0ZWRKYXZhVHlwZSIsIGVtcHR5UGFyYW1zKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCXN0YXR1cyA9IHZhbGlkYXRvci5jaGVjayhtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldE1lc3NhZ2UoKS5lcXVhbHMoIiIpKTsNCi0JCWFzc2VydE51bGwoc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsNCi0NCi0JCS8vIGNoZWNrIHVzZSB2b2lkIHJldHVybiB0eXBlDQotCQltZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoInVzZVZvaWQiLCBlbXB0eVBhcmFtcyk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7DQotCQlzdGF0dXMgPSB2YWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRNZXNzYWdlKCkuZXF1YWxzKCIiKSk7DQotCQlhc3NlcnROdWxsKHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7DQotDQotCQkvLyBjaGVjayB1c2UgYXJyYXkgYXMgcmV0dXJuIHR5cGUNCi0JCW1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgidXNlQXJyYXlBc1JldHVyblZhbHVlIiwgZW1wdHlQYXJhbXMpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOw0KLQkJc3RhdHVzID0gdmFsaWRhdG9yLmNoZWNrKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0TWVzc2FnZSgpLmVxdWFscygiIikpOw0KLQkJYXNzZXJ0TnVsbChzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOw0KLQ0KLQkJLy8gY2hlY2sgdXNlIGFycmF5IGFzIHBhcmFtZXRoZXINCi0JCW1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgidXNlQXJyYXlBc1BhcmFtIiwgbmV3IFN0cmluZ1tdIHsgIltJIiB9KTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCXN0YXR1cyA9IHZhbGlkYXRvci5jaGVjayhtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldE1lc3NhZ2UoKS5lcXVhbHMoIiIpKTsNCi0JCWFzc2VydE51bGwoc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsNCi0NCi0JCS8vIGNoZWNrIHVzZSBtdWx0eSBkaW1lbnRpb24gYXJyYXkgYXMgcGFyYW1ldGhlcg0KLQkJbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJ1c2VNREFycmF5QXNQYXJhbSIsIG5ldyBTdHJpbmdbXSB7ICJbW1tJIiB9KTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCXN0YXR1cyA9IHZhbGlkYXRvci5jaGVjayhtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldE1lc3NhZ2UoKS5lcXVhbHMoIiIpKTsNCi0JCWFzc2VydE51bGwoc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsNCi0NCi0JCS8vIGNoZWNrIHVzZSBuZXN0ZWQgZ2VuZXJpY3MNCi0JCW1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgidXNlTmVzdGVkR2VuZXJpY3MiLCBlbXB0eVBhcmFtcyk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7DQotCQlzdGF0dXMgPSB2YWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyk7DQotCQlhc3NlcnROb3ROdWxsKHN0YXR1cy5nZXRNZXNzYWdlKCkpOw0KLQkJYXNzZXJ0TnVsbChzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOw0KLQ0KLQkJbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJ1c2VFeHRlbmRzSW5HZW5lcmljcyIsIGVtcHR5UGFyYW1zKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCXN0YXR1cyA9IHZhbGlkYXRvci5jaGVjayhtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKTsNCi0JCWFzc2VydE5vdE51bGwoc3RhdHVzLmdldE1lc3NhZ2UoKSk7DQotCQlhc3NlcnROdWxsKHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7DQotDQotCQltZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoInVzZVN1cGVySW5HZW5lcmljcyIsIGVtcHR5UGFyYW1zKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCXN0YXR1cyA9IHZhbGlkYXRvci5jaGVjayhtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKTsNCi0JCWFzc2VydE5vdE51bGwoc3RhdHVzLmdldE1lc3NhZ2UoKSk7DQotCQlhc3NlcnROdWxsKHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7DQotDQotCQltZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoInVzZVN1cGVySW5HZW5lcmljc0FzUGFyYW0iLCBuZXcgU3RyaW5nW10geyAiUUxpc3Q8LVFTdHJpbmc7PjsiIH0pOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOw0KLQkJc3RhdHVzID0gdmFsaWRhdG9yLmNoZWNrKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spOw0KLQkJYXNzZXJ0Tm90TnVsbChzdGF0dXMuZ2V0TWVzc2FnZSgpKTsNCi0JCWFzc2VydE51bGwoc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsNCi0NCi0JCS8vIGNoZWNrIG1ldGhvZCByZXR1cm5pbmcgZW51bQ0KLQkJbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJ1c2VFbnVtIiwgZW1wdHlQYXJhbXMpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOw0KLQkJc3RhdHVzID0gdmFsaWRhdG9yLmNoZWNrKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spOw0KLQkJYXNzZXJ0Tm90TnVsbChzdGF0dXMuZ2V0TWVzc2FnZSgpKTsNCi0JCWFzc2VydE51bGwoc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsNCi0NCi0JCS8vIGNoZWNrIG1ldGhvZCByZXR1cm5pbmcgY3VzdG9tIG1hcA0KLQkJbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJ1c2VNeU1hcCIsIGVtcHR5UGFyYW1zKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCXN0YXR1cyA9IHZhbGlkYXRvci5jaGVjayhtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKTsNCi0JCWFzc2VydE5vdE51bGwoc3RhdHVzLmdldE1lc3NhZ2UoKSk7DQotCQlhc3NlcnROdWxsKHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENlY2tUeXBlc0luY29tcGF0aWJsZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nW10gZW1wdHlQYXJhbXMgPSBuZXcgU3RyaW5nW10ge307DQotDQotCQkvLyB1c2UgdHlwZSB3aGljaCBkb2Vzbid0IGhhdmUgZGVmYXVsdCBjb25zdHJ1Y3Rvcg0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoInVzZUltcGxlbWVudHNSZW1vdGUiLCBlbXB0eVBhcmFtcyk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7DQotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci5jaGVjayhtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKTsNCi0JCWFzc2VydE5vdE51bGwoc3RhdHVzLmdldE1lc3NhZ2UoKSk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIFJlbW90ZU9iamVjdEV4Y2VwdGlvbik7DQotDQotCQkvLyB1c2UgdHlwZSB3aGljaCBkb2Vzbid0IGhhdmUgZGVmYXVsdCBjb25zdHJ1Y3Rvcg0KLQkJbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJ1c2VOb0RlZmF1bHRDb25zdHJ1Y3RvciIsIGVtcHR5UGFyYW1zKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCXN0YXR1cyA9IHZhbGlkYXRvci5jaGVjayhtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKTsNCi0JCWFzc2VydE5vdE51bGwoc3RhdHVzLmdldE1lc3NhZ2UoKSk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIE5vRGVmYXVsdENvbnN0cnVjdG9yRXhjZXB0aW9uKTsNCi0NCi0JCS8vIHVzZSB0eXBlIHdoaWNoIGhhcyBub24gcHVibGljIG5vbiBzdGF0aWMgaW5uZXIgY2xhc3MNCi0JCW1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgidXNlSGFzSW5hZG1pc2FibGVJbm5lckNsYXNzIiwgZW1wdHlQYXJhbXMpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOw0KLQkJc3RhdHVzID0gdmFsaWRhdG9yLmNoZWNrKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpOw0KLQkJYXNzZXJ0Tm90TnVsbChzdGF0dXMuZ2V0TWVzc2FnZSgpKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgSGFzSW5hZG1pc2FibGVJbm5lclR5cGVzRXhjZXB0aW9uKTsNCi0NCi0JCS8vIHVzZSB0eXBlIGFzIHBhcmFtZXRoZXIgd2hpY2ggY29udGFpbnMgdW5zdXBwb3J0ZWQgamF2YSB0eXBlIGFzIHB1YmxpYyBmaWVsZA0KLQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1tdIHsgIlFVc2VzVW5zdXBwb3J0ZWRBc0ZpZWxkOyIgfTsNCi0JCW1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgidXNlVXNlc1Vuc3VwcG9ydGVkQXNGaWVsZCIsIHBhcmFtcyk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7DQotCQlzdGF0dXMgPSB2YWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUik7DQotCQlhc3NlcnROb3ROdWxsKHN0YXR1cy5nZXRNZXNzYWdlKCkpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBOb0RlZmF1bHRDb25zdHJ1Y3RvckV4Y2VwdGlvbik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENlY2tUeXBlc0luY29tcGF0aWJsZUltcGxlbWVudGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmdbXSBlbXB0eVBhcmFtcyA9IG5ldyBTdHJpbmdbXSB7fTsNCi0NCi0JCS8vIHVzZSBub3QgaW1wbGVtZW50ZWQgYWJzdHJhY3QgY2xhc3MNCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJ1c2VOb3RJbXBsZW1lbnRlZEFic3RyYWN0Q2xhc3MiLCBlbXB0eVBhcmFtcyk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7DQotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci5jaGVjayhtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKTsNCi0JCWFzc2VydE5vdE51bGwoc3RhdHVzLmdldE1lc3NhZ2UoKSk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIEFic3RyYWN0Q2xhc3NOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbik7DQotDQotCQkvLyB1c2UgaW1wbGVtZW50ZWQgYWJzdHJhY3QgY2xhc3MNCi0JCW1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgidXNlSW1wbGVtZW50ZWRBYnN0cmFjdENsYXNzIiwgZW1wdHlQYXJhbXMpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOw0KLQkJc3RhdHVzID0gdmFsaWRhdG9yLmNoZWNrKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0TWVzc2FnZSgpLmVxdWFscygiIikpOw0KLQkJYXNzZXJ0TnVsbChzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDaGVja0ludGVyZmFjZXNVc2VkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmdbXSBlbXB0eVBhcmFtcyA9IG5ldyBTdHJpbmdbXSB7fTsNCi0NCi0JCS8vIHVzZSBub3QgaW1wbGVtZW50ZWQgaW50ZXJmYWNlDQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgidXNlSW50ZXJmYWNlIiwgZW1wdHlQYXJhbXMpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOw0KLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUik7DQotCQlhc3NlcnROb3ROdWxsKHN0YXR1cy5nZXRNZXNzYWdlKCkpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBJbnRlcmZhY2VzTm90U3VwcG9ydGVkRXhjZXB0aW9uKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2Vja1R5cGVzSW5jb21wYXRpYmxlSW5oZXJpdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCVN0cmluZ1tdIGVtcHR5UGFyYW1zID0gbmV3IFN0cmluZ1tdIHt9Ow0KLQ0KLQkJLy8gdXNlIGNsYXNzIHRoYXQgZXh0ZW5kcyBjdXN0b20gY2xhc3MgYW5kIGN1c3RvbSBpbnRlcmZhY2UNCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJ1c2VNdWx0eUluaGVyaXRhbmNlVXNlQ2xhc3MiLCBuZXcgU3RyaW5nW10geyAiUU11bHR5SW5oZXJpdGFuY2VVc2VDbGFzczsiIH0pOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOw0KLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUik7DQotCQlhc3NlcnROb3ROdWxsKHN0YXR1cy5nZXRNZXNzYWdlKCkpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBJbmhlcml0YW5jZUFuZEltcGxlbWVudGF0aW9uRXhlY3B0aW9uKTsNCi0NCi0JCS8vIHVzZSBjbGFzcyB0aGF0IGV4dGVuZHMgY2xhc3MgYW5kIGltcGxlbWVudHMgMyBzdXBwb3J0ZWQgaW50ZXJmYWNlcw0KLQkJbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJ1c2VTdXBwb3J0ZWRNdWx0eUluaGVyaXRhbmNlV2l0aEJhc2VDbGFzcyIsIGVtcHR5UGFyYW1zKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCXN0YXR1cyA9IHZhbGlkYXRvci5jaGVjayhtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldE1lc3NhZ2UoKS5lcXVhbHMoIiIpKTsNCi0JCWFzc2VydE51bGwoc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsNCi0NCi0JCS8vIFN1cHBvcnRlZE11bHR5SW5oZXJpdGFuY2VXaXRoSW50ZXJmYWNlDQotCQltZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoInVzZVN1cHBvcnRlZE11bHR5SW5oZXJpdGFuY2VXaXRoSW50ZXJmYWNlIiwgZW1wdHlQYXJhbXMpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOw0KLQkJc3RhdHVzID0gdmFsaWRhdG9yLmNoZWNrKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0TWVzc2FnZSgpLmVxdWFscygiIikpOw0KLQkJYXNzZXJ0TnVsbChzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOw0KLQ0KLQkJbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJ1c2VJbXBsZW1lbnRlZEJhc2VJbkdlbmVyaWNzIiwgZW1wdHlQYXJhbXMpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOw0KLQkJc3RhdHVzID0gdmFsaWRhdG9yLmNoZWNrKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0TWVzc2FnZSgpLmVxdWFscygiIikpOw0KLQkJYXNzZXJ0TnVsbChzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDZWNrTWV0aG9kc1dpdGhFeGNlcHRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmdbXSBlbXB0eVBhcmFtcyA9IG5ldyBTdHJpbmdbXSB7fTsNCi0NCi0JCS8vIHVzZSBjbGFzcyB0aGF0IGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbiBhbmQgY3VzdG9tIGludGVyZmFjZQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoInVzZUN1c3RvbUV4Y2VwdGlvbiIsIGVtcHR5UGFyYW1zKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdG9yLmNoZWNrKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0TWVzc2FnZSgpLmVxdWFscygiIikpOw0KLQkJYXNzZXJ0TnVsbChzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOw0KLQ0KLQkJbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJ1c2VFeGNlcHRpb24iLCBlbXB0eVBhcmFtcyk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7DQotCQlzdGF0dXMgPSB2YWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRNZXNzYWdlKCkuZXF1YWxzKCIiKSk7DQotCQlhc3NlcnROdWxsKHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDaGVja01ldGhvZFdpdGhEZWZhdWx0QWNjZXNzSW5JbnRlcmZhY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlmaW5hbCBTdHJpbmcgc2VpQ29kZSA9ICJwdWJsaWMgaW50ZXJmYWNlIFNFSVdpdGhEZWZhdWx0QWNjZXNzTWV0aG9kIHsgXG4iICsNCi0JCQkJIglTdHJpbmcgdGVzdCgpOyBcbiIgKw0KLQkJCQkifSI7IA0KLQkJZmluYWwgSVR5cGUgc2VpVHlwZSA9IGdldFRlc3RQcm9qZWN0KCkuY3JlYXRlVHlwZShkZWZhdWx0UGFja2FnZSwgIlNFSVdpdGhEZWZhdWx0QWNjZXNzTWV0aG9kLmphdmEiLCBzZWlDb2RlKTsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kID0gc2VpVHlwZS5nZXRNZXRob2QoInRlc3QiLCBuZXcgU3RyaW5nIFtde30pOw0KLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCWFzc2VydEVxdWFscygiRGVmYXVsdCBtZXRob2QgaW4gU0VJIHJlcG9ydGVkIGFzIGluY29ycmVjdCIsIElTdGF0dXMuT0ssIHN0YXR1cy5nZXRTZXZlcml0eSgpKTsJCQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL3ZhbGlkYXRpb24vUnVudGltZVR5cGVWYWxpZGF0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy92YWxpZGF0aW9uL1J1bnRpbWVUeXBlVmFsaWRhdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZWMxYTNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL3ZhbGlkYXRpb24vUnVudGltZVR5cGVWYWxpZGF0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC52YWxpZGF0aW9uLnByb3ZpZGVyLlR5cGVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5SdW50aW1lVHlwZVZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuZXhjZXB0aW9ucy5BYnN0cmFjdENsYXNzTm90SW1wbGVtZW50ZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuSGFzSW5hZG1pc2FibGVJbm5lclR5cGVzRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLkluaGVyaXRhbmNlQW5kSW1wbGVtZW50YXRpb25FeGVjcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuSW50ZXJmYWNlc05vdFN1cHBvcnRlZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuZXhjZXB0aW9ucy5NdWx0aXBsZUltcGxlbWVudGF0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLk5vRGVmYXVsdENvbnN0cnVjdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLlJlbW90ZU9iamVjdEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotDQotLyoqDQotICogVGVzdCBmb3IgcnVudGltZSB0eXBlcyB2YWxpZGF0aW9uLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikNCi1wdWJsaWMgY2xhc3MgUnVudGltZVR5cGVWYWxpZGF0b3JUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUENLID0gInJ1bnRpbWUudHlwZS52YWxpZGF0aW9uLnRlc3QiOw0KLQ0KLQlwcml2YXRlIFJ1bnRpbWVUeXBlVmFsaWRhdG9yIHZhbGlkYXRvcjsNCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotDQotCQljcmVhdGVDbGFzc2VzKCJtb2NrL1J1bnRpbWVDbGFzc2VzLnNyYyIpOw0KLQkJdmFsaWRhdG9yID0gbmV3IFJ1bnRpbWVUeXBlVmFsaWRhdG9yKCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlR2VuZXJhbENhc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQkvLyBjaGVjayB1bnN1cHBvcnRlZCBqYXZheC4qIGNsYXNzDQotCQlJVHlwZSB0eXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksICJqYXZhLnNxbC5EYXRlIik7DQotCQlhc3NlcnROb3ROdWxsKHR5cGUpOw0KLQkJdHJ5DQotCQl7DQotCQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOw0KLQkJCWZhaWwoIk5vdFN1cHBvcnRlZEphdmFUeXBlIik7DQotCQl9IGNhdGNoIChOb0RlZmF1bHRDb25zdHJ1Y3RvckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotDQotCQkvLyBjaGVjayBzdXBwb3J0ZWQgamF2YSB0eXBlDQotCQl0eXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksICJqYXZhLm5ldC5VUkkiKTsNCi0JCWFzc2VydE5vdE51bGwodHlwZSk7DQotCQl2YWxpZGF0b3IudmFsaWRhdGUodHlwZSk7DQotDQotCQkvLyBjaGVjayB1bnN1cHBvcnRlZCBqYXZheC4qIGNsYXNzIHVzZWQgaW4gZ2V0dGVyDQotCQl0eXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksIFBDSyArICIuVXNlc1Vuc3VwcG9ydGVkQXNQcm9wZXJ0eSIpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsNCi0JCXRyeQ0KLQkJew0KLQkJCXZhbGlkYXRvci52YWxpZGF0ZSh0eXBlKTsNCi0JCQlmYWlsKCJVc2VzVW5zdXBwb3J0ZWRBc1Byb3BlcnR5Iik7DQotCQl9IGNhdGNoIChOb0RlZmF1bHRDb25zdHJ1Y3RvckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotDQotCQkvLyB1c2VzIHVuc3VwcG9ydGVkIGluIG5vdCBhIGdldHRlciBtZXRob2QNCi0JCXR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5Vc2VzVW5zdXBwb3J0ZWRJbk1ldGhvZCIpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZSh0eXBlKTsNCi0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEphdmFTcWxUeW1lc3RhbXBOb3RTdXBwb3J0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsJCQ0KLQkJSVR5cGUgdHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZShnZXRQcm9qZWN0TmFtZSgpLCAiamF2YS5zcWwuVGltZXN0YW1wIik7DQotCQl0cnkgew0KLQkJCXZhbGlkYXRvci52YWxpZGF0ZSh0eXBlKTsNCi0JCQlmYWlsKCJqYXZhLnNxbC5UaW1lc3RhbXAgbm90IGRldGVjdGVkIGFzIHVuc3VwcG9ydGVkIik7DQotCQl9IGNhdGNoIChOb0RlZmF1bHRDb25zdHJ1Y3RvckV4Y2VwdGlvbiBfKSB7CQkJDQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlTm9EZWZhdWx0Q29uc3RydWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkDQotCXsNCi0JCS8vIHVzZSB0eXBlIHdoaWNoIGRvZXNuJ3QgaGF2ZSBkZWZhdWx0IGNvbnN0cnVjdG9yDQotCQlJVHlwZSB0eXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksIFBDSyArICIuTm9EZWZhdWx0Q29uc3RydWN0b3IiKTsNCi0JCWFzc2VydE5vdE51bGwodHlwZSk7DQotCQl0cnkNCi0JCXsNCi0JCQl2YWxpZGF0b3IudmFsaWRhdGUodHlwZSk7DQotCQkJZmFpbCgiTm9EZWZhdWx0Q29uc3RydWN0b3IiKTsNCi0JCX0gY2F0Y2ggKE5vRGVmYXVsdENvbnN0cnVjdG9yRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0NCi0JCXR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5Ob0RlZmF1bHRDb25zdHJ1Y3RvclByaXZhdGVDb25zdHJ1Y3RvcnMiKTsNCi0JCWFzc2VydE5vdE51bGwodHlwZSk7DQotCQl0cnkNCi0JCXsNCi0JCQl2YWxpZGF0b3IudmFsaWRhdGUodHlwZSk7DQotCQkJZmFpbCgiTm9EZWZhdWx0Q29uc3RydWN0b3JQcml2YXRlQ29uc3RydWN0b3JzIik7DQotCQl9IGNhdGNoIChOb0RlZmF1bHRDb25zdHJ1Y3RvckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotCX0NCi0JCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0VXNlc1Vuc3VwcG9ydGVkSW5UcmFuc2llbnRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCS8vIHVzZXMgdW5zdXBwb3J0ZWQgaW4geG1sIHRyYW5zaWVudCBtZXRob2QNCi0JCUlUeXBlIHR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5Vc2VzVW5zdXBwb3J0ZWRJblRyYW5zaWVudE1ldGhvZCIpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZSh0eXBlKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFhtbFR5cGVBbm5vdGF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCUlUeXBlIHR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5YbWxUeXBlQ2xhc3MiKTsNCi0JCWFzc2VydE5vdE51bGwodHlwZSk7DQotCQl0cnkNCi0JCXsNCi0JCQl2YWxpZGF0b3IudmFsaWRhdGUodHlwZSk7DQotCQl9IGNhdGNoIChOb0RlZmF1bHRDb25zdHJ1Y3RvckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWZhaWwoIlhNTCBUeXBlIGFubm90YXRlZCBjbGFzcyBub3QgcmVjb2duaXplZCIpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0V2ViRmF1bHRBbm5vdGF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCUlUeXBlIHR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5XZWJGYXVsdENsYXNzIik7DQotCQlhc3NlcnROb3ROdWxsKHR5cGUpOw0KLQkJdHJ5DQotCQl7DQotCQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOw0KLQkJfSBjYXRjaCAoTm9EZWZhdWx0Q29uc3RydWN0b3JFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlmYWlsKCJXZWIgRmF1bHQgYW5ub3RhdGVkIGNsYXNzIG5vdCByZWNvZ25pemVkIik7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlQ3VzdG9tQ29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0Jew0KLQkJSVR5cGUgdHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZShnZXRQcm9qZWN0TmFtZSgpLCBQQ0sgKyAiLk15U2V0Iik7DQotCQlhc3NlcnROb3ROdWxsKHR5cGUpOw0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUN1c3RvbU1hcCgpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0Jew0KLQkJSVR5cGUgdHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZShnZXRQcm9qZWN0TmFtZSgpLCBQQ0sgKyAiLk15TWFwIik7DQotCQlhc3NlcnROb3ROdWxsKHR5cGUpOw0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVR5cGVzSW5jb21wYXRpYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQkvLyB1c2UgdHlwZSB3aGljaCBkb2Vzbid0IGhhdmUgZGVmYXVsdCBjb25zdHJ1Y3Rvcg0KLQkJSVR5cGUgdHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZShnZXRQcm9qZWN0TmFtZSgpLCBQQ0sgKyAiLkltcGxlbWVudHNSZW1vdGUiKTsNCi0JCWFzc2VydE5vdE51bGwodHlwZSk7DQotCQl0cnkNCi0JCXsNCi0JCQl2YWxpZGF0b3IudmFsaWRhdGUodHlwZSk7DQotCQkJZmFpbCgiSW1wbGVtZW50c1JlbW90ZSIpOw0KLQkJfSBjYXRjaCAoUmVtb3RlT2JqZWN0RXhjZXB0aW9uIGUpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0NCi0JCS8vIHVzZSB0eXBlIHdoaWNoIGhhcyBub24gcHVibGljIG5vbiBzdGF0aWMgaW5uZXIgY2xhc3MNCi0JCXR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5IYXNJbmFkbWlzYWJsZUlubmVyQ2xhc3MiKTsNCi0JCWFzc2VydE5vdE51bGwodHlwZSk7DQotCQl0cnkNCi0JCXsNCi0JCQl2YWxpZGF0b3IudmFsaWRhdGUodHlwZSk7DQotCQkJZmFpbCgiSW1wbGVtZW50c1JlbW90ZSIpOw0KLQkJfSBjYXRjaCAoSGFzSW5hZG1pc2FibGVJbm5lclR5cGVzRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0NCi0JCS8vIHVzZSB0eXBlIGFzIHBhcmFtZXRoZXIgd2hpY2ggY29udGFpbnMgdW5zdXBwb3J0ZWQgamF2YSB0eXBlIGFzIHB1YmxpYyBmaWVsZA0KLQkJdHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZShnZXRQcm9qZWN0TmFtZSgpLCBQQ0sgKyAiLlVzZXNVbnN1cHBvcnRlZEFzRmllbGQiKTsNCi0JCWFzc2VydE5vdE51bGwodHlwZSk7DQotCQl0cnkNCi0JCXsNCi0JCQl2YWxpZGF0b3IudmFsaWRhdGUodHlwZSk7DQotCQkJZmFpbCgiSW1wbGVtZW50c1JlbW90ZSIpOw0KLQkJfSBjYXRjaCAoTm9EZWZhdWx0Q29uc3RydWN0b3JFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVR5cGVzSW5jb21wYXRpYmxlSW1wbGVtZW50YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCS8vIHVzZSBub3QgaW1wbGVtZW50ZWQgYWJzdHJhY3QgY2xhc3MNCi0JCUlUeXBlIHR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5CYXNlTm90SW1wbGVtZW50ZWQiKTsNCi0JCWFzc2VydE5vdE51bGwodHlwZSk7DQotCQl0cnkNCi0JCXsNCi0JCQl2YWxpZGF0b3IudmFsaWRhdGUodHlwZSk7DQotCQkJZmFpbCgiSW1wbGVtZW50c1JlbW90ZSIpOw0KLQkJfSBjYXRjaCAoQWJzdHJhY3RDbGFzc05vdEltcGxlbWVudGVkRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0NCi0JCS8vIHVzZSBpbXBsZW1lbnRlZCBhYnN0cmFjdCBjbGFzcw0KLQkJdHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZShnZXRQcm9qZWN0TmFtZSgpLCBQQ0sgKyAiLkJhc2VJbXBsZW1lbnRlZCIpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZSh0eXBlKTsNCi0NCi0JCS8vIHVzZSBpbnRlcmZhY2UNCi0JCXR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5JbnRlcmZhY2VJbXBsZW1lbnRlZCIpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsNCi0JCXRyeQ0KLQkJew0KLQkJCS8vIHVzZSBpbXBsZW1lbnRlZCBpbnRlcmZhY2UNCi0JCQl2YWxpZGF0b3IudmFsaWRhdGUodHlwZSk7DQotCQl9IGNhdGNoIChJbnRlcmZhY2VzTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVUeXBlc0luY29tcGF0aWJsZUluaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQkvLyB1c2UgY2xhc3MgdGhhdCBleHRlbmRzIGN1c3RvbSBjbGFzcyBhbmQgY3VzdG9tIGludGVyZmFjZQ0KLQkJSVR5cGUgdHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZShnZXRQcm9qZWN0TmFtZSgpLCBQQ0sgKyAiLk11bHR5SW5oZXJpdGFuY2VVc2VDbGFzcyIpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsNCi0JCXRyeQ0KLQkJew0KLQkJCXZhbGlkYXRvci52YWxpZGF0ZSh0eXBlKTsNCi0JCQlmYWlsKCJNdWx0eUluaGVyaXRhbmNlVXNlQ2xhc3MiKTsNCi0JCX0gY2F0Y2ggKEluaGVyaXRhbmNlQW5kSW1wbGVtZW50YXRpb25FeGVjcHRpb24gZSkNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQ0KLQkJLy8gdXNlIG11bHR5IGluaGVyaXRhbmNlIHdpdGggMiBpbXBsZW1lbnRlZCBpbnRlcmZhY2VzDQotCQl0eXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksIFBDSyArICIuTXVsdHlJbmhlcml0YW5jZVVzZUludGVyZmFjZXMiKTsNCi0JCWFzc2VydE5vdE51bGwodHlwZSk7DQotCQl0cnkNCi0JCXsNCi0JCQl2YWxpZGF0b3IudmFsaWRhdGUodHlwZSk7DQotCQkJZmFpbCgiTXVsdHlJbmhlcml0YW5jZVVzZUludGVyZmFjZXMiKTsNCi0JCX0gY2F0Y2ggKE11bHRpcGxlSW1wbGVtZW50YXRpb25FeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQ0KLQkJLy8gdXNlIGNsYXNzIHRoYXQgZXh0ZW5kcyBjbGFzcyBhbmQgaW1wbGVtZW50cyAzIHN1cHBvcnRlZCBpbnRlcmZhY2VzDQotCQl0eXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksIFBDSyArICIuU3VwcG9ydGVkTXVsdHlJbmhlcml0YW5jZVdpdGhCYXNlQ2xhc3MiKTsNCi0JCWFzc2VydE5vdE51bGwodHlwZSk7DQotCQl2YWxpZGF0b3IudmFsaWRhdGUodHlwZSk7DQotDQotCQkvLyBTdXBwb3J0ZWRNdWx0eUluaGVyaXRhbmNlV2l0aEludGVyZmFjZQ0KLQkJdHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZShnZXRQcm9qZWN0TmFtZSgpLCBQQ0sgKyAiLlN1cHBvcnRlZE11bHR5SW5oZXJpdGFuY2VXaXRoSW50ZXJmYWNlIik7DQotCQlhc3NlcnROb3ROdWxsKHR5cGUpOw0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOw0KLQ0KLQkJdHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZShnZXRQcm9qZWN0TmFtZSgpLCBQQ0sgKyAiLkJhc2VJbXBsZW1lbnRlZE5vdENvcnJlY3RseSIpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsNCi0JCXRyeQ0KLQkJew0KLQkJCXZhbGlkYXRvci52YWxpZGF0ZSh0eXBlKTsNCi0JCQlmYWlsKCJNdWx0eUluaGVyaXRhbmNlVXNlQ2xhc3MiKTsNCi0JCX0gY2F0Y2ggKEFic3RyYWN0Q2xhc3NOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlVHlwZXNVc2luZ0dlbmVyaWNzKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQkvLyBjaGVjayBzdXBwb3J0ZWQgdHlwZSBpbiBsaXN0IHVzaW5nIGdlbmVyaWNzDQotCQlJVHlwZSB0eXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksIFBDSyArICIuQ29udGFpbnNMaXN0Iik7DQotCQlhc3NlcnROb3ROdWxsKHR5cGUpOw0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOw0KLQ0KLQkJLy8gY2hlY2sgbm90IHN1cHBvcnRlZCB0eXBlIGluIGxpc3QgdXNpbmcgZ2VuZXJpY3MNCi0JCXR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5Db250YWluc05vdFN1cHBvcnRlZEluTGlzdCIpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsNCi0JCXRyeQ0KLQkJew0KLQkJCXZhbGlkYXRvci52YWxpZGF0ZSh0eXBlKTsNCi0JCQlmYWlsKCJDb250YWluc05vdFN1cHBvcnRlZEluTGlzdCIpOw0KLQkJfSBjYXRjaCAoTm9EZWZhdWx0Q29uc3RydWN0b3JFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQ0KLQkJLy8gY2hlY2sgc3VwcG9ydGVkIHR5cGUgaW4gbGlzdCB1c2luZyBxdW90ZQ0KLQkJdHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZShnZXRQcm9qZWN0TmFtZSgpLCBQQ0sgKyAiLkNvbnRhaW5zUXVvdGVJbkxpc3QiKTsNCi0JCWFzc2VydE5vdE51bGwodHlwZSk7DQotCQl2YWxpZGF0b3IudmFsaWRhdGUodHlwZSk7DQotDQotCQkvLyBjaGVjayBzdXBwb3J0ZWQgdHlwZSBpbiBsaXN0IHVzaW5nIHF1b3RlDQotCQl0eXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksIFBDSyArICIuQ29udGFpbnNFeHRlbmRzSW5MaXN0Iik7DQotCQlhc3NlcnROb3ROdWxsKHR5cGUpOw0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOw0KLQ0KLQkJdHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZShnZXRQcm9qZWN0TmFtZSgpLCBQQ0sgKyAiLkNvbnRhaW5zU3VwZXJJbkxpc3QiKTsNCi0JCWFzc2VydE5vdE51bGwodHlwZSk7DQotCQl2YWxpZGF0b3IudmFsaWRhdGUodHlwZSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlVHlwZXNDaXJjdWxhclJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJLy8gY2hlY2sgY2lyY3VsYXIgcmVmZXJlbmNlIHZpYSBtZW1iZXIgdmFyaWJsZXMNCi0JCUlUeXBlIHR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5DaXJjdWxhckFzUGFyYW1BIik7DQotCQlhc3NlcnROb3ROdWxsKHR5cGUpOw0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOw0KLQ0KLQkJLy8gY2hlY2sgY2lyY3VsYXIgcmVmZXJlbmNlIHZpYSByZXR1cm4gdmFsdWVzDQotCQl0eXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksIFBDSyArICIuQ2lyY3VsYXJBc1JldHVyblZhbHVlQiIpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZSh0eXBlKTsNCi0NCi0JCS8vIGNoZWNrIGNpcmN1bGFyIHJlZmVyZW5jZSB2aWEgbWVtYmVyIGFuZCByZXR1cm4gdmFsdWUNCi0JCXR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5DaXJjdWxhckFzTWl4ZWRQYXJhbVJldHVyblZhbHVlQSIpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZSh0eXBlKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVFbnVtVHlwZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJSVR5cGUgdHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZShnZXRQcm9qZWN0TmFtZSgpLCBQQ0sgKyAiLkVudW1UeXBlIik7DQotCQlhc3NlcnROb3ROdWxsKHR5cGUpOw0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVJbnRlcmZhY2VJbk9iamVjdEZhY3RvcnkoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIFN0cmluZyBQQ0sxID0gIm9yZy5lY2xpcHNlLnRlc3QuaW1wbGVtZW50ZWQiOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwYWNrID0gZ2V0VGVzdFByb2plY3QoKS5jcmVhdGVQYWNrYWdlKFBDSzEpOw0KLQkJDQotCQlmaW5hbCBJVHlwZSB0eXBlID0gZ2V0VGVzdFByb2plY3QoKS5jcmVhdGVUeXBlKHBhY2ssICJJbXBsZW1lbnRlZEludGVyZmFjZS5qYXZhIiwgICJwdWJsaWMgaW50ZXJmYWNlIEltcGxlbWVudGVkSW50ZXJmYWNlIHt9Iik7DQotCQlnZXRUZXN0UHJvamVjdCgpLmNyZWF0ZVR5cGUocGFjaywgIk9iamVjdEZhY3RvcnkuamF2YSIsIA0KLQkJCSJwdWJsaWMgY2xhc3MgT2JqZWN0RmFjdG9yeSB7IiArDQotCQkJIglwdWJsaWMgSW1wbGVtZW50ZWRJbnRlcmZhY2UgY3JlYXRlSW1wbGVtZW50ZWRJbnRlcmZhY2UoKSB7IiArDQotCQkJIgkJcmV0dXJuIG51bGw7IiArDQotCQkJIgl9IiArDQotCQkJIn0iKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZSh0eXBlKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy92YWxpZGF0aW9uL1NFSUltcGxlbWVudGF0aW9uVmFsaWRhdG9yVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvdmFsaWRhdGlvbi9TRUlJbXBsZW1lbnRhdGlvblZhbGlkYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTM0MGMyNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy92YWxpZGF0aW9uL1NFSUltcGxlbWVudGF0aW9uVmFsaWRhdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5TZWlJbXBsZW1lbnRhdGlvblZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotDQotcHVibGljIGNsYXNzIFNFSUltcGxlbWVudGF0aW9uVmFsaWRhdG9yVGVzdCBleHRlbmRzIENsYXNzTG9hZGluZ1Rlc3QNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAib3JnLmVjbGlwc2UudGVzdHMiOw0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KCJzcmMiLCBQQ0spOw0KLQkJY3JlYXRlQ2xhc3NlcygibW9jay9TRUlUZXN0cy5zcmMiKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0VXNlQ2xhc3NGb3JTRUkoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCUlUeXBlIHNlaVR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5TRUlJc0NsYXNzIik7DQotCQkJbmV3IFNlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yKHNlaVR5cGUpOw0KLQkJCWFzc2VydFRydWUoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZmFsc2UpOw0KLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogVGVzdCB3cm9uZyBpbXBsZW1lbnRhdGlvbiB2aWEgbm90IHNhbWUgcGFyYW1zIGFuZCByZXR1cm4gdHlwZS4NCi0JICogDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0QmVhbkRvZXNOb3RJbXBsZW1ldHNTZWlEaWZmZXJlbnRNZXRob2RQYXJhbXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUlUeXBlIHNlaVR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5JTm90SW1wbGVtZW50ZWQiKTsNCi0JCUlUeXBlIGJlYW5UeXBlID0gZ2V0VGVzdFByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKFBDSyArICIuTm90SW1wbGVtZW50ZWRNZXRob2RQYXJhbXNCZWFuIik7DQotDQotCQlTZWlJbXBsZW1lbnRhdGlvblZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3Ioc2VpVHlwZSk7DQotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZShiZWFuVHlwZSk7DQotCQlhc3NlcnRFcXVhbHMoIlN0YXR1cyBub3QgY29ycmVjdCIsIElTdGF0dXMuRVJST1IsIHN0YXR1cy5nZXRTZXZlcml0eSgpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGVzdCB3cm9uZyBpbXBsZW1lbnRhdGlvbiBkaWZmZXJlbnQgbWV0aG9kIGV4Y2VwdGlvaW5zLg0KLQkgKiANCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RCZWFuRG9lc05vdEltcGxlbWV0c1NlaURpZmZlcmVudEV4Y2VwdGlvbnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUlUeXBlIHNlaVR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5JTm90SW1wbGVtZW50ZWQiKTsNCi0JCUlUeXBlIGJlYW5UeXBlID0gZ2V0VGVzdFByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKFBDSyArICIuTm90SW1wbGVtZW50ZWRNZXRob2RFeGNlcHRpb25zQmVhbiIpOw0KLQ0KLQkJU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFNlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yKHNlaVR5cGUpOw0KLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0b3IudmFsaWRhdGUoYmVhblR5cGUpOw0KLQkJYXNzZXJ0RXF1YWxzKCJTdGF0dXMgbm90IGNvcnJlY3QiLCBJU3RhdHVzLkVSUk9SLCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRlc3RzIHRoZSBjYXNlIHdoZW4gdGhlIGJlYW4gaW1wbGVtZW50cyB0aGUgU2VpIGJ5IGRlY2xhcmluZyB0aGUgaW1wbGVtZW50YXRpb24uDQotCSAqIA0KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEJlYW5JbXBsZW1lbnRzU2VpKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlJVHlwZSBzZWlUeXBlID0gZ2V0VGVzdFByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKFBDSyArICIuSUltcGxlbWVudGVkIik7DQotCQlJVHlwZSBiZWFuVHlwZSA9IGdldFRlc3RQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShQQ0sgKyAiLkJlYW5JbXBsZW1lbnRzU2VpIik7DQotDQotCQlTZWlJbXBsZW1lbnRhdGlvblZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3Ioc2VpVHlwZSk7DQotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZShiZWFuVHlwZSk7DQotCQlhc3NlcnRFcXVhbHMoIlN0YXVzIG5vdCBjb3JyZWN0IiwgSVN0YXR1cy5PSywgc3RhdHVzLmdldFNldmVyaXR5KCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUZXN0cyB0aGUgY2FzZSB3aGVuIHRoZSBiZWFuIGltcGxlbWVudHMgbWV0aG9kcyBmcm9tIFNlaSB3aXRob3QgZGlyZWN0bHkgaW1wbGVtZW50aW5nIGl0IHZpYSBqYXZhIGRlY2xhcmF0aW9uLg0KLQkgKiANCi0JICogQHRocm93cyBFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RTRUlJbXBsZW1lbnRlZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJSVR5cGUgc2VpVHlwZSA9IGdldFRlc3RQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShQQ0sgKyAiLklJbXBsZW1lbnRlZCIpOw0KLQkJSVR5cGUgYmVhblR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5JbXBsZW1lbnRlZEJlYW4iKTsNCi0NCi0JCVNlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBTZWlJbXBsZW1lbnRhdGlvblZhbGlkYXRvcihzZWlUeXBlKTsNCi0JCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdG9yLnZhbGlkYXRlKGJlYW5UeXBlKTsNCi0JCWFzc2VydEVxdWFscygiU3RhdXMgbm90IGNvcnJlY3QiLCBJU3RhdHVzLk9LLCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFNFSUltcGxlbWVudGVkRXh0ZW5kZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCUlUeXBlIHNlaVR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5JSW1wbGVtZW50ZWRFeHRlbmRlZCIpOw0KLQkJSVR5cGUgYmVhblR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5JbXBsZW1lbnRlZEV4dGVuZGVkQmVhbiIpOw0KLQ0KLQkJU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFNlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yKHNlaVR5cGUpOw0KLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0b3IudmFsaWRhdGUoYmVhblR5cGUpOw0KLQkJYXNzZXJ0RXF1YWxzKCJTdGF0dXMgbm90IGNvcnJlY3QiLCBJU3RhdHVzLk9LLCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFNFSUltcGxlbWVudGVkTm9uUHVibGljTWV0aG9kcygpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJSVR5cGUgc2VpVHlwZSA9IGdldFRlc3RQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShQQ0sgKyAiLklJbXBsZW1lbnRlZCIpOw0KLQkJSVR5cGUgYmVhblR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5JbXBsZW1lbnRlZEJlYW4xIik7DQotDQotCQlTZWlJbXBsZW1lbnRhdGlvblZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3Ioc2VpVHlwZSk7DQotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZShiZWFuVHlwZSk7DQotCQlhc3NlcnRFcXVhbHMoIlN0YXR1cyBub3QgY29ycmVjdCIsIElTdGF0dXMuRVJST1IsIHN0YXR1cy5nZXRTZXZlcml0eSgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U0VJSW1wbGVtZW50ZWRXcm9uZ0V4Y2VwdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCUlUeXBlIHNlaVR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5JRXhjZXB0aW9uc1VzZWQiKTsNCi0JCUlUeXBlIGJlYW5UeXBlID0gZ2V0VGVzdFByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKFBDSyArICIuRXhjZXB0aW9uc1VzZWRCZWFuIik7DQotDQotCQlTZWlJbXBsZW1lbnRhdGlvblZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3Ioc2VpVHlwZSk7DQotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZShiZWFuVHlwZSk7DQotCQlhc3NlcnRFcXVhbHMoIlN0YXR1cyBub3QgY29ycmVjdCIsIElTdGF0dXMuRVJST1IsIHN0YXR1cy5nZXRTZXZlcml0eSgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U0VJSW1wbGVtZW50ZWRSaWdodEV4Y2VwdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCUlUeXBlIHNlaVR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5JRXhjZXB0aW9uc1VzZWQiKTsNCi0JCUlUeXBlIGJlYW5UeXBlID0gZ2V0VGVzdFByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKFBDSyArICIuRXhjZXB0aW9uc1VzZWRCZWFuMSIpOw0KLQ0KLQkJU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFNlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yKHNlaVR5cGUpOw0KLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0b3IudmFsaWRhdGUoYmVhblR5cGUpOw0KLQkJYXNzZXJ0RXF1YWxzKCJTdGF0dXMgbm90IGNvcnJlY3QiLCBJU3RhdHVzLk9LLCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvdmFsaWRhdGlvbi9TZWlWYWxpZGF0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy92YWxpZGF0aW9uL1NlaVZhbGlkYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGFlZTZkMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy92YWxpZGF0aW9uL1NlaVZhbGlkYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5TZWlWYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLQ0KLS8qKg0KLSAqIENsYXNzIHRlc3Rpbmcge0BsaW5rIFNlaVZhbGlkYXRvcn0NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFNlaVZhbGlkYXRvclRlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLnRlc3RzIjsNCi0NCi0JcHJpdmF0ZSBTZWlWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFNlaVZhbGlkYXRvcigpOw0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KCJzcmMiLCBQQ0spOw0KLQkJY3JlYXRlQ2xhc3NlcygibW9jay9TRUlUZXN0cy5zcmMiKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGVzdHMgaW5jb3JyZWN0IGludGVyZmFjZSBkZWNsYXJhdGlvbnMNCi0JICogDQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0VXNlSW5jb3JyZWN0U0VJKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlJVHlwZSBzZWlUeXBlID0gZ2V0VGVzdFByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKFBDSyArICIuU0VJSXNDbGFzcyIpOw0KLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0b3IudmFsaWRhdGUoc2VpVHlwZSk7DQotDQotCQlhc3NlcnRFcXVhbHMoIlNldmVyaXR5IG5vdCBjb3JyZWN0Iiwgc3RhdHVzLmdldFNldmVyaXR5KCksIElTdGF0dXMuRVJST1IpOw0KLQkJYXNzZXJ0VHJ1ZSgiTWVzc2FnZSBpcyBtaXNzaW5nIiwgc3RhdHVzLmdldE1lc3NhZ2UoKS50cmltKCkubGVuZ3RoKCkgPiAwKTsNCi0NCi0JCS8vIHRlc3RVc2VCaW5hcnlJbnRlcmZhY2VGb3JTRUkNCi0JCXNlaVR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoImphdmEudXRpbC5MaXN0Iik7DQotCQlzdGF0dXMgPSB2YWxpZGF0b3IudmFsaWRhdGUoc2VpVHlwZSk7DQotDQotCQlhc3NlcnRFcXVhbHMoIlNldmVyaXR5IG5vdCBjb3JyZWN0Iiwgc3RhdHVzLmdldFNldmVyaXR5KCksIElTdGF0dXMuRVJST1IpOw0KLQkJYXNzZXJ0VHJ1ZSgiTWVzc2FnZSBpcyBtaXNzaW5nIiwgc3RhdHVzLmdldE1lc3NhZ2UoKS50cmltKCkubGVuZ3RoKCkgPiAwKTsNCi0NCi0JCXNlaVR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5TRUlJc0NsYXNzLkludGVybmFsU2VpIik7DQotCQlzdGF0dXMgPSB2YWxpZGF0b3IudmFsaWRhdGUoc2VpVHlwZSk7DQotDQotCQlhc3NlcnRFcXVhbHMoIlNldmVyaXR5IG5vdCBjb3JyZWN0Iiwgc3RhdHVzLmdldFNldmVyaXR5KCksIElTdGF0dXMuRVJST1IpOw0KLQkJYXNzZXJ0VHJ1ZSgiTWVzc2FnZSBpcyBtaXNzaW5nIiwgc3RhdHVzLmdldE1lc3NhZ2UoKS50cmltKCkubGVuZ3RoKCkgPiAwKTsNCi0NCi0JCXNlaVR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5TRUlOb3RQdWJsaWMiKTsNCi0JCXN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZShzZWlUeXBlKTsNCi0NCi0JCWFzc2VydEVxdWFscygiU2V2ZXJpdHkgbm90IGNvcnJlY3QiLCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSwgSVN0YXR1cy5FUlJPUik7DQotCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGlzIG1pc3NpbmciLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLnRyaW0oKS5sZW5ndGgoKSA+IDApOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUZXN0cyBpbmNvcnJlY3QgaW50ZXJmYWNlIG1ldGhkcw0KLQkgKiANCi0JICogQHRocm93cyBFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RVc2VJbmNvcnJlY3RTZWlNZXRob2RzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlJVHlwZSBzZWlUeXBlID0gZ2V0VGVzdFByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKFBDSyArICIuU0VJSW5jb3JyZWN0TWV0aG9kcyIpOw0KLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0b3IudmFsaWRhdGUoc2VpVHlwZSk7DQotDQotCQlhc3NlcnRFcXVhbHMoIlNldmVyaXR5IG5vdCBjb3JyZWN0Iiwgc3RhdHVzLmdldFNldmVyaXR5KCksIElTdGF0dXMuRVJST1IpOw0KLQkJYXNzZXJ0VHJ1ZSgiTWVzc2FnZSBpcyBtaXNzaW5nIiwgc3RhdHVzLmdldE1lc3NhZ2UoKS50cmltKCkubGVuZ3RoKCkgPiAwKTsNCi0NCi0JCXNlaVR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5TRUlFeHRlbmRzU2VpV2l0aEluY29ycmVjdE1ldGhvZHMiKTsNCi0JCXN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZShzZWlUeXBlKTsNCi0NCi0JCWFzc2VydEVxdWFscygiU2V2ZXJpdHkgbm90IGNvcnJlY3QiLCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSwgSVN0YXR1cy5FUlJPUik7DQotCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGlzIG1pc3NpbmciLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLnRyaW0oKS5sZW5ndGgoKSA+IDApOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RVc2VDb3JyZWN0U2VpKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlJVHlwZSBzZWlUeXBlID0gZ2V0VGVzdFByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKFBDSyArICIuSUltcGxlbWVudGVkIik7DQotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZShzZWlUeXBlKTsNCi0NCi0JCWFzc2VydEVxdWFscygiU2V2ZXJpdHkgbm90IGNvcnJlY3QiLCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSwgSVN0YXR1cy5PSyk7DQotCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGlzIG5vdCBlbXB0eSIsIHN0YXR1cy5nZXRNZXNzYWdlKCkudHJpbSgpLmxlbmd0aCgpID09IDApOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL3ZhbGlkYXRpb24vbW9jay9FbmRwb2ludC5zcmMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy92YWxpZGF0aW9uL21vY2svRW5kcG9pbnQuc3JjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTc1MDUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL3ZhbGlkYXRpb24vbW9jay9FbmRwb2ludC5zcmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLXB1YmxpYyBjbGFzcyBFbmRwb2ludA0KLXsNCi0JcHVibGljIEVuZHBvaW50KCkgew0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHVzZVZvaWQoKSB7DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCBwcml2YXRlTWV0aG9kKCkgew0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBwcm90ZWN0ZWRNZXRob2QoKSB7DQotCX0JDQotCQ0KLQlwdWJsaWMgaW50W10gdXNlQXJyYXlBc1JldHVyblZhbHVlKCkgewkNCi0JCXJldHVybiBuZXcgaW50WzBdOw0KLQl9DQotCQ0KLQlwdWJsaWMgaW50IHVzZUFycmF5QXNQYXJhbShpbnQgW10gYXJyKSB7CQ0KLQkJcmV0dXJuIDA7DQotCX0JDQotCQ0KLQlwdWJsaWMgamF2YS51dGlsLkxpc3Q8U3RyaW5nPiB1c2VHZW5lcmljc0FzKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXB1YmxpYyBNeU1hcDxTdHJpbmcsIFN0cmluZz4gdXNlTXlNYXAoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHVibGljIGphdmEudXRpbC5MaXN0PD8+IHVzZUdlbmVyaWNzQXMoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQkNCi0JDQotCXB1YmxpYyBpbnQgdXNlTURBcnJheUFzUGFyYW0oaW50IFtdW11bXSBhcnIpIHsJDQotCQlyZXR1cm4gMDsNCi0JfQkNCi0JDQotCXB1YmxpYyBMaXN0PExpc3Q8TWFwPFN0cmluZywgU3RyaW5nPj4+IHVzZU5lc3RlZEdlbmVyaWNzKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0JCQ0KLQkNCi0JcHVibGljIExpc3Q8PyBleHRlbmRzIFN0cmluZz4gdXNlRXh0ZW5kc0luR2VuZXJpY3MoKSB7CQ0KLQkJcmV0dXJuIG51bGw7DQotCX0JCQ0KLQkNCi0JcHVibGljIExpc3Q8PyBzdXBlciBTdHJpbmc+IHVzZVN1cGVySW5HZW5lcmljcygpIHsJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQkJDQotCQ0KLQlwdWJsaWMgTGlzdDxMaXN0PFN0cmluZz4+IHVzZVN1cGVySW5HZW5lcmljc0FzUGFyYW0oTGlzdDw/IHN1cGVyIFN0cmluZz4gcGFyYW0pIHsNCi0JCXJldHVybiBudWxsOw0KLQl9CQkNCi0JDQotCXB1YmxpYyBMaXN0PEJhc2VJbXBsZW1lbnRlZD4gdXNlSW1wbGVtZW50ZWRCYXNlSW5HZW5lcmljcygpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwdWJsaWMgamF2YXguY3J5cHRvLkNpcGhlciB1c2VVbnN1cHBvcnRlZEphdmFUeXBlKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0JDQotCQ0KLQlwdWJsaWMgamF2YS5uZXQuVVJJIHVzZVN1cHBvcnRlZEphdmFUeXBlKCkgew0KLQl9DQotCQ0KLQlwdWJsaWMgSW1wbGVtZW50c1JlbW90ZSB1c2VJbXBsZW1lbnRzUmVtb3RlKCkgew0KLQl9DQotCQ0KLQlwdWJsaWMgTm9EZWZhdWx0Q29uc3RydWN0b3IgdXNlTm9EZWZhdWx0Q29uc3RydWN0b3IoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHVibGljIEhhc0luYWRtaXNhYmxlSW5uZXJDbGFzcyB1c2VIYXNJbmFkbWlzYWJsZUlubmVyQ2xhc3MoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdXNlVXNlc1Vuc3VwcG9ydGVkQXNGaWVsZChVc2VzVW5zdXBwb3J0ZWRBc0ZpZWxkIHBhcmFtKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JLy8gSW1wbGVtZW50YXRpb24gY2FzZXMNCi0JcHVibGljIEJhc2VOb3RJbXBsZW1lbnRlZCB1c2VOb3RJbXBsZW1lbnRlZEFic3RyYWN0Q2xhc3MoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHVibGljIEJhc2VJbXBsZW1lbnRlZCB1c2VJbXBsZW1lbnRlZEFic3RyYWN0Q2xhc3MoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHVibGljIEludGVyZmFjZUltcGxlbWVudGVkIHVzZUludGVyZmFjZSgpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwdWJsaWMgRW51bVR5cGUgdXNlRW51bSgpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9CQ0KLQkNCi0JLy8gSW5oZXJpdGFuY2UgY2FzZXMNCi0JcHVibGljIHZvaWQgdXNlTXVsdHlJbmhlcml0YW5jZVVzZUNsYXNzKE11bHR5SW5oZXJpdGFuY2VVc2VDbGFzcyBwYXJhbSkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXB1YmxpYyBTdXBwb3J0ZWRNdWx0eUluaGVyaXRhbmNlV2l0aEJhc2VDbGFzcyB1c2VTdXBwb3J0ZWRNdWx0eUluaGVyaXRhbmNlV2l0aEJhc2VDbGFzcygpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwdWJsaWMgU3VwcG9ydGVkTXVsdHlJbmhlcml0YW5jZVdpdGhJbnRlcmZhY2UgdXNlU3VwcG9ydGVkTXVsdHlJbmhlcml0YW5jZVdpdGhJbnRlcmZhY2UoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQkNCi0NCi0JLy8gVXNpbmcgZXhjZXB0aW9ucyBtZXRob2RzCQ0KLQlwdWJsaWMgdm9pZCB1c2VFeGNlcHRpb24oKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7DQotCX0JDQotCQ0KLQlwdWJsaWMgdm9pZCB1c2VDdXN0b21FeGNlcHRpb24oKSB0aHJvd3MgQ3VzdG9tRXhjZXB0aW9uIHsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy92YWxpZGF0aW9uL21vY2svUnVudGltZUNsYXNzZXMuc3JjIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvdmFsaWRhdGlvbi9tb2NrL1J1bnRpbWVDbGFzc2VzLnNyYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzQ3NjU3Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy92YWxpZGF0aW9uL21vY2svUnVudGltZUNsYXNzZXMuc3JjCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLQ0KLSNJbXBsZW1lbnRzUmVtb3RlDQotcHVibGljIGNsYXNzIEltcGxlbWVudHNSZW1vdGUgaW1wbGVtZW50cyBqYXZhLnJtaS5SZW1vdGUNCi17DQotfQ0KLQ0KLSNOb0RlZmF1bHRDb25zdHJ1Y3Rvcg0KLXB1YmxpYyBjbGFzcyBOb0RlZmF1bHRDb25zdHJ1Y3RvciBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlDQotew0KLQlwdWJsaWMgTm9EZWZhdWx0Q29uc3RydWN0b3IoU3RyaW5nIHBhcmFtKSB7DQotCX0NCi19DQotDQotI05vRGVmYXVsdENvbnN0cnVjdG9yUHJpdmF0ZUNvbnN0cnVjdG9ycw0KLXB1YmxpYyBjbGFzcyBOb0RlZmF1bHRDb25zdHJ1Y3RvclByaXZhdGVDb25zdHJ1Y3RvcnMgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQ0KLXsNCi0JcHJpdmF0ZSBOb0RlZmF1bHRDb25zdHJ1Y3RvclByaXZhdGVDb25zdHJ1Y3RvcnMoU3RyaW5nIHBhcmFtKSB7DQotCX0NCi19DQotDQotI0hhc0luYWRtaXNhYmxlSW5uZXJDbGFzcw0KLXB1YmxpYyBjbGFzcyBIYXNJbmFkbWlzYWJsZUlubmVyQ2xhc3MgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSANCi17DQotCXB1YmxpYyBjbGFzcyBJbm5lckNsYXNzIHsJDQotCX0NCi19DQotDQotI1VzZXNVbnN1cHBvcnRlZEFzRmllbGQNCi1wdWJsaWMgY2xhc3MgVXNlc1Vuc3VwcG9ydGVkQXNGaWVsZCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlDQotew0KLQlwdWJsaWMgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkIGZpZWxkOw0KLX0NCi0NCi0jVXNlc1Vuc3VwcG9ydGVkQXNQcm9wZXJ0eQ0KLXB1YmxpYyBjbGFzcyBVc2VzVW5zdXBwb3J0ZWRBc1Byb3BlcnR5IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUNCi17DQotCXB1YmxpYyBVc2VzVW5zdXBwb3J0ZWRBc1Byb3BlcnR5KCkgew0KLQl9CQ0KLQkNCi0JcHVibGljIE5vRGVmYXVsdENvbnN0cnVjdG9yW10gZ2V0UmVjb3JkKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi19DQotDQotI1VzZXNVbnN1cHBvcnRlZEluTWV0aG9kDQotcHVibGljIGNsYXNzIFVzZXNVbnN1cHBvcnRlZEluTWV0aG9kDQotew0KLQlwdWJsaWMgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkIFtdW10gb3RoZXJNZXRob2QoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQkNCi0JDQotCXB1YmxpYyBqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQgW11bXSB2YWxpZGF0ZSgpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotfQ0KLQ0KLSNVc2VzVW5zdXBwb3J0ZWRJblRyYW5zaWVudE1ldGhvZA0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFRyYW5zaWVudDsNCi1wdWJsaWMgY2xhc3MgVXNlc1Vuc3VwcG9ydGVkSW5UcmFuc2llbnRNZXRob2QNCi17DQotCUBYbWxUcmFuc2llbnQNCi0JcHVibGljIGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZCBnZXRMb2dSZWNvcmQoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLX0NCi0NCi0jV2ViRmF1bHRDbGFzcw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7DQotQFdlYkZhdWx0DQotcHVibGljIGNsYXNzIFdlYkZhdWx0Q2xhc3MNCi17DQotCXB1YmxpYyBXZWJGYXVsdENsYXNzKFN0cmluZyBhKSB7DQotCX0NCi19DQotDQotI1htbFR5cGVDbGFzcw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotQFhtbFR5cGUNCi1wdWJsaWMgY2xhc3MgWG1sVHlwZUNsYXNzDQotew0KLQlwdWJsaWMgWG1sVHlwZUNsYXNzKFN0cmluZyBhKSB7DQotCX0NCi19DQotDQotI0Jhc2VOb3RJbXBsZW1lbnRlZA0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlTm90SW1wbGVtZW50ZWQNCi17DQotfQ0KLQ0KLSNCYXNlSW1wbGVtZW50ZWROb3RDb3JyZWN0bHkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUltcGxlbWVudGVkTm90Q29ycmVjdGx5DQotew0KLX0NCi0NCi0jQmFzZUltcGxlbWVudGVkTm90Q29ycmVjdGx5RXh0ZW5kb3INCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUltcGxlbWVudGVkTm90Q29ycmVjdGx5RXh0ZW5kb3INCi17DQotfQ0KLQ0KLSNCYXNlSW1wbGVtZW50ZWROb3RDb3JyZWN0bHlJbXBsZW1lbnRvcg0KLXB1YmxpYyBjbGFzcyBCYXNlSW1wbGVtZW50ZWROb3RDb3JyZWN0bHlJbXBsZW1lbnRvciBleHRlbmRzIEJhc2VJbXBsZW1lbnRlZE5vdENvcnJlY3RseUV4dGVuZG9yDQotew0KLX0NCi0NCi0jQmFzZUltcGxlbWVudGVkDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VJbXBsZW1lbnRlZA0KLXsNCi19DQotDQotI0Jhc2VJbXBsZW1lbnRlZEltcGxlbWVudG9yDQotcHVibGljIGNsYXNzIEJhc2VJbXBsZW1lbnRlZEltcGxlbWVudG9yIGV4dGVuZHMgQmFzZUltcGxlbWVudGVkIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUNCi17DQotfQ0KLQ0KLSNJbnRlcmZhY2VOb3RJbXBsZW1lbnRlZA0KLXB1YmxpYyBpbnRlcmZhY2UgSW50ZXJmYWNlTm90SW1wbGVtZW50ZWQNCi17DQotfQ0KLQ0KLSNJbnRlcmZhY2VJbXBsZW1lbnRlZA0KLXB1YmxpYyBpbnRlcmZhY2UgSW50ZXJmYWNlSW1wbGVtZW50ZWQNCi17DQotfQ0KLQ0KLSNJbnRlcmZhY2VJbXBsZW1lbnRlZEltcGxlbWVudG9yDQotcHVibGljIGNsYXNzIEludGVyZmFjZUltcGxlbWVudGVkSW1wbGVtZW50b3IgaW1wbGVtZW50cyBJbnRlcmZhY2VJbXBsZW1lbnRlZCwgamF2YS5pby5TZXJpYWxpemFibGUNCi17DQotfQ0KLQ0KLSNFbnVtVHlwZQ0KLXB1YmxpYyBlbnVtIEVudW1UeXBlIHsNCi0JU3RyaW5nVHlwZSwNCi0JSW50VHlwZSwNCi0JRmxvYXRUeXBlDQotfQ0KLQ0KLSNNdWx0eUluaGVyaXRhbmNlVXNlQ2xhc3MNCi1wdWJsaWMgY2xhc3MgTXVsdHlJbmhlcml0YW5jZVVzZUNsYXNzIGV4dGVuZHMgQmFzZUltcGxlbWVudGVkIGltcGxlbWVudHMgSW50ZXJmYWNlSW1wbGVtZW50ZWQsIGphdmEuaW8uU2VyaWFsaXphYmxlDQotew0KLX0NCi0NCi0jTXVsdHlJbmhlcml0YW5jZVVzZUludGVyZmFjZXMNCi1wdWJsaWMgY2xhc3MgTXVsdHlJbmhlcml0YW5jZVVzZUludGVyZmFjZXMgaW1wbGVtZW50cyBJbnRlcmZhY2VJbXBsZW1lbnRlZCwgSW50ZXJmYWNlTm90SW1wbGVtZW50ZWQNCi17DQotfQ0KLQ0KLSNTdXBwb3J0ZWRNdWx0eUluaGVyaXRhbmNlV2l0aEJhc2VDbGFzcw0KLXB1YmxpYyBjbGFzcyBTdXBwb3J0ZWRNdWx0eUluaGVyaXRhbmNlV2l0aEJhc2VDbGFzcyBleHRlbmRzIEJhc2VJbXBsZW1lbnRlZCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlLCBqYXZhLmxhbmcuQ2xvbmVhYmxlLCBqYXZhLmxhbmcuQ29tcGFyYWJsZSB7DQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBhcmcwKSB7DQotCQlyZXR1cm4gMDsNCi0JfQ0KLX0NCi0NCi0jU3VwcG9ydGVkTXVsdHlJbmhlcml0YW5jZVdpdGhJbnRlcmZhY2UNCi1wdWJsaWMgY2xhc3MgU3VwcG9ydGVkTXVsdHlJbmhlcml0YW5jZVdpdGhJbnRlcmZhY2UgaW1wbGVtZW50cyBJbnRlcmZhY2VJbXBsZW1lbnRlZCwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZSB7DQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBhcmcwKSB7DQotCQlyZXR1cm4gMDsNCi0JfQ0KLX0NCi0NCi0jQ29udGFpbnNMaXN0DQotcHVibGljIGNsYXNzIENvbnRhaW5zTGlzdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsNCi0JcHVibGljIGphdmEudXRpbC5NYXA8U3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxTdHJpbmc+PiBwYXJhbTsNCi19DQotDQotI0NvbnRhaW5zTm90U3VwcG9ydGVkSW5MaXN0DQotcHVibGljIGNsYXNzIENvbnRhaW5zTm90U3VwcG9ydGVkSW5MaXN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgew0KLQlwdWJsaWMgamF2YS51dGlsLkxpc3Q8amF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkPiBwYXJhbTsNCi19DQotDQotI0NvbnRhaW5zUXVvdGVJbkxpc3QNCi1wdWJsaWMgY2xhc3MgQ29udGFpbnNRdW90ZUluTGlzdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsNCi0JcHVibGljIGphdmEudXRpbC5MaXN0PD8+IHBhcmFtOw0KLX0NCi0NCi0jQ29udGFpbnNFeHRlbmRzSW5MaXN0DQotcHVibGljIGNsYXNzIENvbnRhaW5zRXh0ZW5kc0luTGlzdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsNCi0JcHVibGljIGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBTdHJpbmc+IHBhcmFtOw0KLX0NCi0NCi0jQ29udGFpbnNTdXBlckluTGlzdA0KLXB1YmxpYyBjbGFzcyBDb250YWluc1N1cGVySW5MaXN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgew0KLQlwdWJsaWMgamF2YS51dGlsLkxpc3Q8PyBzdXBlciAgU3RyaW5nPiBwYXJhbTsNCi19DQotDQotI0NpcmN1bGFyQXNQYXJhbUENCi1wdWJsaWMgY2xhc3MgQ2lyY3VsYXJBc1BhcmFtQSBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIA0KLXsNCi0JcHVibGljIENpcmN1bGFyQXNQYXJhbUIgY0I7DQotfQ0KLQ0KLSNDaXJjdWxhckFzUGFyYW1CDQotcHVibGljIGNsYXNzIENpcmN1bGFyQXNQYXJhbUIgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSANCi17DQotCXB1YmxpYyBDaXJjdWxhckFzUGFyYW1BIGNBOw0KLX0NCi0NCi0jQ2lyY3VsYXJBc1JldHVyblZhbHVlQQ0KLXB1YmxpYyBjbGFzcyBDaXJjdWxhckFzUmV0dXJuVmFsdWVBIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgDQotew0KLQlwdWJsaWMgQ2lyY3VsYXJBc1JldHVyblZhbHVlQiByZXR1cm5DQigpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotfQ0KLQ0KLSNDaXJjdWxhckFzUmV0dXJuVmFsdWVCDQotcHVibGljIGNsYXNzIENpcmN1bGFyQXNSZXR1cm5WYWx1ZUIgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSANCi17DQotCXB1YmxpYyBDaXJjdWxhckFzUmV0dXJuVmFsdWVBIHJldHVybkNBKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi19DQotDQotI0NpcmN1bGFyQXNNaXhlZFBhcmFtUmV0dXJuVmFsdWVBDQotcHVibGljIGNsYXNzIENpcmN1bGFyQXNNaXhlZFBhcmFtUmV0dXJuVmFsdWVBIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgDQotew0KLQlwdWJsaWMgQ2lyY3VsYXJBc01peGVkUGFyYW1SZXR1cm5WYWx1ZUIgY0I7DQotfQ0KLQ0KLSNDaXJjdWxhckFzTWl4ZWRQYXJhbVJldHVyblZhbHVlQg0KLXB1YmxpYyBjbGFzcyBDaXJjdWxhckFzTWl4ZWRQYXJhbVJldHVyblZhbHVlQiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIA0KLXsNCi0JcHVibGljIENpcmN1bGFyQXNNaXhlZFBhcmFtUmV0dXJuVmFsdWVBIHJldHVybkNBKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHVzZUNhKENpcmN1bGFyQXNNaXhlZFBhcmFtUmV0dXJuVmFsdWVBIGNBKSB7DQotCX0JDQotfQ0KLQ0KLSNDdXN0b21FeGNlcHRpb24NCi1wdWJsaWMgY2xhc3MgQ3VzdG9tRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbiBpbXBsZW1lbnRzIEludGVyZmFjZUltcGxlbWVudGVkDQotew0KLQlwdWJsaWMgQ3VzdG9tRXhjZXB0aW9uKCkgDQotCXsNCi0JCXN1cGVyKCk7DQotCX0NCi19DQotDQotI015U2V0DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotcHVibGljIGNsYXNzIE15U2V0PFQ+IGltcGxlbWVudHMgU2V0PFQ+IA0KLXsNCi0JcHVibGljIGJvb2xlYW4gYWRkKFQgbykgeyByZXR1cm4gZmFsc2U7IH0NCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIFQ+IGMpIHsgcmV0dXJuIGZhbHNlOyB9DQotCXB1YmxpYyB2b2lkIGNsZWFyKCkge30NCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsJcmV0dXJuIGZhbHNlOyB9DQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgeyByZXR1cm4gZmFsc2U7IH0NCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsgcmV0dXJuIGZhbHNlOyB9DQotCXB1YmxpYyBJdGVyYXRvcjxUPiBpdGVyYXRvcigpIHsgcmV0dXJuIG51bGw7IH0NCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7IHJldHVybiBmYWxzZTt9DQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpIHsgcmV0dXJuIGZhbHNlOyB9DQotCXB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsgcmV0dXJuIGZhbHNlOyB9DQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsJcmV0dXJuIDA7IH0NCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7CXJldHVybiBudWxsOyB9DQotCXB1YmxpYyA8VD4gVFtdIHRvQXJyYXkoVFtdIGEpIHsJcmV0dXJuIG51bGw7fQ0KLX0NCi0NCi0jTXlNYXANCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotcHVibGljIGNsYXNzIE15TWFwPEssIFY+IGltcGxlbWVudHMgTWFwPEssIFY+DQotew0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHt9DQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsgcmV0dXJuIGZhbHNlOyB9DQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7IHJldHVybiBmYWxzZTsgfQ0KLQlwdWJsaWMgU2V0PGphdmEudXRpbC5NYXAuRW50cnk8SywgVj4+IGVudHJ5U2V0KCkgeyByZXR1cm4gbnVsbDsJfQ0KLQlwdWJsaWMgViBnZXQoT2JqZWN0IGtleSkgeyByZXR1cm4gbnVsbDsgfQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeyByZXR1cm4gZmFsc2U7IH0NCi0JcHVibGljIFNldDxLPiBrZXlTZXQoKSB7IHJldHVybiBudWxsOyB9DQotCXB1YmxpYyBWIHB1dChLIGtleSwgViB2YWx1ZSkgeyByZXR1cm4gbnVsbDsgfQ0KLQlwdWJsaWMgdm9pZCBwdXRBbGwoTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gdCkge30NCi0JcHVibGljIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsgcmV0dXJuIG51bGw7IH0NCi0JcHVibGljIGludCBzaXplKCkgewlyZXR1cm4gMDsgfQ0KLQlwdWJsaWMgQ29sbGVjdGlvbjxWPiB2YWx1ZXMoKSB7IHJldHVybiBudWxsOyB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL3ZhbGlkYXRpb24vbW9jay9TRUlUZXN0cy5zcmMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy92YWxpZGF0aW9uL21vY2svU0VJVGVzdHMuc3JjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MGZiMTk2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL3ZhbGlkYXRpb24vbW9jay9TRUlUZXN0cy5zcmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotI1NFSUlzQ2xhc3MNCi1wdWJsaWMgY2xhc3MgU0VJSXNDbGFzcw0KLXsNCi0JcHVibGljIFNFSUlzQ2xhc3MoU3RyaW5nIGEpIHsNCi0JfQ0KLQkNCi0JcHVibGljIGludGVyZmFjZSBJbnRlcm5hbFNlaSB7DQotCX0NCi19DQotDQotI1NFSU5vdFB1YmxpYw0KLWludGVyZmFjZSBTRUlOb3RQdWJsaWMNCi17DQotfQ0KLQ0KLSNTRUlJbmNvcnJlY3RNZXRob2RzDQotcHVibGljIGludGVyZmFjZSBTRUlJbmNvcnJlY3RNZXRob2RzDQotew0KLQlwdWJsaWMgU0VJSXNDbGFzcyBtZXRob2QxKCk7DQotfQ0KLQ0KLSNTRUlFeHRlbmRzU2VpV2l0aEluY29ycmVjdE1ldGhvZHMNCi1wdWJsaWMgaW50ZXJmYWNlIFNFSUV4dGVuZHNTZWlXaXRoSW5jb3JyZWN0TWV0aG9kcyBleHRlbmRzIFNFSUluY29ycmVjdE1ldGhvZHMNCi17DQotCXB1YmxpYyBTdHJpbmcgbWV0aG9kMigpOw0KLX0NCi0NCi0NCi0jSU5vdEltcGxlbWVudGVkDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLXB1YmxpYyBpbnRlcmZhY2UgSU5vdEltcGxlbWVudGVkDQotew0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IG1ldGhvZChTdHJpbmcgcGFyYW0pIHRocm93cyBFeGNlcHRpb247DQotfQ0KLQ0KLSNOb3RJbXBsZW1lbnRlZE1ldGhvZFBhcmFtc0JlYW4NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotcHVibGljIGNsYXNzIE5vdEltcGxlbWVudGVkTWV0aG9kUGFyYW1zQmVhbg0KLXsNCi0JcHVibGljIFN0cmluZyBtZXRob2QoU3RyaW5nIGEpIHt9DQotCQ0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IG1ldGhvZChpbnQgYSkge30NCi0NCi0JcHVibGljIExpc3Q8U3RyaW5nPiBtZXRob2QoU3RyaW5nIHBhcmFtLCBpbnQgYSkge30NCi0JDQotCXB1YmxpYyB2b2lkIG1ldGhvZDEoTWFwPFN0cmluZywgTGlzdD4gcCkge30NCi19DQotDQotI05vdEltcGxlbWVudGVkTWV0aG9kRXhjZXB0aW9uc0JlYW4NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotcHVibGljIGNsYXNzIE5vdEltcGxlbWVudGVkTWV0aG9kRXhjZXB0aW9uc0JlYW4NCi17DQotCXB1YmxpYyBMaXN0PFN0cmluZz4gbWV0aG9kKFN0cmluZyBwYXJhbSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi19DQotDQotI0lJbXBsZW1lbnRlZA0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1wdWJsaWMgaW50ZXJmYWNlIElJbXBsZW1lbnRlZA0KLXsNCi0JcHVibGljIExpc3Q8U3RyaW5nPiBtZXRob2QoU3RyaW5nIHBhcmFtKTsNCi0JDQotCXB1YmxpYyB2b2lkIG1ldGhvZDEoTWFwPFN0cmluZywgTGlzdD4gcCk7DQotfQ0KLQ0KLSNJbXBsZW1lbnRlZEJlYW5CYXNlDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLXB1YmxpYyBjbGFzcyBJbXBsZW1lbnRlZEJlYW5CYXNlIHsNCi0JcHVibGljIExpc3Q8U3RyaW5nPiBtZXRob2QoU3RyaW5nIHBhcmFtKSB7IHJldHVybiBudWxsOyB9DQotfQ0KLQ0KLSNCZWFuSW1wbGVtZW50c1NlaQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1wdWJsaWMgY2xhc3MgQmVhbkltcGxlbWVudHNTZWkgZXh0ZW5kcyBJbXBsZW1lbnRlZEJlYW5CYXNlIGltcGxlbWVudHMgSUltcGxlbWVudGVkIHsNCi0JcHVibGljIHZvaWQgbWV0aG9kMShNYXA8U3RyaW5nLCBMaXN0PiBwKSB7fQ0KLX0NCi0NCi0jSW1wbGVtZW50ZWRCZWFuDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLXB1YmxpYyBjbGFzcyBJbXBsZW1lbnRlZEJlYW4gZXh0ZW5kcyBJbXBsZW1lbnRlZEJlYW5CYXNlIHsNCi0JcHVibGljIHZvaWQgbWV0aG9kMShNYXA8U3RyaW5nLCBMaXN0PiBwKSB7fQ0KLX0NCi0NCi0NCi0jSUltcGxlbWVudGVkRXh0ZW5kZWQNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotcHVibGljIGludGVyZmFjZSBJSW1wbGVtZW50ZWRFeHRlbmRlZCBleHRlbmRzIElJbXBsZW1lbnRlZA0KLXsNCi0JcHVibGljIGludCBbXSBtZXRob2QyKFN0cmluZyBwMSwgZmxvYXQgcDIpOw0KLQkNCi0JcHVibGljIFN0cmluZyBbXVtdIG1ldGhvZDMoZG91YmxlIHAxKTsNCi19DQotDQotI0ltcGxlbWVudGVkRXh0ZW5kZWRCZWFuDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLXB1YmxpYyBjbGFzcyBJbXBsZW1lbnRlZEV4dGVuZGVkQmVhbg0KLXsNCi0JcHVibGljIExpc3Q8U3RyaW5nPiBtZXRob2QoU3RyaW5nIHBhcmFtKSB7IHJldHVybiBudWxsOyB9DQotCQ0KLQlwdWJsaWMgdm9pZCBtZXRob2QxKE1hcDxTdHJpbmcsIExpc3Q+IHApIHt9DQotCQ0KLQlwdWJsaWMgaW50IFtdIG1ldGhvZDIoU3RyaW5nIHAxLCBmbG9hdCBwMikgeyByZXR1cm4gbnVsbDsgfQ0KLQkNCi0JcHVibGljIFN0cmluZyBbXVtdIG1ldGhvZDMoZG91YmxlIHAxKSB7IHJldHVybiBudWxsOyB9DQotfQ0KLQ0KLSNJbXBsZW1lbnRlZEJlYW4xDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLS8vIHNob3VsZCBpbXBsZW1lbnQgSUltcGxlbWVudGVkDQotcHVibGljIGNsYXNzIEltcGxlbWVudGVkQmVhbjEgew0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IG1ldGhvZChTdHJpbmcgcGFyYW0pIHsgcmV0dXJuIG51bGw7IH0NCi0JDQotCXByb3RlY3RlZCB2b2lkIG1ldGhvZDEoTWFwPFN0cmluZywgTGlzdD4gcCkge30NCi19DQotDQotI015RXhjZXB0aW9uDQotcHVibGljIGNsYXNzIE15RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsNCi19DQotDQotI0lFeGNlcHRpb25zVXNlZA0KLXB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VwdGlvbnNVc2VkIHsNCi0JcHVibGljIHZvaWQgbWV0aG9kKCkgdGhyb3dzIE15RXhjZXB0aW9uOwkNCi0JcHVibGljIHZvaWQgbWV0aG9kMSgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uOw0KLX0NCi0NCi0jRXhjZXB0aW9uc1VzZWRCZWFuDQotcHVibGljIGNsYXNzIEV4Y2VwdGlvbnNVc2VkQmVhbiB7DQotCXB1YmxpYyB2b2lkIG1ldGhvZCgpIHt9DQotCXB1YmxpYyB2b2lkIG1ldGhvZDEoKSB0aHJvd3MgRXhjZXB0aW9uIHt9CQ0KLX0NCi0NCi0jRXhjZXB0aW9uc1VzZWRCZWFuMQ0KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25zVXNlZEJlYW4xIHsNCi0JcHVibGljIHZvaWQgbWV0aG9kKCkgdGhyb3dzIG9yZy5lY2xpcHNlLnRlc3RzLk15RXhjZXB0aW9uIHt9DQotCXB1YmxpYyB2b2lkIG1ldGhvZDEoKSB0aHJvd3MgRXhjZXB0aW9uIHt9CQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMWE0MzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/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+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWUwNDg0ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI01vbiBKdWwgMjAgMTU6MjU6MzEgRUVTVCAyMDA5DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjUyN2M1Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMA0KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjANCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzDQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcg0KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQ0KLVJlcXVpcmUtQnVuZGxlOiBvcmcuam1vY2ssDQotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLA0KLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsDQotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLA0KLSBvcmcuZWNsaXBzZS51aSwNCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZywNCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscywNCi0gb3JnLmp1bml0DQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuYXNzZXJ0aW9ucywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5maWxlcywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jaywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay50ZXN0Y2FzZXMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam9icywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnRocmVhZGluZw0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiN2FjZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXVndXN0IDIwLCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzg4ZWZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4MzAzOTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1CdW5kbGUtTmFtZS4wPVV0aWxpdGllcyBmb3IgSlVuaXQgdGVzdHMgKEluY3ViYXRpb24pDQotQnVuZGxlLVZlbmRvci4wPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9JV2FpdENvbmRpdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9JV2FpdENvbmRpdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTA4ZThmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvSVdhaXRDb25kaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlsczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5hc3NlcnRpb25zLkNvbmRpdGlvbkNoZWNrRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSB3aGljaCBkZWZpbmVzIGEgY29uZGl0aW9uIHVwb24gd2hpY2ggdGhlIGV4ZWN1dGlvbiBjYW4gY29udGludWUgDQotICogQGF1dGhvciBEYW5haWwgQnJhbmVrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXYWl0Q29uZGl0aW9uDQotew0KLQkvKioNCi0JICogTWV0aG9kIHdoaWNoIGNoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gY29uZGl0aW9uIGlzIG1ldA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgdGhlIGNvbmRpdGlvbiBpcyBtZXQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UNCi0JICogQHRocm93cyBDb25kaXRpb25DaGVja0V4Y2VwdGlvbiB3aGVuIGltcGxlbWVudG9ycyBkZWNpZGUgdGhhdCB0aGV5IGNhbm5vdCBkZWFsIHdpdGggYSBnaXZlbiBleGNlcHRpb25hbCBzaXR1YXRpb24NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGNoZWNrQ29uZGl0aW9uKCkgdGhyb3dzIENvbmRpdGlvbkNoZWNrRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2Fzc2VydGlvbnMvQXNzZXJ0aW9ucy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9hc3NlcnRpb25zL0Fzc2VydGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2ZiOWZmNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2Fzc2VydGlvbnMvQXNzZXJ0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5hc3NlcnRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOw0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLklXYWl0Q29uZGl0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnRocmVhZGluZy5UZXN0Q29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsNCi0NCi0vKioNCi0gKiBVdGlsaXR5IGNsYXNzIHdoaWNoIHByb3ZpZGVzIG1ldGhvZHMgd2hpY2ggYXNzZXJ0IHRoYXQgYSBnaXZlbiBjb25kaXRpb24gaXMgbWV0LiBJZiBuZWNlc3NhcnksIG1ldGhvZHMgd2lsbCBibG9jayB0aGUgZXhlY3V0aW9uIG9mIHRoZSBjYWxsZXIgdW50aWwNCi0gKiB0aGUgY29uZGl0aW9uIGlzIG1ldCBmb3IgYSByZWFzb25hYmxlIHRpbWUuIElmIHRoZSBjb25kaXRpb25zIGlzIG5vdCBtZXQsIDxjb2RlPkFzc2VydC5mYWlsKCk8L2NvZGU+IGlzIGludm9rZWQNCi0gKiANCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBc3NlcnRpb25zDQotew0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX0NPTkRJVElPTl9DSEVDS1MgPSA1MDAwOw0KLQ0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU0xFRVBfVElNRU9VVCA9IDQyOw0KLQ0KLQkvKioNCi0JICogQXNzZXJ0cyB0aGF0IHdhaXRzIHNvbWUgdGltZSB1bnRpbCB0aGUgY29uZGl0aW9uIHNwZWNpZmllZCBpcyBtZXQuIElmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldCBhZnRlciBzb21lIHJlYXNvbmFibGUgdGltZSwgdGhlIG1ldGhvZCBjYWxscyBBc3NlcnQuZmFpbCgpICANCi0JICogQHBhcmFtIGNvbmRpdGlvbiB0aGUgY29uZGl0aW9uIHRvIGNoZWNrDQotCSAqIEBwYXJhbSBmYWlsTWVzc2FnZSB0aGUgbWVzc2FnZSB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byA8Y29kZT5Bc3NlcnQuZmFpbCgpPC9jb2RlPiB0aHVzIGluZGljYXRpbmcgYSB0ZXN0IGZhaWx1cmUNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0QXNzZXJ0KGZpbmFsIElXYWl0Q29uZGl0aW9uIGNvbmRpdGlvbiwgZmluYWwgU3RyaW5nIGZhaWxNZXNzYWdlKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQlpZiAoIXdhaXRGb3JDb25kaXRpb25Mb29wKGNvbmRpdGlvbikpDQotCQkJew0KLQkJCQlBc3NlcnQuZmFpbChmYWlsTWVzc2FnZSk7DQotCQkJfQ0KLQkJfSBjYXRjaCAoQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlmYWlsVXBvblRocm93YWJsZShlKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQmxvY2tzIHRoZSBleGVjdXRpb24gb2YgdGhlIGNhbGxlciB1bnRpbCB0aGUgPGNvZGU+Y29uZGl0aW9uPC9jb2RlPiBpcyBtZXQgb3IgTUFYX0NPTkRJVElPTl9DSEVDS1MgYXR0ZW1wdHMgaGF2ZSBiZWVuIHJlYWNoZWQuPGJyPg0KLQkgKiBUaGUgbWV0aG9kIGJlaGF2aW91ciBzbGlnaHRseSBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIG1ldGhvZCBpcyBpbnZva2VkIGZyb20gdGhlIFVJIHRocmVhZCBvciBub3QNCi0JICogPGxpPklmIHRoZSBjYWxsZXIgaXMgdGhlIFVJIHRocmVhZCwgYSBuZXcgbW9kYWwgY29udGV4dCB0aHJlYWQgaXMgc3RhcnRlZCB3aGljaCBzbGVlcHMgZm9yIHtAbGluayAjU0xFRVBfVElNRU9VVH0NCi0JICogPGxpPklmIHRoZSBjYWxsZXIgaXMgbm90IHRoZSBVSSB0aHJlYWQsIHRoZW4gdGhlIGN1cnJlbnQgdGhyZWFkIHNsZWVwcyBmb3Ige0BsaW5rICNTTEVFUF9USU1FT1VUfSA8YnI+DQotCSAqIA0KLQkgKiBAcGFyYW0gY29uZGl0aW9uDQotCSAqICAgICAgICAgICAgY29uZGl0aW9uIG9uIHdoaWNoIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gaWYgbWV0DQotCSAqIEB0aHJvd3MgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24NCi0JICovDQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gd2FpdEZvckNvbmRpdGlvbkxvb3AoZmluYWwgSVdhaXRDb25kaXRpb24gY29uZGl0aW9uKSB0aHJvd3MgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24NCi0Jew0KLQkJaW50IGF0dGVtcHRzID0gMDsNCi0JCXdoaWxlIChhdHRlbXB0cyA8IE1BWF9DT05ESVRJT05fQ0hFQ0tTKQ0KLQkJew0KLQkJCWlmIChjb25kaXRpb24uY2hlY2tDb25kaXRpb24oKSkNCi0JCQl7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0NCi0JCQlhdHRlbXB0cysrOw0KLQkJCWZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBzbGVlcFJ1bm5hYmxlID0gZ2V0U2xlZXBSdW5uYWJsZSgpOw0KLQ0KLQkJCXRyeQ0KLQkJCXsNCi0JCQkJVGVzdENvbnRleHQucnVuKHNsZWVwUnVubmFibGUsIERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpKTsNCi0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpDQotCQkJew0KLQkJCQl0aHJvdyBuZXcgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24oZSk7DQotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkNCi0JCQl7DQotCQkJCXRocm93IG5ldyBDb25kaXRpb25DaGVja0V4Y2VwdGlvbihlKTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JcHJpdmF0ZSBzdGF0aWMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGdldFNsZWVwUnVubmFibGUoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpDQotCQl7DQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uDQotCQkJew0KLQkJCQlUaHJlYWQuc2xlZXAoU0xFRVBfVElNRU9VVCk7DQotCQkJfQ0KLQkJfTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZhaWxVcG9uVGhyb3dhYmxlKGZpbmFsIFRocm93YWJsZSB0KQ0KLQl7DQotCQlmaW5hbCBTdHJpbmdCdWlsZGVyIG1zZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcih0LmdldE1lc3NhZ2UoKSk7DQotCQlTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KLQkJUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyKTsNCi0JCXQucHJpbnRTdGFja1RyYWNlKHByaW50V3JpdGVyKTsNCi0JCW1zZ0J1aWxkZXIuYXBwZW5kKHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsNCi0JCW1zZ0J1aWxkZXIuYXBwZW5kKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIik7DQotDQotCQlBc3NlcnQuZmFpbChtc2dCdWlsZGVyLnRvU3RyaW5nKCkpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvYXNzZXJ0aW9ucy9Db25kaXRpb25DaGVja0V4Y2VwdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9hc3NlcnRpb25zL0NvbmRpdGlvbkNoZWNrRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllNjkxZGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9hc3NlcnRpb25zL0NvbmRpdGlvbkNoZWNrRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuYXNzZXJ0aW9uczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5JV2FpdENvbmRpdGlvbjsNCi0NCi0NCi0vKioNCi0gKiBFeGNlcHRpb24gd2hpY2ggY2FuIGJlIHRocm93biBieSB7QGxpbmsgSVdhaXRDb25kaXRpb24jY2hlY2tDb25kaXRpb24oKX0gbWV0aG9kLiBUaGlzIGlzIGEgd3JhcHBlciBleGNlcHRpb24gd2hpY2ggZW5jbG9zZXMgdGhlIGV4Y2VwdGlvbiBjYXVzZQ0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICovDQotcHVibGljIGNsYXNzIENvbmRpdGlvbkNoZWNrRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDkyOTA4MDI4NTUwNjc4ODk4NEw7DQotDQotCXB1YmxpYyBDb25kaXRpb25DaGVja0V4Y2VwdGlvbihmaW5hbCBUaHJvd2FibGUgY2F1c2UpDQotCXsNCi0JCXN1cGVyKGNhdXNlKTsNCi0JfQ0KLQkNCi0JcHVibGljIENvbmRpdGlvbkNoZWNrRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlKQ0KLQl7DQotCQlzdXBlcihtZXNzYWdlKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ZpbGVzL1Rlc3RGaWxlVXRpbHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvZmlsZXMvVGVzdEZpbGVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNTMyY2JkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvZmlsZXMvVGVzdEZpbGVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5maWxlczsNCi0NCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsNCi1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsNCi1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgVGVzdEZpbGVVdGlscw0KLXsNCi0JLy8gSGlkZSBkZWZhdWx0IGNvbnN0cnVjdG9yDQotCXByaXZhdGUgVGVzdEZpbGVVdGlscygpDQotCXsNCi0JfTsNCi0NCi0JLyoqIEdldCBuZXcgaW5zdGFuY2Ugb2YgdGhlIEZpbGVVdGlsaXRpZXMgb2JqZWN0ICovDQotCXB1YmxpYyBzdGF0aWMgVGVzdEZpbGVVdGlscyBnZXRJbnN0YW5jZSgpDQotCXsNCi0JCXJldHVybiBuZXcgVGVzdEZpbGVVdGlscygpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBVdGlsaXR5IG1ldGhvZC4gQ29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlIGZvbGRlciB0byB0aGUgZGVzdGluYXRpb24gZm9sZGVyLg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gY29weUZpbGVzKGZpbmFsIEZpbGUgZGVzdCwgZmluYWwgRmlsZSBzcmMpIHRocm93cyBJT0V4Y2VwdGlvbg0KLQl7DQotDQotCQlpZiAoc3JjLmlzRGlyZWN0b3J5KCkpDQotCQl7DQotCQkJZGVzdC5ta2RpcnMoKTsNCi0JCQlmaW5hbCBTdHJpbmcgbGlzdFtdID0gc3JjLmxpc3QoKTsNCi0NCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspDQotCQkJew0KLQkJCQlmaW5hbCBTdHJpbmcgZGVzdDEgPSBkZXN0LmdldEFic29sdXRlUGF0aCgpICsgIlxcIiArIGxpc3RbaV07DQotCQkJCWZpbmFsIFN0cmluZyBzcmMxID0gc3JjLmdldEFic29sdXRlUGF0aCgpICsgIlxcIiArIGxpc3RbaV07DQotCQkJCWNvcHlGaWxlcyhuZXcgRmlsZShkZXN0MSksIG5ldyBGaWxlKHNyYzEpKTsNCi0JCQl9DQotCQl9IGVsc2UNCi0JCXsNCi0JCQlyZXR1cm4gY29weShkZXN0LCBzcmMpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBVdGlsaXR5IG1ldGhvZCBmb3IgY29weWluZyBhIGZpbGUhIC0gbm90IGEgZGlyZWN0b3J5DQotCSAqIA0KLQkgKiBAcGFyYW0gdGFyZ2V0DQotCSAqIEBwYXJhbSBzb3VyY2UNCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gY29weShmaW5hbCBGaWxlIHRhcmdldCwgZmluYWwgRmlsZSBzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbg0KLQl7DQotCQlpZiAoIXNvdXJjZS5pc0ZpbGUoKSkNCi0JCQlyZXR1cm4gZmFsc2U7DQotDQotCQlmaW5hbCBGaWxlQ2hhbm5lbCBzb3VyY2VDaGFubmVsID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2UpLmdldENoYW5uZWwoKTsNCi0JCWZpbmFsIEZpbGVDaGFubmVsIHRhcmdldENoYW5uZWwgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRhcmdldCkuZ2V0Q2hhbm5lbCgpOw0KLQkJc291cmNlQ2hhbm5lbC50cmFuc2ZlclRvKDAsIHNvdXJjZUNoYW5uZWwuc2l6ZSgpLCB0YXJnZXRDaGFubmVsKTsNCi0JCXNvdXJjZUNoYW5uZWwuY2xvc2UoKTsNCi0JCXRhcmdldENoYW5uZWwuY2xvc2UoKTsNCi0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotDQotCS8qKg0KLQkgKiANCi0JICogQHBhcmFtIGRlc3REaXINCi0JICogQHBhcmFtIHNyY1JlbGF0aXZlUGF0aCAtDQotCSAqICAgICAgICAgICAgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHJlc291cmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGlzIGluIHRoZSBzYW1lIHBhY2thZ2UNCi0JICogQHBhcmFtIHJlc291cmNlTmFtZQ0KLQkgKiBAcGFyYW0gcmVzb3VyY2VDbGFzcw0KLQkgKiBAcmV0dXJuDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBGaWxlIGNvcHlSZXNvdXJjZVRvRGlyKEZpbGUgZGVzdERpciwgSW5wdXRTdHJlYW0gc3JjU3RyZWFtLCBTdHJpbmcgcmVzb3VyY2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKGRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCksIHJlc291cmNlTmFtZSk7DQotCQljb3B5RmlsZShzcmNTdHJlYW0sIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RGaWxlKSk7DQotCQlyZXR1cm4gZGVzdEZpbGU7DQotCX0NCi0JLyoqDQotCSAqIA0KLQkgKiBAcGFyYW0gZGVzdERpcg0KLQkgKiBAcGFyYW0gc3JjUmVsYXRpdmVQYXRoIC0NCi0JICogICAgICAgICAgICB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaXMgaW4gdGhlIHNhbWUgcGFja2FnZQ0KLQkgKiBAcGFyYW0gc3JjRmlsZU5hbWUNCi0JICogQHBhcmFtIHJlc291cmNlQ2xhc3MNCi0JICogQHJldHVybg0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgRmlsZSBjb3B5UmVzb3VyY2VUb0RpcihGaWxlIGRlc3REaXIsIFN0cmluZyBzcmNSZWxhdGl2ZVBhdGgsIFN0cmluZyBzcmNGaWxlTmFtZSwgQ2xhc3M8Pz4gcmVzb3VyY2VDbGFzcykgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCUZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLmdldEFic29sdXRlUGF0aCgpLCBzcmNGaWxlTmFtZSk7DQotCQljb3B5RmlsZShjcmVhdGVJbnB1dFN0cmVhbUZvclJlc291cmNlKHNyY1JlbGF0aXZlUGF0aCwgc3JjRmlsZU5hbWUsIHJlc291cmNlQ2xhc3MpLCBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0RmlsZSkpOw0KLQkJcmV0dXJuIGRlc3RGaWxlOw0KLQl9DQotDQotCXByaXZhdGUgSW5wdXRTdHJlYW0gY3JlYXRlSW5wdXRTdHJlYW1Gb3JSZXNvdXJjZShTdHJpbmcgc3JjUmVsYXRpdmVQYXRoLCBTdHJpbmcgc3JjRmlsZU5hbWUsIENsYXNzPD8+IHJlc291cmNlQ2xhc3MpDQotCXsNCi0JCXJldHVybiByZXNvdXJjZUNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oY3JlYXRlUmVzb3VyY2VQYXRoKHNyY1JlbGF0aXZlUGF0aCkgKyBzcmNGaWxlTmFtZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlUmVzb3VyY2VQYXRoKFN0cmluZyBzcmNSZWxhdGl2ZVBhdGgpDQotCXsNCi0JCXJldHVybiAoc3JjUmVsYXRpdmVQYXRoID09IG51bGwpID8gIiIgOiBzcmNSZWxhdGl2ZVBhdGggKyAiLyI7DQotCX0NCi0NCi0JLyoqIENsb3NlcyB0aGUgc3RyZWFtcyBhZnRlciBjb21wbGV0aW9uICovDQotCXB1YmxpYyB2b2lkIGNvcHlGaWxlKElucHV0U3RyZWFtIGluLCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJaWYgKGluID09IG51bGwgfHwgb3V0ID09IG51bGwpDQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyZWFtIG5vdCBpbml0aWFsaXplZCIpOw0KLQkJdHJ5DQotCQl7DQotCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOw0KLQkJCWludCBsZW47DQotCQkJd2hpbGUgKChsZW4gPSBpbi5yZWFkKGJ1ZikpID4gMCkNCi0JCQl7DQotCQkJCW91dC53cml0ZShidWYsIDAsIGxlbik7DQotCQkJfQ0KLQkJfSBmaW5hbGx5DQotCQl7DQotCQkJaW4uY2xvc2UoKTsNCi0JCQlvdXQuY2xvc2UoKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogVXRpbGl0eSBtZXRob2QgZm9yIGRlbGV0aW5nIHRoZSBjb250ZW50cyBvZiBhIGdpdmVuIGZvbGRlciBwYXRoDQotCSAqIA0KLQkgKiBAcGFyYW0gZm9sZGVyUGF0aA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9jZXNzIHdhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Lg0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBkZWxldGVGb2xkZXJBbmRDb250ZW50cyhmaW5hbCBTdHJpbmcgZm9sZGVyUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIEZpbGUgcGF0aCA9IG5ldyBGaWxlKGZvbGRlclBhdGgpOw0KLQkJcmV0dXJuIGRlbGV0ZUZvbGRlckFuZENvbnRlbnRzKHBhdGgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBEZWxldGVzIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGFuZCBhbGwgaXRzIGNvbnRlbnRzIGluY2x1ZGluZyBhbGwgc3ViIGRpcmVjdG9yaWVzLg0KLQkgKiANCi0JICogQHBhcmFtIHRlbXBEaXINCi0JICogICAgICAgICAgICB0aGUgZGlyZWN0b3J5IHRoYXQgaXMgYmVpbmcgZGVsZXRlZC4NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGRlbGV0ZUZvbGRlckFuZENvbnRlbnRzKEZpbGUgdGVtcERpcikNCi0Jew0KLQkJYm9vbGVhbiBzdGF0dXMgPSB0cnVlOw0KLQkJaWYgKHRlbXBEaXIgIT0gbnVsbCkNCi0JCXsNCi0JCQlGaWxlW10gZmlsZXMgPSB0ZW1wRGlyLmxpc3RGaWxlcygpOw0KLQ0KLQkJCWlmIChmaWxlcyAhPSBudWxsKQ0KLQkJCXsNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykNCi0JCQkJew0KLQkJCQkJaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpDQotCQkJCQl7DQotCQkJCQkJc3RhdHVzID0gZGVsZXRlRm9sZGVyQW5kQ29udGVudHMoZmlsZXNbaV0pICYmIHN0YXR1czsNCi0JCQkJCX0gZWxzZQ0KLQkJCQkJew0KLQkJCQkJCXN0YXR1cyA9IGZpbGVzW2ldLmRlbGV0ZSgpICYmIHN0YXR1czsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCQlzdGF0dXMgPSB0ZW1wRGlyLmRlbGV0ZSgpICYmIHN0YXR1czsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCXN0YXR1cyA9IGZhbHNlOw0KLQkJfQ0KLQkJcmV0dXJuIHN0YXR1czsNCi0JfQ0KLQ0KLQkvKioNCi0JICogRXh0cmFjdHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0gZmlsZSB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5Lg0KLQkgKiANCi0JICogQHBhcmFtIGlzdHINCi0JICogICAgICAgICAgICBUaGUgaW5wdXQgc3RyZWFtIG9mIHRoZSBqYXIgZmlsZQ0KLQkgKiBAcGFyYW0gc3JjRmlsZU5hbWUNCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgYXJjaGl2ZSAtIHdoZXJlIHRoZSBjb250ZW50cyBvZiB0aGUgaW5wdXQgc3RyZWFtIHdpbGwgYmUgY29waWVkDQotCSAqIEBwYXJhbSBkZXN0RGlyDQotCSAqICAgICAgICAgICAgVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBvYmplY3QNCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvY2VzcyB3YXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseQ0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiB1bnppcEFyY2hpdmVUb0RpcihmaW5hbCBJbnB1dFN0cmVhbSBpc3RyLCBmaW5hbCBTdHJpbmcgc3JjRmlsZU5hbWUsIGZpbmFsIEZpbGUgZGVzdERpcikgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0NCi0JCWlmICghZGVzdERpci5leGlzdHMoKSkNCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCIpOw0KLQkJaWYgKCFkZXN0RGlyLmNhbldyaXRlKCkpDQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZCBub3Qgd3JpdGUgdG8gZGlyZWN0b3J5Iik7DQotDQotCQlmaW5hbCBGaWxlIHNvdXJjZUZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLCBzcmNGaWxlTmFtZSk7DQotDQotCQlmaW5hbCBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHNvdXJjZUZpbGUpOw0KLQkJZmluYWwgQnVmZmVyZWRPdXRwdXRTdHJlYW0gYnVmT3V0U3RyZWFtID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGZvcyk7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlVbnppcHBlci5JTlNUQU5DRS5jb3B5SW5wdXRTdHJlYW0oaXN0ciwgYnVmT3V0U3RyZWFtKTsNCi0JCX0gZmluYWxseQ0KLQkJew0KLQkJCWJ1Zk91dFN0cmVhbS5jbG9zZSgpOw0KLQkJCWZvcy5jbG9zZSgpOw0KLQkJfQ0KLQ0KLQkJLy8gY2hlY2sgaWYgdGhlIGFyY2hpdmUgd2FzIGNvcGllZCBzdWNjZXNzZnVsbHkNCi0JCWlmICghc291cmNlRmlsZS5leGlzdHMoKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJBcmNoaXZlIGNvdWxkIG5vdCBiZSBmb3VuZCIpOw0KLQkJfQ0KLQ0KLQkJVW56aXBwZXIuSU5TVEFOQ0UudW56aXAoc291cmNlRmlsZSwgZGVzdERpciwgZmFsc2UpOw0KLQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0NCi0JLyoqIFV0aWxpdHkgbWV0aG9kIGZvciBnZXR0aW5nIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgdGhyb3VnaCBVUkwgKi8NCi0JcHVibGljIFN0cmluZyByZWFkVVJMUmVzb3VyY2UoVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCVN0cmluZyByZWFkSW5mID0gbnVsbDsNCi0JCWZpbmFsIElucHV0U3RyZWFtIGluID0gdXJsLm9wZW5TdHJlYW0oKTsNCi0NCi0JCXRyeQ0KLQkJew0KLQkJCWludCBpblJlYWQgPSBpbi5yZWFkKCk7DQotDQotCQkJcmVhZEluZiA9ICIiOw0KLQkJCXdoaWxlIChpblJlYWQgIT0gLTEpDQotCQkJew0KLQkJCQlyZWFkSW5mICs9IFN0cmluZy52YWx1ZU9mKChjaGFyKSBpblJlYWQpOw0KLQkJCQlpblJlYWQgPSBpbi5yZWFkKCk7DQotCQkJfQ0KLQkJfSBmaW5hbGx5DQotCQl7DQotCQkJaW4uY2xvc2UoKTsNCi0JCX0NCi0NCi0JCXJldHVybiByZWFkSW5mOw0KLQl9DQotDQotCS8qKg0KLQkgKiBNZXRob2QgZm9yIHJlcGxhY2luZyB0aGUgdGV4dCBvY2N1cnJlbmNlIGluIGEgZmlsZSB3aXRoIHRoZSBwcm92aWRlZCByZXBsYWNlbWVudC4NCi0JICogDQotCSAqIEBwYXJhbSBmaWxlDQotCSAqIEBwYXJhbSBmaW5kDQotCSAqIEBwYXJhbSByZXBsYWNlbWVudA0KLQkgKiBAcmV0dXJuDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBib29sZWFuIHJlcGxhY2VDb250ZW50c0luRmlsZShGaWxlIGZpbGUsIFN0cmluZyBmaW5kLCBTdHJpbmcgcmVwbGFjZW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbg0KLQl7DQotCQlpZiAoIWZpbGUuZXhpc3RzKCkpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQ0KLQkJU3RyaW5nIGZpbGVDb250ZW50cyA9IHJlYWRGaWxlQ29udGVudHMoZmlsZSk7DQotDQotCQlmaWxlQ29udGVudHMgPSBmaWxlQ29udGVudHMucmVwbGFjZUFsbChmaW5kLCByZXBsYWNlbWVudCk7DQotDQotCQlmaWxlLmRlbGV0ZSgpOw0KLQkJZmlsZS5jcmVhdGVOZXdGaWxlKCk7DQotDQotCQl3cml0ZUNvbnRlbnRzVG9GaWxlKGZpbGUsIGZpbGVDb250ZW50cyk7DQotDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogV3JpdGVzIHRoZSBzdHJpbmcgdG8gdGhlIGdpdmVuIGZpbGUuDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZSAtDQotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gd3JpdGUgdG8NCi0JICogQHBhcmFtIGZpbGVDb250ZW50cyAtDQotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnRzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbGUNCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgd3JpdGVDb250ZW50c1RvRmlsZShGaWxlIGZpbGUsIFN0cmluZyBmaWxlQ29udGVudHMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uDQotCXsNCi0NCi0JCVByaW50V3JpdGVyIHBvdXQgPSBuZXcgUHJpbnRXcml0ZXIoZmlsZSk7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlwb3V0LnByaW50bG4oZmlsZUNvbnRlbnRzKTsNCi0JCQlwb3V0LmZsdXNoKCk7DQotCQl9IGZpbmFsbHkNCi0JCXsNCi0JCQlwb3V0LmNsb3NlKCk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJlYWRzIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgYW5kIHJldHVybnMgaXQgYXMgU3RyaW5nLg0KLQkgKiANCi0JICogQHBhcmFtIGZpbGUgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIHJlYWQgZnJvbQ0KLQkgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZQ0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIHJlYWRGaWxlQ29udGVudHMoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nIHJlYWRJbmYgPSBudWxsOw0KLQkJZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOw0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJaW50IGluUmVhZCA9IGluLnJlYWQoKTsNCi0NCi0JCQlyZWFkSW5mID0gIiI7DQotCQkJd2hpbGUgKGluUmVhZCAhPSAtMSkNCi0JCQl7DQotCQkJCXJlYWRJbmYgKz0gU3RyaW5nLnZhbHVlT2YoKGNoYXIpIGluUmVhZCk7DQotCQkJCWluUmVhZCA9IGluLnJlYWQoKTsNCi0JCQl9DQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCXRocm93IGU7DQotCQl9IGZpbmFsbHkNCi0JCXsNCi0JCQlpbi5jbG9zZSgpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHJlYWRJbmY7DQotCX0NCi0NCi0JLyoqIEByZXR1cm4gdGhlIHJlc291cmNlIGlucHV0IHN0cmVhbSBvZiB0aGUgcHJvamVjdHMgYXJjaGl2ZSAqLw0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlSW5wdXRTdHJlYW0oZmluYWwgU3RyaW5nIGFyY2hpdmVOYW1lLCBmaW5hbCBTdHJpbmcgcHJvamVjdFNvdXJjZUZvbGRlciwgQ2xhc3MgcmVsYXRpdmVSZXNvdXJjZUJhc2VDbGFzcykNCi0Jew0KLQkJcmV0dXJuIHJlbGF0aXZlUmVzb3VyY2VCYXNlQ2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShwcm9qZWN0U291cmNlRm9sZGVyICsgIi8iICsgYXJjaGl2ZU5hbWUpOw0KLQl9DQotDQotCS8qKiBNZXRob2QgZm9yIGhhbmRsaW5nIHRoZSB1bnppcHBpbmcgb2YgdGhlIHRlc3QgcHJvamVjdHMgKi8NCi0JcHVibGljIHZvaWQgdW56aXBUZXN0UHJvamVjdHMoZmluYWwgSW5wdXRTdHJlYW0gYXJjaGl2ZVN0cmVhbSwgZmluYWwgU3RyaW5nIGFyY2hpdmVOYW1lLCBmaW5hbCBGaWxlIGRlc3REaXIpIHRocm93cyBJT0V4Y2VwdGlvbg0KLQl7DQotDQotCQlpZiAoYXJjaGl2ZVN0cmVhbSA9PSBudWxsKQ0KLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiVGhlIGFyY2hpdmUgcmVzb3VyY2Ugc3RyZWFtIGlzIG5vdCBpbml0aWFsaXplZCEgYXJjaGl2ZTogIiArIGFyY2hpdmVOYW1lICsgIiAtIGRpcjogIiArIGRlc3REaXIpOw0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJdW56aXBBcmNoaXZlVG9EaXIoYXJjaGl2ZVN0cmVhbSwgYXJjaGl2ZU5hbWUsIGRlc3REaXIpOw0KLQkJfSBmaW5hbGx5DQotCQl7DQotCQkJYXJjaGl2ZVN0cmVhbS5jbG9zZSgpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBVbnppcHMgdGhlIGNvbnRlbnQgb2YgPHR0PnppcEZpbGVMb2NhdGlvbjwvdHQ+IGludG8gPHR0Pm91dEZvbGRlcjwvdHQ+Lg0KLQkgKiANCi0JICogQHBhcmFtIHppcEZpbGVMb2NhdGlvbg0KLQkgKiBAcGFyYW0gb3V0Rm9sZGVyDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRaaXBwZWRDb250ZW50KEZpbGUgemlwRmlsZUxvY2F0aW9uLCBGaWxlIG91dEZvbGRlcikgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHppcEZpbGVMb2NhdGlvbik7DQotCQlhZGRaaXBwZWRDb250ZW50KGZpcywgb3V0Rm9sZGVyKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVW56aXBzIHRoZSBjb250ZW50IG9mIDx0dD5pczwvdHQ+IGludG8gPHR0Pm91dEZvbGRlcjwvdHQ+Lg0KLQkgKiANCi0JICogQHBhcmFtIHppcEZpbGVMb2NhdGlvbg0KLQkgKiBAcGFyYW0gb3V0Rm9sZGVyDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRaaXBwZWRDb250ZW50KElucHV0U3RyZWFtIGlzLCBGaWxlIG91dEZvbGRlcikgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCVppcElucHV0U3RyZWFtIHppcyA9IG5ldyBaaXBJbnB1dFN0cmVhbShpcyk7DQotCQlaaXBFbnRyeSBlbnRyeSA9IG51bGw7DQotCQl3aGlsZSAoKGVudHJ5ID0gemlzLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKQ0KLQkJew0KLQkJCUZpbGUgb3V0RmlsZSA9IG5ldyBGaWxlKG91dEZvbGRlciwgZW50cnkuZ2V0TmFtZSgpKTsNCi0NCi0JCQlpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkNCi0JCQl7DQotCQkJCW91dEZpbGUubWtkaXJzKCk7DQotCQkJfSBlbHNlDQotCQkJew0KLQkJCQlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0RmlsZSk7DQotCQkJCWJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbMjA0OF07DQotCQkJCWludCByZWFkOw0KLQkJCQl3aGlsZSAoKHJlYWQgPSB6aXMucmVhZChidWZmKSkgPiAwKQ0KLQkJCQl7DQotCQkJCQlvdXQud3JpdGUoYnVmZiwgMCwgcmVhZCk7DQotCQkJCX0NCi0JCQkJb3V0LmNsb3NlKCk7DQotCQkJfQ0KLQ0KLQkJCXppcy5jbG9zZUVudHJ5KCk7DQotCQl9DQotDQotCQl6aXMuY2xvc2UoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogRGVsZXRlcyBkaXJlY3Rvcnkgd2l0aCBpdHMgY29udGVudA0KLQkgKiANCi0JICogQHBhcmFtIGRpcg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURpcmVjdG9yeShGaWxlIGRpcikNCi0Jew0KLQkJaWYgKCFkaXIuaXNEaXJlY3RvcnkoKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgYSBkaXJlY3RvcnkiICsgZGlyLmdldE5hbWUoKSk7DQotCQl9DQotDQotCQlmb3IgKFN0cmluZyBzIDogZGlyLmxpc3QoKSkNCi0JCXsNCi0JCQlGaWxlIGYgPSBuZXcgRmlsZShkaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIHMpOw0KLQkJCWlmIChmLmlzRGlyZWN0b3J5KCkpDQotCQkJew0KLQkJCQlkZWxldGVEaXJlY3RvcnkoZik7DQotCQkJfSBlbHNlDQotCQkJew0KLQkJCQlmLmRlbGV0ZSgpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWRpci5kZWxldGUoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlIGEgZGlyZWN0b3J5IG5hbWVkIHZpYSB0aGUgcGF0dGVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikgKyBGaWxlLnNlcGFyYXRvciArIGRpck5hbWUNCi0JICogDQotCSAqIEBwYXJhbSBkaXJOYW1lDQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgRmlsZSBjcmVhdGVUZW1wRGlyZWN0b3J5KFN0cmluZyBkaXJOYW1lKQ0KLQl7DQotCQlGaWxlIHRlbXBEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIiksIGRpck5hbWUpOw0KLQkJaWYgKHRlbXBEaXIuZXhpc3RzKCkpDQotCQl7DQotCQkJZGVsZXRlRGlyZWN0b3J5KHRlbXBEaXIpOw0KLQkJfQ0KLQ0KLQkJaWYgKCF0ZW1wRGlyLm1rZGlyKCkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGVtcCBkaXJlY29yeSAiICsgdGVtcERpci5nZXRBYnNvbHV0ZVBhdGgoKSArICIgY291bGQgbm90IGJlIGNyZWF0ZWQiKTsNCi0JCX0NCi0JCS8vIHRlbXBEaXIuZGVsZXRlT25FeGl0KCk7DQotDQotCQlyZXR1cm4gdGVtcERpcjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29weSB0aGUgY29udGVudCBvZiA8Y29kZT5maWxlUGF0aDwvY29kZT4gYW5kIGNvcGllcyBpdCB0byB0ZW1wb3JhcnkgZmlsZSBpbiBzeXN0ZW0gdGVtcCBkaXJlY3RvcnkuDQotCSAqIA0KLQkgKiBAcGFyYW0gY2xhc3NDb250ZXh0DQotCSAqIEBwYXJhbSBmaWxlUGF0aA0KLQkgKiBAcmV0dXJuIGNyZWF0ZWQgdGVtcG9yYXJ5IGZpbGUNCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvcHlUb1RlbXBMb2NhdGlvbihDbGFzczw/PiBjbGFzc0NvbnRleHQsIFN0cmluZyBmaWxlUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElucHV0U3RyZWFtIGlzID0gY2xhc3NDb250ZXh0LmdldFJlc291cmNlQXNTdHJlYW0oZmlsZVBhdGgpOw0KLQkJZmluYWwgRmlsZSBkaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikpOw0KLQkJZmluYWwgRmlsZSB0ZW1wRmlsZSA9IG5ldyBGaWxlKGRpciwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLmphdmEiKTsNCi0JCXRlbXBGaWxlLmRlbGV0ZU9uRXhpdCgpOw0KLQ0KLQkJZmluYWwgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wRmlsZSk7DQotCQl0cnkNCi0JCXsNCi0JCQlieXRlW10gYnVmZiA9IG5ldyBieXRlWzEwMjRdOw0KLQkJCWZvciAoaW50IGNudCA9IDA7IChjbnQgPSBpcy5yZWFkKGJ1ZmYpKSA+IC0xOykNCi0JCQl7DQotCQkJCWZvcy53cml0ZShidWZmLCAwLCBjbnQpOw0KLQkJCX0NCi0JCX0gZmluYWxseQ0KLQkJew0KLQkJCWlzLmNsb3NlKCk7DQotCQkJZm9zLmNsb3NlKCk7DQotCQl9DQotDQotCQlyZXR1cm4gdGVtcEZpbGU7DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZpbGVDb250ZW50KEZpbGUgZmlsZSwgU3RyaW5nIGNvbnRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIoZmlsZSk7DQotCQl0cnkNCi0JCXsNCi0JCQlmdy53cml0ZShjb250ZW50KTsNCi0JCX0gZmluYWxseQ0KLQkJew0KLQkJCWZ3LmNsb3NlKCk7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9maWxlcy9VbnppcHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9maWxlcy9VbnppcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOWJmZGZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvZmlsZXMvVW56aXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuZmlsZXM7DQotDQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5Ow0KLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7DQotDQotLyoqDQotICogQSBzaW1wbGUgdXRpbGl0eSBmb3IgdW56aXBwaW5nIFpJUCBhcmNoaXZlcw0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICovDQotcHVibGljIGNsYXNzIFVuemlwcGVyIHsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBVbnppcHBlciBJTlNUQU5DRSA9IG5ldyBVbnppcHBlcigpOw0KLQ0KLQkvLyBIaWRlIGRlZmF1bHQgY29uc3RydWN0b3INCi0JcHJpdmF0ZSBVbnppcHBlcigpIHsNCi0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29weSB0aGUgY29udGVudCBmcm9tIHRoZSA8Y29kZT5zb3VyY2VTdHJlYW08L2NvZGU+IHRvIHRoZQ0KLQkgKiA8Y29kZT5kZXN0aW5hdGlvblN0cmVhbTwvY29kZT4NCi0JICogDQotCSAqIEBwYXJhbSBzb3VyY2VTdHJlYW0NCi0JICogQHBhcmFtIGRlc3RTdHJlYW0NCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgY29weUlucHV0U3RyZWFtKGZpbmFsIElucHV0U3RyZWFtIHNvdXJjZVN0cmVhbSwNCi0JCQlmaW5hbCBPdXRwdXRTdHJlYW0gZGVzdFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsNCi0JCWludCBsZW47DQotDQotCQl3aGlsZSAoKGxlbiA9IHNvdXJjZVN0cmVhbS5yZWFkKGJ1ZmZlcikpID49IDApIHsNCi0JCQlkZXN0U3RyZWFtLndyaXRlKGJ1ZmZlciwgMCwgbGVuKTsNCi0JCX0NCi0NCi0JCWRlc3RTdHJlYW0uZmx1c2goKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVW56aXAgdGhlIHppcCBmaWxlIHNwZWNpZmllZCB0byB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5DQotCSAqIA0KLQkgKiBAcGFyYW0gc291cmNlRmlsZQ0KLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgemlwIGZpbGUNCi0JICogQHBhcmFtIGRlc3RpbmF0aW9uRGlyDQotCSAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQ0KLQkgKiBAcGFyYW0gdG9Mb3dlckNhc2UNCi0JICogICAgICAgICAgICBpZiB0cnVlLCBhbGwgdGhlIHVuemlwcGVkIGVudHJpZXMgd291bGQgYmUgbG93ZXJjYXNlZCAoZm9yICpJWA0KLQkgKiAgICAgICAgICAgIGNvbXBhdGliaWxpdHkpIFRoZSBiYWNrZ3JvdW5kIGJlaGluZCB0aGlzIHBhcmFtZXRlciBpcyB0aGUNCi0JICogICAgICAgICAgICBjYXNlIGluY29uc2lzdGVuY3kgYmV0d2VlbiBBQkFQIHhtbCB0ZXN0IGRhdGEgZGlyZWN0b3J5IG5hbWVzDQotCSAqICAgICAgICAgICAgYW5kIHRoZSByZWFsIGRpcmVjdG9yeSBuYW1lcyBpbiB0aGUgQUJBUCBaSVANCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gYW55IG9mIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGlzIG51bGwNCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiA8Y29kZT5zb3VyY2VGaWxlPC9jb2RlPiBkb2VzIG5vdCBleGlzdCBvciBwb2ludHMgdG8gYQ0KLQkgKiAgICAgICAgICAgICBkaXJlY3RvcnkNCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiA8Y29kZT5kZXN0aW5hdGlvbkRpcjwvY29kZT4gZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGENCi0JICogICAgICAgICAgICAgZGlyZWN0b3J5DQotCSAqLw0KLQlwdWJsaWMgdm9pZCB1bnppcChmaW5hbCBGaWxlIHNvdXJjZUZpbGUsIGZpbmFsIEZpbGUgZGVzdGluYXRpb25EaXIsDQotCQkJZmluYWwgYm9vbGVhbiB0b0xvd2VyQ2FzZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCWNoZWNrSW5wdXRQYXJhbXMoc291cmNlRmlsZSwgZGVzdGluYXRpb25EaXIpOw0KLQkJWmlwRmlsZSB6aXBGaWxlID0gbnVsbDsNCi0NCi0JCXRyeSB7DQotCQkJemlwRmlsZSA9IG5ldyBaaXBGaWxlKHNvdXJjZUZpbGUpOw0KLQkJCUVudW1lcmF0aW9uPD8gZXh0ZW5kcyBaaXBFbnRyeT4gZW50cmllcyA9IHppcEZpbGUuZW50cmllcygpOw0KLQ0KLQkJCS8vIENyZWF0ZSBkaXIgc3RydWN0dXJlDQotCQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsNCi0JCQkJZmluYWwgWmlwRW50cnkgZW50cnkgPSBlbnRyaWVzLm5leHRFbGVtZW50KCk7DQotDQotCQkJCWlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7DQotCQkJCQkvLyBUaGlzIGlzIG5vdCByb2J1c3QsIGp1c3QgZm9yIGRlbW9uc3RyYXRpb24gcHVycG9zZXMuDQotCQkJCQkobmV3IEZpbGUoZGVzdGluYXRpb25EaXIsIHRvTG93ZXJDYXNlID8gZW50cnkuZ2V0TmFtZSgpDQotCQkJCQkJCS50b0xvd2VyQ2FzZSgpIDogZW50cnkuZ2V0TmFtZSgpKSkubWtkaXJzKCk7DQotCQkJCX0NCi0JCQl9DQotDQotCQkJLy8gQ3JlYXRlIGZpbGVzDQotCQkJZW50cmllcyA9IHppcEZpbGUuZW50cmllcygpOw0KLQkJCXdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7DQotCQkJCWZpbmFsIFppcEVudHJ5IGVudHJ5ID0gZW50cmllcy5uZXh0RWxlbWVudCgpOw0KLQ0KLQkJCQlpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkgew0KLQkJCQkJY29udGludWU7DQotCQkJCX0NCi0NCi0JCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOw0KLQkJCQlCdWZmZXJlZE91dHB1dFN0cmVhbSBidWZPdXRTdHJlYW0gPSBudWxsOw0KLQ0KLQkJCQl0cnkgew0KLQkJCQkJZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoZGVzdGluYXRpb25EaXIsDQotCQkJCQkJCXRvTG93ZXJDYXNlID8gZW50cnkuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkgOiBlbnRyeQ0KLQkJCQkJCQkJCS5nZXROYW1lKCkpKTsNCi0JCQkJCWJ1Zk91dFN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShmb3MpOw0KLQkJCQkJY29weUlucHV0U3RyZWFtKHppcEZpbGUuZ2V0SW5wdXRTdHJlYW0oZW50cnkpLCBidWZPdXRTdHJlYW0pOw0KLQkJCQkJZm9zLmZsdXNoKCk7DQotCQkJCQlidWZPdXRTdHJlYW0uZmx1c2goKTsNCi0JCQkJfSBmaW5hbGx5IHsNCi0JCQkJCWlmIChmb3MgIT0gbnVsbCkgew0KLQkJCQkJCWZvcy5jbG9zZSgpOw0KLQkJCQkJfQ0KLQkJCQkJaWYgKGJ1Zk91dFN0cmVhbSAhPSBudWxsKSB7DQotCQkJCQkJYnVmT3V0U3RyZWFtLmNsb3NlKCk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9IGZpbmFsbHkgew0KLQkJCWlmICh6aXBGaWxlICE9IG51bGwpIHsNCi0JCQkJemlwRmlsZS5jbG9zZSgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgY2hlY2tJbnB1dFBhcmFtcyhmaW5hbCBGaWxlIHppcEZpbGUsIGZpbmFsIEZpbGUgZGVzdGluYXRpb24pIHsNCi0JCS8vIENvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbSh6aXBGaWxlLCAiemlwRmlsZSIpOw0KLQkJLy8gQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGRlc3RpbmF0aW9uLCAiZGVzdGluYXRpb24iKTsNCi0JCWlmICghemlwRmlsZS5leGlzdHMoKSB8fCB6aXBGaWxlLmlzRGlyZWN0b3J5KCkpIHsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KLQkJCQkJIlpJUCBmaWxlIGRvZXMgbm90IGV4aXN0IG9yIGlzIGEgZGlyZWN0b3J5Iik7DQotCQl9DQotCQlpZiAoIWRlc3RpbmF0aW9uLmV4aXN0cygpIHx8ICFkZXN0aW5hdGlvbi5pc0RpcmVjdG9yeSgpKSB7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigNCi0JCQkJCSJEZXN0aW5hdGlvbiBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSBkaXJlY3RvcnkiKTsNCi0JCX0NCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL0Fic3RyYWN0RHluYW1pY01vY2suamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svQWJzdHJhY3REeW5hbWljTW9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNTMxNGIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svQWJzdHJhY3REeW5hbWljTW9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrOw0KLQ0KLWltcG9ydCBvcmcuam1vY2suY29yZS5JbnZvY2F0aW9uRGlzcGF0Y2hlcjsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIGlzIGVxdWl2YWxlbnQgdG8gPGM+b3JnLmptb2NrLmNvcmUuQWJzdHJhY3REeW5hbWljTW9jazwvYz4uIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBjbGFzcyBpcyBwYXJhbWV0ZXJpemVkLiBJdCBleHRlbmRzIGZyb20NCi0gKiA8Yz5vcmcuam1vY2suY29yZS5BYnN0cmFjdER5bmFtaWNNb2NrPC9jPiBhbmQgaXMgdGh1cyBiYWNrd2FyZCBjb21wYXRpYmxlLg0KLSAqIA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICogDQotICogQHBhcmFtIDxUPg0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdER5bmFtaWNNb2NrPFQ+IGV4dGVuZHMgb3JnLmptb2NrLmNvcmUuQWJzdHJhY3REeW5hbWljTW9jaw0KLXsNCi0NCi0JcHVibGljIEFic3RyYWN0RHluYW1pY01vY2soQ2xhc3M8VD4gbW9ja2VkVHlwZSwgU3RyaW5nIG5hbWUsIEludm9jYXRpb25EaXNwYXRjaGVyIGludm9jYXRpb25EaXNwYXRjaGVyKQ0KLQl7DQotCQlzdXBlcihtb2NrZWRUeXBlLCBuYW1lLCBpbnZvY2F0aW9uRGlzcGF0Y2hlcik7DQotCX0NCi0NCi0JcHVibGljIEFic3RyYWN0RHluYW1pY01vY2soQ2xhc3M8VD4gbW9ja2VkVHlwZSwgU3RyaW5nIG5hbWUpDQotCXsNCi0JCXN1cGVyKG1vY2tlZFR5cGUsIG5hbWUpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHVibGljIENsYXNzPFQ+IGdldE1vY2tlZFR5cGUoKQ0KLQl7DQotCQlyZXR1cm4gc3VwZXIuZ2V0TW9ja2VkVHlwZSgpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYWJzdHJhY3QgVCBwcm94eSgpOw0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL0Fic3RyYWN0TW9ja09iamVjdFRlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL0Fic3RyYWN0TW9ja09iamVjdFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1YzEzNjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay9BYnN0cmFjdE1vY2tPYmplY3RUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jazsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLkNvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLkR5bmFtaWNNb2NrOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5Gb3JtYXR0aW5nOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5JbnZvY2F0aW9uTWF0Y2hlcjsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuTW9ja09iamVjdFN1cHBvcnRUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuU3R1YjsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUubWF0Y2hlci5JbnZva2VBdExlYXN0T25jZU1hdGNoZXI7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLm1hdGNoZXIuSW52b2tlQXRNb3N0T25jZU1hdGNoZXI7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLm1hdGNoZXIuSW52b2tlQ291bnRNYXRjaGVyOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5tYXRjaGVyLkludm9rZU9uY2VNYXRjaGVyOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5tYXRjaGVyLlRlc3RGYWlsdXJlTWF0Y2hlcjsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuc3R1Yi5SZXR1cm5JdGVyYXRvclN0dWI7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLnN0dWIuUmV0dXJuU3R1YjsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuc3R1Yi5UaHJvd1N0dWI7DQotDQotLyoqDQotICogQW4gYWJzdHJhY3QgY2xhc3MgZnJvbSB3aGljaCBzdWItY2xhc3NpbmcgdGVzdCBjYXNlcyBjYW4gaW5oZXJpdC4gVGhpcyBjbGFzcyBpcyBlcXVpdmFsZW50IHRvIG9yZy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2Ugd2l0aCB0aGUgZGlmZmVyZW5jZSB0aGF0DQotICogaWQgZG9lcyBub3QgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiB0byA8Yz5uZXdDb3JlTW9jazwvYz4gbWV0aG9kIGFuZCB0aHVzIGlzIG5vdCBhYmxlIHRvIGNyZWF0ZSBhbnkgcHJveGllcy4gVGhlIG90aGVyIG1ham9yIGRpZmZlcmVuY2UgaXMgdGhhdA0KLSAqIHRoaXMgY2xhc3MgaXMgcGFyYW1ldGVyaXplZC4gSXQgc2hvdWxkIGJlIHVzZWQgYXMgYSBiYXNlIGNsYXNzIGZvciBzdWItY2xhc3NlcyB0aGF0IHByb3ZpZGUgc3Ryb25nbHkgdHlwZWQgbW9ja3MuIFRoaXMgY2xhc3MgYWxzbyB0YWtlIGFkdmFudGFnZSBvZg0KLSAqIHNvbWUgb2YgdGhlIGphdmEgNSBzdWdhcnMuIEZvciBleGFtcGxlICJ2YXJhcmdzIi4NCi0gKiANCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1vY2tPYmplY3RUZXN0Q2FzZSBleHRlbmRzIE1vY2tPYmplY3RTdXBwb3J0VGVzdENhc2UNCi17DQotDQotCXB1YmxpYyBBYnN0cmFjdE1vY2tPYmplY3RUZXN0Q2FzZSgpDQotCXsNCi0JfQ0KLQ0KLQlwdWJsaWMgQWJzdHJhY3RNb2NrT2JqZWN0VGVzdENhc2UoU3RyaW5nIG5hbWUpDQotCXsNCi0JCXN1cGVyKG5hbWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbW9jayBvYmplY3QgdGhhdCBtb2NrcyB0aGUgZ2l2ZW4gdHlwZS4gVGhlIG1vY2sgb2JqZWN0IGlzIG5hbWVkIGFmdGVyIHRoZSB0eXBlOyB0aGUgZXhhY3QgbmFtZSBpcyBjYWxjdWxhdGVkIGJ5DQotCSAqIHtAbGluayAjZGVmYXVsdE1vY2tOYW1lRm9yVHlwZX0uDQotCSAqIA0KLQkgKiBAcGFyYW0gbW9ja2VkVHlwZQ0KLQkgKiAgICAgICAgICAgIFRoZSB0eXBlIHRvIGJlIG1vY2tlZC4NCi0JICogQHJldHVybiBBIHtAbGluayBNb2NrfSBvYmplY3QgdGhhdCBtb2NrcyA8dmFyPm1vY2tlZFR5cGU8L3Zhcj4uDQotCSAqLw0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHVibGljIDxUPiBNb2NrPFQ+IG1vY2soQ2xhc3MgbW9ja2VkVHlwZSkNCi0Jew0KLQkJcmV0dXJuIG1vY2sobW9ja2VkVHlwZSwgZGVmYXVsdE1vY2tOYW1lRm9yVHlwZShtb2NrZWRUeXBlKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBtb2NrIG9iamVjdCB0aGF0IG1vY2tzIHRoZSBnaXZlbiB0eXBlIGFuZCBpcyBleHBsaWNpdGx5IGdpdmVuIGEgbmFtZS4gVGhlIG1vY2sgb2JqZWN0IGlzIG5hbWVkIGFmdGVyIHRoZSB0eXBlOyB0aGUgZXhhY3QgbmFtZSBpcw0KLQkgKiBjYWxjdWxhdGVkIGJ5IHtAbGluayAjZGVmYXVsdE1vY2tOYW1lRm9yVHlwZX0uDQotCSAqIA0KLQkgKiBAcGFyYW0gbW9ja2VkVHlwZQ0KLQkgKiAgICAgICAgICAgIFRoZSB0eXBlIHRvIGJlIG1vY2tlZC4NCi0JICogQHBhcmFtIHJvbGVOYW1lDQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIG1vY2sgb2JqZWN0DQotCSAqIEByZXR1cm4gQSB7QGxpbmsgTW9ja30gb2JqZWN0IHRoYXQgbW9ja3MgPHZhcj5tb2NrZWRUeXBlPC92YXI+Lg0KLQkgKi8NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXB1YmxpYyA8VD4gTW9jazxUPiBtb2NrKENsYXNzIG1vY2tlZFR5cGUsIFN0cmluZyByb2xlTmFtZSkNCi0Jew0KLQkJZmluYWwgTW9jazxUPiBuZXdNb2NrID0gbmV3IE1vY2s8VD4obmV3Q29yZU1vY2sobW9ja2VkVHlwZSwgcm9sZU5hbWUpKTsNCi0JCXJlZ2lzdGVyVG9WZXJpZnkobmV3TW9jayk7DQotCQlyZXR1cm4gbmV3TW9jazsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgPFQ+IER5bmFtaWNNb2NrIG5ld0NvcmVNb2NrKENsYXNzPFQ+IG1vY2tlZFR5cGUsIFN0cmluZyByb2xlTmFtZSk7DQotDQotCS8qKg0KLQkgKiBDYWxjdWxhdGVzDQotCSAqIA0KLQkgKiBAcGFyYW0gbW9ja2VkVHlwZQ0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRNb2NrTmFtZUZvclR5cGUoQ2xhc3M8Pz4gbW9ja2VkVHlwZSkNCi0Jew0KLQkJcmV0dXJuICJtb2NrIiArIEZvcm1hdHRpbmcuY2xhc3NTaG9ydE5hbWUobW9ja2VkVHlwZSk7DQotCX0NCi0NCi0JcHVibGljIFN0dWIgcmV0dXJuVmFsdWUoT2JqZWN0IG8pDQotCXsNCi0JCXJldHVybiBuZXcgUmV0dXJuU3R1YihvKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3R1YiByZXR1cm5WYWx1ZShib29sZWFuIHJlc3VsdCkNCi0Jew0KLQkJcmV0dXJuIHJldHVyblZhbHVlKG5ldyBCb29sZWFuKHJlc3VsdCkpOw0KLQl9DQotDQotCXB1YmxpYyBTdHViIHJldHVyblZhbHVlKGJ5dGUgcmVzdWx0KQ0KLQl7DQotCQlyZXR1cm4gcmV0dXJuVmFsdWUobmV3IEJ5dGUocmVzdWx0KSk7DQotCX0NCi0NCi0JcHVibGljIFN0dWIgcmV0dXJuVmFsdWUoY2hhciByZXN1bHQpDQotCXsNCi0JCXJldHVybiByZXR1cm5WYWx1ZShuZXcgQ2hhcmFjdGVyKHJlc3VsdCkpOw0KLQl9DQotDQotCXB1YmxpYyBTdHViIHJldHVyblZhbHVlKHNob3J0IHJlc3VsdCkNCi0Jew0KLQkJcmV0dXJuIHJldHVyblZhbHVlKG5ldyBTaG9ydChyZXN1bHQpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3R1YiByZXR1cm5WYWx1ZShpbnQgcmVzdWx0KQ0KLQl7DQotCQlyZXR1cm4gcmV0dXJuVmFsdWUobmV3IEludGVnZXIocmVzdWx0KSk7DQotCX0NCi0NCi0JcHVibGljIFN0dWIgcmV0dXJuVmFsdWUobG9uZyByZXN1bHQpDQotCXsNCi0JCXJldHVybiByZXR1cm5WYWx1ZShuZXcgTG9uZyhyZXN1bHQpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3R1YiByZXR1cm5WYWx1ZShmbG9hdCByZXN1bHQpDQotCXsNCi0JCXJldHVybiByZXR1cm5WYWx1ZShuZXcgRmxvYXQocmVzdWx0KSk7DQotCX0NCi0NCi0JcHVibGljIFN0dWIgcmV0dXJuVmFsdWUoZG91YmxlIHJlc3VsdCkNCi0Jew0KLQkJcmV0dXJuIHJldHVyblZhbHVlKG5ldyBEb3VibGUocmVzdWx0KSk7DQotCX0NCi0NCi0JcHVibGljIFN0dWIgcmV0dXJuSXRlcmF0b3IoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKQ0KLQl7DQotCQlyZXR1cm4gbmV3IFJldHVybkl0ZXJhdG9yU3R1Yihjb2xsZWN0aW9uKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3R1YiByZXR1cm5JdGVyYXRvcihPYmplY3RbXSBhcnJheSkNCi0Jew0KLQkJcmV0dXJuIG5ldyBSZXR1cm5JdGVyYXRvclN0dWIoYXJyYXkpOw0KLQl9DQotDQotCXB1YmxpYyBTdHViIHRocm93RXhjZXB0aW9uKFRocm93YWJsZSB0aHJvd2FibGUpDQotCXsNCi0JCXJldHVybiBuZXcgVGhyb3dTdHViKHRocm93YWJsZSk7DQotCX0NCi0NCi0JcHVibGljIEludm9jYXRpb25NYXRjaGVyIG9uY2UoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IEludm9rZU9uY2VNYXRjaGVyKCk7DQotCX0NCi0NCi0JcHVibGljIEludm9jYXRpb25NYXRjaGVyIGF0TGVhc3RPbmNlKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBJbnZva2VBdExlYXN0T25jZU1hdGNoZXIoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSW52b2NhdGlvbk1hdGNoZXIgYXRNb3N0T25jZSgpDQotCXsNCi0JCXJldHVybiBuZXcgSW52b2tlQXRNb3N0T25jZU1hdGNoZXIoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSW52b2NhdGlvbk1hdGNoZXIgZXhhY3RseShpbnQgZXhwZWN0ZWRDb3VudCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBJbnZva2VDb3VudE1hdGNoZXIoZXhwZWN0ZWRDb3VudCk7DQotCX0NCi0NCi0JcHVibGljIEludm9jYXRpb25NYXRjaGVyIG5ldmVyKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBUZXN0RmFpbHVyZU1hdGNoZXIoIm5vdCBleHBlY3RlZCIpOw0KLQl9DQotDQotCXB1YmxpYyBJbnZvY2F0aW9uTWF0Y2hlciBuZXZlcihTdHJpbmcgZXJyb3JNZXNzYWdlKQ0KLQl7DQotCQlyZXR1cm4gbmV3IFRlc3RGYWlsdXJlTWF0Y2hlcigibm90IGV4cGVjdGVkICgiICsgZXJyb3JNZXNzYWdlICsgIikiKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNpbmNlIDEuMC4xDQotCSAqLw0KLQlwdWJsaWMgU3R1YiBvbkNvbnNlY3V0aXZlQ2FsbHMoU3R1Yi4uLiBzdHVicykNCi0Jew0KLQkJcmV0dXJuIG9uQ29uc2VjdXRpdmVDYWxscyhzdHVicyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzaW5jZSAxLjEuMA0KLQkgKi8NCi0JcHVibGljIFN0dWIgZG9BbGwoU3R1Yi4uLiBzdHVicykNCi0Jew0KLQkJcmV0dXJuIGRvQWxsKHN0dWJzKTsNCi0JfQ0KLQkNCi0JcHVibGljIENvbnN0cmFpbnQgY29sbGVjdGlvbldpdGhFbGVtZW50cyhmaW5hbCBpbnQgZXhwZWN0ZWRDb2xsZWN0aW9uU2l6ZSwgZmluYWwgT2JqZWN0Li4uIG9iamVjdHMpDQotCXsNCi0JCXJldHVybiBuZXcgQ29uc3RyYWludCgpew0KLQ0KLQkJCXB1YmxpYyBib29sZWFuIGV2YWwoT2JqZWN0IGFyZzApDQotCQkJew0KLQkJCQlmaW5hbCBDb2xsZWN0aW9uPD8+IGNvbCA9IChDb2xsZWN0aW9uPD8+KWFyZzA7DQotCQkJCWZvcihPYmplY3QgbyA6IG9iamVjdHMpDQotCQkJCXsNCi0JCQkJCWlmKCFjb2wuY29udGFpbnMobykpDQotCQkJCQl7DQotCQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCQ0KLQkJCQlyZXR1cm4gb2JqZWN0cy5sZW5ndGggPT0gZXhwZWN0ZWRDb2xsZWN0aW9uU2l6ZTsNCi0JCQl9DQotDQotCQkJcHVibGljIFN0cmluZ0J1ZmZlciBkZXNjcmliZVRvKFN0cmluZ0J1ZmZlciBhcmcwKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGFyZzA7DQotCQkJfX07DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay9Nb2NrLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL01vY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2MzYjlhOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL01vY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jazsNCi0NCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuRHluYW1pY01vY2s7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyBpcyBlcXVpdmFsZW50IHRvIDxjPm9yZy5qbW9jay5Nb2NrPC9jPiBjbGFzcyBmcm9tIEpNb2NrLiBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBhIHBhcmFtZXRlcml6ZWQgKGdlbmVyaWMpIHZlcnNpb24uIFRoaXMgbWFrZXMNCi0gKiBpdCBhIGxvdCBlYXNpZXIgZm9yIHVzZSBhcyBubyBtYW51YWwgY2FzdHMgdG8gdGhlIG1vY2tlZCB0eXBlIGFyZSByZXF1aXJlZCBieSB0aGUgcHJvZ3JhbW1lci4gVGhpcyBjbGFzcyBleHRlbmRzIGZyb20gPGM+b3JnLmptb2NrLk1vY2s8L2M+IHNvIGl0cw0KLSAqIGZ1bGx5IGJhY2t3YXJkIGNvbXBhdGlibGUuDQotICogDQotICogQHNlZSBvcmcuam1vY2suTW9jaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNb2NrPFQ+IGV4dGVuZHMgb3JnLmptb2NrLk1vY2sNCi17DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IG1vY2sgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS4gVGhlIG5ldyBtb2NrIGhhcyB0aGUgc3BlY2lmaWVkIG5hbWUuIFRoaXMgbmFtZSB3aWxsIGJlIHNob3duIGJ5IGFsbCByZXBvcnRzIGNvbmNlcm5pbmcgdGhpcyBtb2NrDQotCSAqIGluc3RhbmNlLiBTdWNoIHJlcG9ydHMgYXJlIHVubWFjaGVkIGludm9jYXRpb25zIGFuZCBzbyBvbi4NCi0JICogDQotCSAqIEBwYXJhbSBtb2NrZWRUeXBlIC0NCi0JICogICAgICAgICAgICB0aGUgdHlwZSB0byBiZSBtb2NrZWQuIFRoaXMgY291bGQgYmUgZWl0aGVyIGNsYXNzIG9yIGludGVyZmFjZS4NCi0JICogQHBhcmFtIG5hbWUgLQ0KLQkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhpcyBtb2NrDQotCSAqLw0KLQlwdWJsaWMgTW9jayhDbGFzczxUPiBtb2NrZWRUeXBlLCBTdHJpbmcgbmFtZSkNCi0Jew0KLQkJc3VwZXIobW9ja2VkVHlwZSwgbmFtZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdHMgYSBuZXcgbW9jayBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLg0KLQkgKiANCi0JICogQHBhcmFtIG1vY2tlZFR5cGUgLQ0KLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIHRvIGJlIG1vY2tlZC4gVGhpcyBjbGFzcyBuZWVkcyB0byBiZSBlaXRoZXIgY2xhc3Mgb3IgaW50ZXJmYWNlLg0KLQkgKi8NCi0JcHVibGljIE1vY2soQ2xhc3M8VD4gbW9ja2VkVHlwZSkNCi0Jew0KLQkJc3VwZXIobW9ja2VkVHlwZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdHMgbmV3IE1vY2sgdGhhdCB3cmFwcyB0aGUgc3VwcGxpZWQgPGM+RHluYW1pY01vY2s8L2M+IGluc3RhbmNlLg0KLQkgKiANCi0JICogQHBhcmFtIGFyZzAgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBkeW5hbWljIG1vY2sgaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBNb2NrKER5bmFtaWNNb2NrIGFyZzApDQotCXsNCi0JCXN1cGVyKGFyZzApOw0KLQl9DQotDQotCS8qKg0KLQkgKiBPYnRhaW5zIHRoZSBwcm94eSBpbnN0YW5jZSBmb3IgdGhpcyBtb2NrLg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgcHJveHkgaW5zdGFuY2UgZm9yIHRoaXMgbW9jay4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHVibGljIFQgcHJveHkoKQ0KLQl7DQotCQlyZXR1cm4gKFQpIHN1cGVyLnByb3h5KCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay9Nb2NrT2JqZWN0VGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svTW9ja09iamVjdFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQxMjYwNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay9Nb2NrT2JqZWN0VGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2s7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLnRlc3RjYXNlcy5CZWZvcmVBZnRlckVuYWJsZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2sudGVzdGNhc2VzLklCZWZvcmVBZnRlckVuYWJsZWQ7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLkNvcmVNb2NrOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5EeW5hbWljTW9jazsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuVmVyaWZpYWJsZTsNCi0NCi0NCi0vKioNCi0gKiBBbiB0ZXN0IGNhc2UgYmFzZSBjbGFzcyBmb3IgbW9jayBvYmplY3RzIHRlc3QgY2FzZS4gVGhpcyBvbmUgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvIG9yZy5qbW9jay5jZ2xpYi5Nb2NrT2JqZWN0VGVzdENhc2UuIFRoZXJlIGFyZSBzZXZlcmFsDQotICogaW1wb3J0YW50IGRpZmZlcmVuY2VzIHRob3VnaC4gVGhpcyB0ZXN0IGNhc2UgY2xhc3MgYXNzdW1lcyB0aGF0IHRoZSBsb2FkZXIgb2YgdGhlIHRlc3QgY2FzZSBjbGFzcyBpcyBhYmxlIHRvIGxvYWQgYm90aCB0aGUgY2xhc3MgYmVpbmcgbW9ja2VkIGFuZA0KLSAqIHRoZSBqbW9jayBjbGFzc2VzLiBUaHVzIHRlc3QgY2FzZSBjbGFzcyBsb2FkZXIgaXMgdXNlZCB0byBjcmVhdGUgdGhlIG1vY2sgdHlwZS4gVGhpcyBtb2NrIHRlc3QgY2FzZSBhbHNvIHByb3ZpZGVzIHR3byBuZXcgPGM+bW9jazwvYz4gbWV0aG9kcy4NCi0gKiBUaGVzZSBtZXRob2RzIGNhbiBpbnN0YW50aWF0ZSBhIG1vY2sgZm9yIGEgZ2l2ZW4gY2xhc3MgYnkgZXhlY3V0aW5nIHRoZSBjbGFzcydzIGNvbnN0cnVjdG9yLiBUaGUgbWV0aG9kcyA8Yz48L2M+IGFuZCA8Yz48L2M+IGluaGVyaXRlZCBmcm9tDQotICogPGM+QWJzdHJhY3RNb2NrT2JqZWN0VGVzdENhc2U8L2M+IGNyZWF0ZSBtb2NrcyB3aXRob3V0IGV4ZWN1dGluZyB0aGUgY29uc3RydWN0b3Igb2YgdGhlIG1vY2tlZCBjbGFzcy4gVGhleSB1c2UgdGhlIFNVTidzIHJlZmxlY3Rpb24gbWVjaGFuaXNtIGFuZA0KLSAqIGFyZSBhYmxlIHRvIGNyZWF0ZSBjbGFzc2VzIHdpdGhvdXQgYSB2aXNpYmxlIGRlZmF1bHQgY29uc3RydWN0b3Igb3Igd2l0aG91dCBjb25zdHJ1Y3RvciBhdCBhbGwuIFRoaXMgZnVuY3Rpb25hbGxpdHkgaG93ZXZlciBpcyBwbGF0Zm9ybSBzcGVjaWZpYy4NCi0gKiBJdCBjYW4gYmUgY29tcGlsZWQgYW5kIGV4ZWN1dGVkIG9ubHkgb24gU1VOIFZNcy4gU2hvdWxkIHRoZSBjb2RlIGJlIGV4ZWN1dGVkIG9uIGFub3RoZXIgVk0gbW9zdCBsaWtlbHkgYSA8Yz5Ob0NsYXNzRGVmRm91bmRFcnJvcjwvYz4gd2lsbCBvY3Vyci4NCi0gKiANCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2NrT2JqZWN0VGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdE1vY2tPYmplY3RUZXN0Q2FzZSBpbXBsZW1lbnRzIElCZWZvcmVBZnRlckVuYWJsZWQNCi17DQotCXByaXZhdGUgZmluYWwgQmVmb3JlQWZ0ZXJFbmFibGVyIGJhZSA9IG5ldyBCZWZvcmVBZnRlckVuYWJsZXIodGhpcyk7DQotCXB1YmxpYyB2b2lkIGFmdGVyVGVzdENhc2UoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBiZWZvcmVUZXN0Q2FzZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHJ1bkJhcmVJbnRlcm5hbCgpIHRocm93cyBUaHJvd2FibGUNCi0Jew0KLQkJc3VwZXIucnVuQmFyZSgpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBydW5CYXJlKCkgdGhyb3dzIFRocm93YWJsZQ0KLQl7DQotCQliYWUucnVuQmFyZSgpOw0KLQl9DQotCQ0KLQlwcml2YXRlIExpc3Q8TW9jazw/Pj4gbW9ja3NUb1ZlcmlmeSA9IG5ldyBWZWN0b3I8TW9jazw/Pj4oKTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdHMgYSBuZXcgPGM+TW9ja09iamVjdFRlc3RDYXNlPC9jPiBpbnN0YW5jZSB3aXRoIG5vIG5hbWUNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgTW9ja09iamVjdFRlc3RDYXNlKCkNCi0Jew0KLQl9DQotDQotCXB1YmxpYyBMaXN0PE1vY2s8Pz4+IGdldE1vY2tzVG9WZXJpZnkoKQ0KLQl7DQotCQlmaW5hbCBMaXN0PE1vY2s8Pz4+IGNvcHkgPSBuZXcgQXJyYXlMaXN0PE1vY2s8Pz4+KCk7DQotCQljb3B5LmFkZEFsbChtb2Nrc1RvVmVyaWZ5KTsNCi0JCXJldHVybiBjb3B5Ow0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyVG9WZXJpZnkoVmVyaWZpYWJsZSBhcmcwKQ0KLQl7DQotCQltb2Nrc1RvVmVyaWZ5LnJlbW92ZShhcmcwKTsNCi0JCXN1cGVyLnVucmVnaXN0ZXJUb1ZlcmlmeShhcmcwKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgdmVyaWZ5KCkNCi0Jew0KLQkJbW9ja3NUb1ZlcmlmeS5jbGVhcigpOw0KLQkJc3VwZXIudmVyaWZ5KCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdHMgYSBuZXcgPGM+TW9ja09iamVjdFRlc3RDYXNlPC9jPiBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQ0KLQkgKiANCi0JICogQHBhcmFtIG5hbWUgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoaXMgdGVzdCBjYXNlLg0KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZQ0KLQkgKi8NCi0JcHVibGljIE1vY2tPYmplY3RUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0Jew0KLQkJc3VwZXIobmFtZSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCA8VD4gRHluYW1pY01vY2sgbmV3Q29yZU1vY2soQ2xhc3M8VD4gbW9ja2VkVHlwZSwgU3RyaW5nIHJvbGVOYW1lKQ0KLQl7DQotCQlyZXR1cm4gbmV3IENvcmVNb2NrKG1vY2tlZFR5cGUsIHJvbGVOYW1lKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL1N0dWJVdGlscy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay9TdHViVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTVhYzg3Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL1N0dWJVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jazsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLlN0dWI7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLnN0dWIuUmV0dXJuU3R1YjsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuc3R1Yi5TdHViU2VxdWVuY2U7DQotDQotLyoqDQotICogVXRpbHMgZm9yIGNyZWF0aW5nIG1vcmUgY29tcGxleCBqbW9jayBzdHVicw0KLSAqIA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICogDQotICovDQotcHVibGljIGNsYXNzIFN0dWJVdGlscw0KLXsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBzdHViIHRoYXQgd2lsbCByZXR1cm4gdGhlIHByb3h5IGZvciB0aGUgbmV4dCBtb2NrIGluIHRoZSBzdXBwbGllZCBhcnJheSBvbiBhIGNvbnNlcXV0aXZlIGNhbGwuIEkuZS4gdGhlIGZpcnN0IGNhbGwgcmV0dXJucyB0aGUgcHJveHkNCi0JICogYXQgPGM+cmV0dXJuVmFsdWVzWzBdPC9jPiwgdGhlIHNlY29uZCBjYWxsIHdpbGwgcmV0dXJuIHRoZSBwcm94eSBmb3IgdGhlIG1vY2sgYXQgPGM+cmV0dXJuVmFsdWVzWzFdPC9jPiwgYW5kIHNvIGZvcnRoDQotCSAqIA0KLQkgKiBAcGFyYW0gcmV0dXJuVmFsdWVzIC0NCi0JICogICAgICAgICAgICB0aGUgbW9ja3Mgd2hpY2ggd2lsbCBiZSByZXR1cm5lZCBvbiBjb25zZXF1dGl2ZSBjYWxscw0KLQkgKiBAcmV0dXJuIC0gYSBzdHViIHRoYXQgd2lsbCByZXR1cm4gdGhlIHByb3hpZXMgZm9yIHRoZSBzcGVjaWZpZWQgbW9ja3Mgb24gZWFjaCBjb25zZXF1dGl2ZSBjYWxsDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0dWIgb25Db25zZXF1dGl2ZUNhbGxzV2lsbFJldHVybk1vY2tzKE1vY2s8Pz5bXSByZXR1cm5WYWx1ZXMpDQotCXsNCi0JCWZpbmFsIFN0dWJbXSByZXR1cm5TdHVicyA9IG5ldyBTdHViW3JldHVyblZhbHVlcy5sZW5ndGhdOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXR1cm5WYWx1ZXMubGVuZ3RoOyBpKyspDQotCQl7DQotCQkJcmV0dXJuU3R1YnNbaV0gPSBuZXcgUmV0dXJuU3R1YihyZXR1cm5WYWx1ZXNbaV0ucHJveHkoKSk7DQotCQl9DQotCQlyZXR1cm4gbmV3IFN0dWJTZXF1ZW5jZShyZXR1cm5TdHVicyk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDb252ZXJ0cyBhbiBhcnJheSBvZiBtb2NrcyB0byBhbiBhcnJheSBvZiBwcm94aWVzIGZvciB0aGVzZSBtb2Nrcy4gQWxsIG1vY2tzIHNob3VsZCBiZSBtb2NrcyBmb3Igb25lIGFuZCB0aGUNCi0JICogc2FtZSB0eXBlLg0KLQkgKiBAcGFyYW0gPFQ+IC0gdGhlIHR5cGUgb2YgdGhlIG1vY2tlZCBjbGFzcw0KLQkgKiBAcGFyYW0gbW9ja3MgLSB0aGUgYXJyYXkgb2YgbW9ja3MgdG8gYmUgY29udmVydGVkIHRvIHByb3hpZXMNCi0JICogQHBhcmFtIHByb3hpZXMgLSBhbiBhcnJheSBvZiB0aGUgdHlwZSBvZiB0aGUgcHJveHkuIEl0IHdpbGwgYmUgdXNlZCB0byBzdG9yZSB0aGUgcHJveGllcyBmb3IgdGhlIG1vY2tzDQotCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAtIHRocm93biBpZiB0aGUgYXJyYXlzIGFyZSB3aXRoIGRpZmZlcmVudCBzaXplcy4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgPFQ+IHZvaWQgbW9ja3NUb1Byb3hpZXMoTW9jazxUPltdIG1vY2tzLCBUW10gcHJveGllcykgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2Nrcy5sZW5ndGg7IGkrKykNCi0JCXsNCi0JCQlwcm94aWVzW2ldID0gbW9ja3NbaV0ucHJveHkoKTsNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZXMgYSByZXR1cm4gc3R1YiB0aGF0IHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIG1vY2sgcHJveGllcyBmb3IgdGhlIHN1cHBsaWVkIGFycmF5IG9mIG1vY2tzLg0KLQkgKiBAcGFyYW0gcmV0dXJuVmFsdWVzIC0gYW4gYXJyYXkgb2YgbW9ja3MsIHdob3NlIHByb3hpZXMgaGFzIHRvIGJlIHJldHVybmVkDQotCSAqIEByZXR1cm4gLSBhIHN0dWIgd2ljaCB3aWxsIHJldHVybiBhbiBhcnJheSBvZiBwcm94aWVzIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBwYXNzZWQgbW9ja3MuDQotCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAtIGlmIHRoZSB0d28gYXJyYXlzIGFyZSB3aXRoIGRpZmZlcmVudCBsZW5ndGhzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIDxUPlN0dWIgcmV0dXJuQXJyYXlPZk1vY2tzKE1vY2s8VD5bXSByZXR1cm5WYWx1ZXMsIFRbXSBwcm94aWVzKQ0KLQl7DQotCQltb2Nrc1RvUHJveGllcyhyZXR1cm5WYWx1ZXMsIHByb3hpZXMpOw0KLQkJcmV0dXJuIG5ldyBSZXR1cm5TdHViKHByb3hpZXMpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgc3R1YiB0aGF0IG9uIGNvbnNlcXV0aXZlIGNhbGxzIHdpbGwgcmV0dXJuIHRoZSBuZXh0IGJvb2xlYW4gaW4gdGhlIHN1cHBsaWVkIGFycmF5IEkuZS4gdGhlIGZpcnN0IGNhbGwgcmV0dXJucyB0aGUgYm9vbGVhbiBhdA0KLQkgKiA8Yz5yZXR1cm5WYWx1ZXNbMF08L2M+LCB0aGUgc2Vjb25kIGNhbGwgd2lsbCByZXR1cm4gdGhlIGJvb2xlYW4gYXQgPGM+cmV0dXJuVmFsdWVzWzFdPC9jPiwgYW5kIHNvIGZvcnRoDQotCSAqIA0KLQkgKiBAcGFyYW0gcmV0dXJuVmFsdWVzIC0NCi0JICogICAgICAgICAgICB0aGUgYm9vbGVhbnMgd2hpY2ggd2lsbCBiZSByZXR1cm5lZCBvbiBjb25zZXF1dGl2ZSBjYWxscw0KLQkgKiBAcmV0dXJuIC0gYSBzdHViIHRoYXQgd2lsbCByZXR1cm4gdGhlIGJvb2xlYW5zIGZvciBlYWNoIGNvbnNlcXV0aXZlIGNhbGwNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3R1YiBvbkNvbnNlY3V0aXZlQ2FsbHNXaWxsUmV0dXJuQm9vbGVhbihib29sZWFuW10gcmV0dXJuVmFsdWVzKQ0KLQl7DQotCQlmaW5hbCBTdHViW10gcmV0dXJuU3R1YnMgPSBuZXcgU3R1YltyZXR1cm5WYWx1ZXMubGVuZ3RoXTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmV0dXJuVmFsdWVzLmxlbmd0aDsgaSsrKQ0KLQkJew0KLQkJCXJldHVyblN0dWJzW2ldID0gbmV3IFJldHVyblN0dWIocmV0dXJuVmFsdWVzW2ldKTsNCi0JCX0NCi0JCXJldHVybiBuZXcgU3R1YlNlcXVlbmNlKHJldHVyblN0dWJzKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIDxUPiBTdHViIHJldHVybkNvbGxlY3Rpb25Db250YWluaW5nKFRbXSBjb250YWluZWQpIHsNCi0JCWZpbmFsIENvbGxlY3Rpb248VD4gY29sbCA9IG5ldyBBcnJheUxpc3Q8VD4oKTsNCi0JCWZvcihUIG8gOiBjb250YWluZWQpIHsNCi0JCQljb2xsLmFkZChvKTsNCi0JCX0NCi0JCXJldHVybiBuZXcgUmV0dXJuU3R1Yihjb2xsKTsNCi0JfQ0KLQkNCi0JcHVibGljIHN0YXRpYyA8VD4gU3R1YiByZXR1cm5Db2xsZWN0aW9uQ29udGFpbmluZyhUIGNvbnRhaW5lZCkgew0KLQkJZmluYWwgQ29sbGVjdGlvbjxUPiBjb2xsID0gbmV3IEFycmF5TGlzdDxUPigxKTsNCi0JCWNvbGwuYWRkKGNvbnRhaW5lZCk7DQotCQlyZXR1cm4gbmV3IFJldHVyblN0dWIoY29sbCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay90ZXN0Y2FzZXMvQmVmb3JlQWZ0ZXJFbmFibGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL3Rlc3RjYXNlcy9CZWZvcmVBZnRlckVuYWJsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDlkMTY1MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL3Rlc3RjYXNlcy9CZWZvcmVBZnRlckVuYWJsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogVGhpcyBjbGFzcyBpcyBiYXNlZCBvbiB3b3JrIGJ5IFNoYXkgQmFub24gKGh0dHA6Ly93d3cua2ltY2h5Lm9yZy9iZWZvcmVfYWZ0ZXJfdGVzdGNhc2Vfd2l0aF9qdW5pdC8pDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2sudGVzdGNhc2VzOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBCZWZvcmVBZnRlckVuYWJsZXIgew0KLQkNCi0JcHJpdmF0ZSBmaW5hbCBJQmVmb3JlQWZ0ZXJFbmFibGVkIHRjOw0KLQkNCi0gICAgcHJpdmF0ZSBpbnQgdGVzdENvdW50ID0gMDsNCi0gDQotICAgIHByaXZhdGUgZmluYWwgaW50IHRvdGFsVGVzdENvdW50Ow0KLSANCi0gICAgcHJpdmF0ZSBib29sZWFuIGRpc2FibGVBZnRlclRlc3RDYXNlID0gZmFsc2U7DQotIA0KLSAgICBwdWJsaWMgQmVmb3JlQWZ0ZXJFbmFibGVyKElCZWZvcmVBZnRlckVuYWJsZWQgdGMpIHsNCi0gICAgCXRoaXMudGMgPSB0YzsNCi0gICAgCXRvdGFsVGVzdENvdW50ID0gY291bnRUb3RhbFRlc3RzKCk7DQotICAgIH0NCi0gDQotICAgIHB1YmxpYyB2b2lkIHJ1bkJhcmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsNCi0gICAgICAgIFRocm93YWJsZSBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgaWYgKHRlc3RDb3VudCA9PSAwKSB7DQotICAgICAgICAgICAgYmVmb3JlVGVzdENhc2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRlc3RDb3VudCsrOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB0Yy5ydW5CYXJlSW50ZXJuYWwoKTsNCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBydW5uaW5nKSB7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gcnVubmluZzsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh0ZXN0Q291bnQgPT0gdG90YWxUZXN0Q291bnQpIHsNCi0gICAgICAgICAgICBpZiAoIWRpc2FibGVBZnRlclRlc3RDYXNlKSB7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICBhZnRlclRlc3RDYXNlKCk7DQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBhZnRlclRlc3RDYXNlKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uID09IG51bGwpIGV4Y2VwdGlvbiA9IGFmdGVyVGVzdENhc2U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBkaXNhYmxlQWZ0ZXJUZXN0Q2FzZSA9IGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkgdGhyb3cgZXhjZXB0aW9uOw0KLSAgICB9DQotIA0KLSAgICBwdWJsaWMgdm9pZCBkaXNhYmxlQWZ0ZXJUZXN0Q2FzZSgpIHsNCi0gICAgICAgIGRpc2FibGVBZnRlclRlc3RDYXNlID0gdHJ1ZTsNCi0gICAgfQ0KLSANCi0gICAgLyoqDQotICAgICAqIENhbGxlZCBiZWZvcmUgYW55IHRlc3RzIHdpdGhpbiB0aGlzIHRlc3QgY2FzZS4NCi0gICAgICoNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIGJlZm9yZVRlc3RDYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgIAl0Yy5iZWZvcmVUZXN0Q2FzZSgpOw0KLSAgICB9DQotIA0KLSAgICAvKioNCi0gICAgICogQ2FsbGVkIGFmdGVyIGFsbCB0aGUgdGVzdHMgd2l0aGluIHRoZSB0ZXN0IGNhc2UNCi0gICAgICogaGF2ZSBleGVjdXRlZC4NCi0gICAgICoNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIGFmdGVyVGVzdENhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgCXRjLmFmdGVyVGVzdENhc2UoKTsNCi0gICAgfQ0KLSANCi0gICAgcHJpdmF0ZSBpbnQgY291bnRUb3RhbFRlc3RzKCkgew0KLSAgICAgICAgaW50IGNvdW50ID0gMDsNCi0gICAgICAgIENsYXNzPD8+IHN1cGVyQ2xhc3MgPSB0Yy5nZXRDbGFzcygpOw0KLSAgICAgICAgVmVjdG9yPFN0cmluZz4gbmFtZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsNCi0gICAgICAgIHdoaWxlIChUZXN0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oc3VwZXJDbGFzcykpIHsNCi0gICAgICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gc3VwZXJDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKTsNCi0gICAgICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbWV0aG9kLmdldE5hbWUoKTsNCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzLmNvbnRhaW5zKG5hbWUpKQ0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIG5hbWVzLmFkZEVsZW1lbnQobmFtZSk7DQotICAgICAgICAgICAgICAgIGlmIChpc1Rlc3RNZXRob2QobWV0aG9kKSkgew0KLSAgICAgICAgICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBzdXBlckNsYXNzID0gc3VwZXJDbGFzcy5nZXRTdXBlcmNsYXNzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY291bnQ7DQotICAgIH0NCi0gDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1Rlc3RNZXRob2QoTWV0aG9kIG0pIHsNCi0gICAgICAgIFN0cmluZyBuYW1lID0gbS5nZXROYW1lKCk7DQotICAgICAgICBDbGFzczw/PltdIHBhcmFtZXRlcnMgPSBtLmdldFBhcmFtZXRlclR5cGVzKCk7DQotICAgICAgICBDbGFzczw/PiByZXR1cm5UeXBlID0gbS5nZXRSZXR1cm5UeXBlKCk7DQotICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5sZW5ndGggPT0gMCAmJiBuYW1lLnN0YXJ0c1dpdGgoInRlc3QiKSAmJiByZXR1cm5UeXBlLmVxdWFscyhWb2lkLlRZUEUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svdGVzdGNhc2VzL0JlZm9yZUFmdGVyVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svdGVzdGNhc2VzL0JlZm9yZUFmdGVyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWVhYmE3Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL3Rlc3RjYXNlcy9CZWZvcmVBZnRlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2sudGVzdGNhc2VzOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJlZm9yZUFmdGVyVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSBpbXBsZW1lbnRzIElCZWZvcmVBZnRlckVuYWJsZWQgew0KLQkNCi0JcHJpdmF0ZSBmaW5hbCBCZWZvcmVBZnRlckVuYWJsZXIgYmZlID0gbmV3IEJlZm9yZUFmdGVyRW5hYmxlcih0aGlzKTsNCi0JDQotCXB1YmxpYyB2b2lkIHJ1bkJhcmVJbnRlcm5hbCgpIHRocm93cyBUaHJvd2FibGUgew0KLQkJc3VwZXIucnVuQmFyZSgpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBydW5CYXJlKCkgdGhyb3dzIFRocm93YWJsZSB7DQotCQliZmUucnVuQmFyZSgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svdGVzdGNhc2VzL0VxdWFsc1Rlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL3Rlc3RjYXNlcy9FcXVhbHNUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZWQwZTI0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svdGVzdGNhc2VzL0VxdWFsc1Rlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLnRlc3RjYXNlczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLS8qKg0KLSAqIEFuIGFic3RyYWN0IHRlc3QgY2FzZSBmb3IgdGhlIDxjPk9iamVjdC5lcXVhbHMoT2JqZWN0KTwvYz4gYW5kIDxjPk9iamVjdC5oYXNoQ29kZSgpPC9jPiBtZXRob2RzLiBUaGlzIHRlc3QgY2FzZSBwZXJmb3JtcyB0aGUgdGVzdHMgZm9yIDxjPmVxdWFsczwvYz4NCi0gKiBhbmQgPGM+aGFzaENvZGU8L2M+IHNpbXVsdGFuaWVzbHkgYXMgdGhleSBhcmUgdGlnaHRseSBjb25uZWN0ZWQuIFRoZSB0ZXNjYXNlIHRlc3QgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG9mIGVxdWFscy9oYXNDb2RlOg0KLSAqIDxwPg0KLSAqIDEuIGVxdWFscyByZWZsZXhpdml0eSAyLiBlcXVhbHMgc3ltZXRyaWNpdHkgMy4gZXF1YWxzIHRyYW5zaXRpdnl0ZSA0LiBoYXNoQ29kZSBzdGF0YmlsaXR5IDUuIGhhc2hDb2RlIGltbXV0YWJpbGl0eSA2LiBlcXVhbHMgaXMgc3VpdGFibGUgZm9yDQotICogc3ViY2xhc3Nlcw0KLSAqIDwvcD4NCi0gKiANCi0gKiBUaGUgdGVzdCBjYXNlcyBpcyBhYnN0cmFjdCBhbmQgbmVlZCB0byBiZSBzdWJsY2Fzc2VkIGJ5IGNvbmNyZXRlIHRlc3QgY2FzZS4gU2V2ZXJhbCBhYnN0cmFjdCBtZXRob2RzIG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY29uY3JldGUgdGVzdCBjYXNlcy4NCi0gKiANCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqIA0KLSAqIEBwYXJhbSA8VD4NCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXF1YWxzVGVzdENhc2U8VD4gZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0NCi0JcHJpdmF0ZSBmaW5hbCBDbGFzczxUPiB0ZXN0Q2xhc3M7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbmV3IDxjPkVxdWFsc1Rlc3RDYXNlPC9jPiBpbnN0YW5jZSB0byB0ZXN0IHRoZSBlcXVhbHMgbWV0aG9kIG9mIHRoZSBzdXBwbGllZCBjbGFzcw0KLQkgKiANCi0JICogQHBhcmFtIHRlc3RDbGFzcyAtDQotCSAqICAgICAgICAgICAgdGhlIGNsYXNzIHdob3NlIGVxdWFscyBtZXRob2Qgd2lsbCBiZSB0ZXN0ZWQNCi0JICovDQotCXB1YmxpYyBFcXVhbHNUZXN0Q2FzZShDbGFzczxUPiB0ZXN0Q2xhc3MpDQotCXsNCi0JCXRoaXMobnVsbCwgdGVzdENsYXNzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIG5ldyA8Yz5FcXVhbHNUZXN0Q2FzZTwvYz4gaW5zdGFuY2UgdG8gdGVzdCB0aGUgZXF1YWxzIG1ldGhvZCBvZiB0aGUgc3VwcGxpZWQgY2xhc3MuIFRoaXMgdGVzdCBjYXNlIGFsc28gdGFrZXMgYSBuYW1lIHBhcmFtdGVyLCB3aGljaA0KLQkgKiBpIHBhc3NlZCB0byA8Yz5UZXN0Q2FzZTwvYz4gc3VwZXIgY29uc3RydWN0b3IuIEkuZS4gdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlDQotCSAqIA0KLQkgKiBAcGFyYW0gbmFtZSAtDQotCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgdGVzdCBjYXNlDQotCSAqIEBwYXJhbSB0ZXN0Q2xhc3MgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBjbGFzcyB3aG9zZSBlcXVhbHMgbWV0aG9kIHdpbGwgYmUgdGVzdGVkDQotCSAqLw0KLQlwdWJsaWMgRXF1YWxzVGVzdENhc2UoU3RyaW5nIG5hbWUsIENsYXNzPFQ+IHRlc3RDbGFzcykNCi0Jew0KLQkJYXNzZXJ0Tm90TnVsbCgidGVzdCBjbGFzcyBwYXNzZWQgaW4gY29uc3RydWN0b3Igd2FzIG51bGwiLCB0ZXN0Q2xhc3MpOw0KLQkJdGhpcy50ZXN0Q2xhc3MgPSB0ZXN0Q2xhc3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIE9idGFpbnMgYSBuZXcgaXRlcmF0b3Igb2YgaW5zdGFuY2VzIGZvciB0aGUgdGVzdGVkIGNsYXNzLg0KLQkgKiANCi0JICogQHBhcmFtIGl0ZXJhdGlvbnMgLQ0KLQkgKiAgICAgICAgICAgIG51bWJlciBvZiBpdGVyYXRpb25zIGkuZSB0aGUgbnVtYmVyIG9mIHRpbWVzIG9uZSBjYW4gaW52b2tlIDxjPkl0ZXJhdG9yLm5leHQoKTwvYz4gd2l0aG91dGggZ2V0dGluZyA8Yz5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uPC9jPg0KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbg0KLQkgKiBAcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9mIGluc3RhbmNlZCBmb3IgdGhlIHRlc3RlZCBjbGFzczsNCi0JICovDQotCWFic3RyYWN0IHB1YmxpYyBJdGVyYXRvcjxUPiBuZXdPYmplY3RJdGVyYXRvcihpbnQgaXRlcmF0aW9ucyk7DQotDQotCS8qKg0KLQkgKiBPYnRhaW5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0ZWQgY2xhc3MuIEVhY2ggY2FsbCB0byB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgbmV3IGluc3RhbmNlLCB3aGljaCBpcyBjb25zaWRlcmVkIGVxdWFsIHRvIHRoZSBpbnN0YW5jZQ0KLQkgKiByZXR1cm5lZCBieSB0aGUgcHJlZnZpb3VzIGNhbGwgYnV0IGlzIG5vdCBpZGVudGljYWwuIEZvciBleGFtcGxlIGlmIHRoZSB0ZXN0ZWQgY2xhc3Mgd2FzIDxjPlN0cmluZzwvYz4gdGhlIG1vc3Qgb2J2aW91cyBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzDQotCSAqIG1ldGhvZCB3b3VsZCBiZSA8Yz4NCi0JICogPHA+DQotCSAqIHJldHVybiBuZXcgU3RyaW5nKCJ0ZXN0IHN0cmluZyIpDQotCSAqIDwvcD4NCi0JICogPC9jPg0KLQkgKiANCi0JICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdCBjbGFzcyBhc3N1bWVkIHRvIGJlIGVxdWFsIHRvIHRoZSBwcmV2aW91c2x5IHJldHVybmVkIGluc3RhbmNlcw0KLQkgKi8NCi0JYWJzdHJhY3QgcHVibGljIFQgbmV3RXF1YWxJbnN0YW5jZSgpOw0KLQ0KLQkvKioNCi0JICogT2J0YWlucyBhIG5ldyBpbnN0YW5jZSBvZiBhIHNpbmdsZSBjbGFzcywgd2hpY2ggaXMgYSBzdWJjbGFzcyBvZiB0aGUgdGVzdGVkIGNsYXNzLiBUaGUgc3ViY2xhc3MgbXVzdCBub3Qgb3ZlcnJpZGUgdGhlIDxjPmVxdWFsczwvYz4gbWV0aG9kIG9mDQotCSAqIHRoZSB0ZXN0ZWQgY2xhc3MuIEFsbCBpbnN0YW5jZXMgc2hvdWxkIGJlIGVxdWFsLiBUaGUgcmV0dXJuZWQgaW5zdGFuY2VzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHZhbHVlcyBvZiBhbGwgdGhlIGluaGVyaXRlZCBmaWVsZHMgYXMgdGhlDQotCSAqIGluc3RhbmNlcyByZXR1cmVkIGJ5IDxjPm5ld0VxdWFsSW5zdGFuY2U8L2M+DQotCSAqIA0KLQkgKiBAcmV0dXJuIHJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2Ygc2luZ2xlIHN1YmxjYXNzIG9mIHRoZSB0ZXN0ZWQgY2xhc3MuIEVhY2ggY2FsbCBzaG91bGQgcmV0dXJuIGFuIGluc3RhbmNlIGVxdWFsIHRvIHRoZSBwcmV2aW91c2x5IHJldHVybmVkIGJ1dA0KLQkgKiAgICAgICAgIG5vdCBpZGVudGljYWwuIE51bGwgaWYgdGhlIHRlc3RlZCBjbGFzcyBpcyBmaW5hbA0KLQkgKi8NCi0JYWJzdHJhY3QgcHVibGljIFQgbmV3QW5jZXN0b3JFcXVhbEluc3RhbmNlKCk7DQotDQotCS8qKg0KLQkgKiBPYnRhaW5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0aGUgdGVzdGVkIGNsYXNzLiBUaGUgc2luZ2xlIHJlc3RyaWN0aW9uIG9uIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgaXMgdGhhdCB0aGV5IHNob3VsZCBub3QgYmUgZXF1YWwgdG8gdGhlDQotCSAqIGluc3RhbmNlcyByZXR1cm5lZCBieSA8Yz5uZXdFcXVhbEluc3RhbmNlPC9jPg0KLQkgKiANCi0JICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdCBjbGFzcy4gVGhlIG5ld2x5IHJldHVybmVkIGluc3RhbmNlIGlzIG5vdCBlcXVhbCB0byB0aGUgaW5zdGFuY2VzIHJldHVybmVkIGJ5IDxjPm5ld0VxdWFsSW5zdGFuY2U8L2M+DQotCSAqLw0KLQlhYnN0cmFjdCBwdWJsaWMgVCBuZXdOb25FcXVhbEluc3RhbmNlKCk7DQotDQotCS8qKg0KLQkgKiBNb2RpZmllcyBhIGdpdmVuIGluc3RhbmNlIG9mIHRoZSB0ZXN0ZWQgY2xhc3MuIFRoZSBpbnN0YW5jZSBzaG91bGQgYmUgbW9kaWZpZWQgaW4gc3VjaCBhIHdheSB0aGF0IGl0J3Mgbm90IGVxdWFsIHRvIHRoZSBpbnN0YW5jZXMgcmV0dXJlZCBieQ0KLQkgKiA8Yz5uZXdFcXVhbEluc3RhbmNlPC9jPiBhbnMgPGM+bmV3Tm9uZUVxdWFsSW5zdGFuY2UoKTwvYz4uIElmIHRoZSB0ZXN0ZWQgY2xhc3MgaXMgaW1tdXRhYmxlIHRoZW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBiZQ0KLQkgKiBlbXB0eQ0KLQkgKiANCi0JICogQHBhcmFtIGluc3RhbmNlIC0NCi0JICogICAgICAgICAgICB0aGUgaW5zdGFuY2UgdG8gYmUgbW9kaWZpZWQuDQotCSAqLw0KLQlhYnN0cmFjdCBwdWJsaWMgdm9pZCBtb2RpZnlPYmplY3RJbnN0YW5jZShUIGluc3RhbmNlKTsNCi0NCi0JLyoqDQotCSAqIE9idGFpbnMgdGhlIG51bWJlciBvZiBjb21wYXJpc29ucyB0aGF0IHdpbGwgYmUgbWFkZSBmb3IgdGhlIHJlZmxleGl2aXR5IHRlc3QuIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZW4gYnkgc3ViY2xhc3NlcyB0byBzcGVjaWZ5IGEgZGlmZmVyZW50DQotCSAqIHZhbHVlLiBCeSBkZWZhdWx0IHRoaXMgbnVtYmVyIGlzIDEwMC4NCi0JICogDQotCSAqIEByZXR1cm4gLSB0aGUgbnVtYmVyIG9mIGNvbXBhcmlzb25zIHRoYXQgd2lsbCBiZSBtYWRlIGZvciB0aGUgcmVmbGV4aXZpdHkgdGVzdC4NCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0SXRlcmF0aW9uc0ZvclJlZmxpeGl2aXR5VGVzdCgpDQotCXsNCi0JCXJldHVybiAxMDA7DQotCX0NCi0NCi0JLyoqDQotCSAqIE9iYXRhaW5zIHRoZSBudW1iZXIgb2YgY29tcGFyaXNvbnMgdGhhdCB3aWxsIGJlIG1hZGUgZm9yIHRoZSBzeW1pdHJpY2l0eSB0ZXN0LiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGUgYnkgc3ViY2xhc3NlcyB0byBzcGVjaWZ5IGEgZGlmZmVyZW50DQotCSAqIHZhbHVlLiBCeSBkZWZhdWx0IHRoaXMgbnVtYmVyIGlzIDEwMDANCi0JICogDQotCSAqIEByZXR1cm4gLSB0aGUgbnVtYmVyIG9mIGNvbXBhcmlzb25zIHRoYXQgd2lsbCBiZSBtYWRlIGZvciB0aGUgcmVmbGl4aXZpdHkgdGVzdC4NCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0SXRlcmF0aW9uc0ZvclN5bWV0cmljaXR5VGVzdCgpDQotCXsNCi0JCXJldHVybiAxMDAwOw0KLQl9DQotDQotCS8qKg0KLQkgKiBPYmF0YWlucyB0aGUgbnVtYmVyIG9mIGNvbXBhcmlzb25zIHRoYXQgd2lsbCBiZSBtYWRlIGZvciB0aGUgdHJhbnNpdGl2aXR5IHRlc3QuIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZSBieSBzdWJjbGFzc2VzIHRvIHNwZWNpZnkgYQ0KLQkgKiBkaWZmZXJlbnQgdmFsdWUuIEJ5IGRlZmF1bHQgdGhpcyBudW1iZXIgaXMgMjAwMA0KLQkgKiANCi0JICogQHJldHVybiAtIHRoZSBudW1iZXIgb2YgY29tcGFyaXNvbnMgdGhhdCB3aWxsIGJlIG1hZGUgZm9yIHRoZSB0cmFuc2l0aXZpdHkgdGVzdC4NCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0SXRlcmF0aW9uc0ZvclRyYW5zaXRpdml0eVRlc3QoKQ0KLQl7DQotCQlyZXR1cm4gMjAwMDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGVzdHMgdGhhdCBlcXVhbHMgaXMgcmVmbGV4aXZlLiBJdCBlbmZvcmNlcyB0aGUgcnVsZSBhLmVxdWFscyhhKSA9PSB0cnVlLiBUaGlzIHRlc3QgYWxzbyB0ZXN0cyB0aGF0IGhhc2hDb2RlIGZ1bmN0aW9uIGlzIHN0YWJsZSgpLiBJLmUuDQotCSAqIGhhc2hDb2RlIGRvZXNuJ3QgY2hhbmdlIGl0J3MgdmFsdWUgYmV0d2VlbiBzZXZlcmFsIGludm9jYXRpb25zLCBhcyB3ZWxsIGFzIHRoYXQgaGFzaENvZGUgaXMgaW1tdXRhYmxlIG92ZXIgb2JqZWN0IGNoYW5nZS4gVGhlIHRlc3Qgc3RyYXRlZ3kgaXMNCi0JICogdG8gY3JlYXRlIGFuIG5ldyBvYmplY3QgaXRlcmF0b3IgYW5kIHRoZW4gZm9yIGVhY2ggcmV0dXJuZWQgaW5zdGFuY2U6DQotCSAqIA0KLQkgKiA8b2w+DQotCSAqIDxsaT5Db21wYXJlIGl0IHdpdGggaXRzZWxmPC9saT4NCi0JICogPGxpPmNoZWNrIHRoYXQgaXRzIGhhc2ggY29kZSBzdGF5cyB0aGUgc2FtZTwvbGk+DQotCSAqIDxsaT5tb2RpZnkgdGhlIHJldHVybmVkIGluc3RhbmNlIGJ5IGNhbGxpbmcgPGM+bW9kaWZ5SW5zdGFuY2U8L2M+IGFuZCB0aGVuIGNoZWNrIHRoZSBoYXNoQ29kZSBhZ2FpbjwvbGk+DQotCSAqIDwvb2w+DQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEVxdWxzUmVmbGV4aXZlKCkNCi0Jew0KLQkJZmluYWwgaW50IGl0ZXJhdGlvbnNGb3JUaGlzVGVzdCA9IGdldEl0ZXJhdGlvbnNGb3JSZWZsaXhpdml0eVRlc3QoKTsNCi0JCWZpbmFsIEl0ZXJhdG9yPFQ+IG9iamVjdFRpdGVyYXRvciA9IG5ld09iamVjdEl0ZXJhdG9yKGl0ZXJhdGlvbnNGb3JUaGlzVGVzdCk7DQotCQl3aGlsZSAob2JqZWN0VGl0ZXJhdG9yLmhhc05leHQoKSkNCi0JCXsNCi0JCQlmaW5hbCBUIG9iamVjdFQgPSBvYmplY3RUaXRlcmF0b3IubmV4dCgpOw0KLQkJCWFzc2VydFRydWUoImVxdWFscyBpcyBub3QgcmVmbGV4aXZlIiwgb2JqZWN0VC5lcXVhbHMob2JqZWN0VCkpOw0KLQkJCWZpbmFsIGludCBpbml0aWFsSGFzaENvZGUgPSBvYmplY3RULmhhc2hDb2RlKCk7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zRm9yVGhpc1Rlc3Q7IGkrKykNCi0JCQl7DQotCQkJCWFzc2VydEVxdWFscygiaGFzaENvZGUgaXMgbm90IHN0YWJsZSB1cG9uIG11bHRpcGxlIGNhbGxzIiwgaW5pdGlhbEhhc2hDb2RlLCBvYmplY3RULmhhc2hDb2RlKCkpOw0KLQkJCX0NCi0JCQltb2RpZnlPYmplY3RJbnN0YW5jZShvYmplY3RUKTsNCi0JCQlhc3NlcnRFcXVhbHMoImhhc2hDb2RlIGlzIG5vdCBzdGFibGUgdXBvbiBtb2RpZmljYXRpb24gb2YgdGhlIG9iamVjdCIsIGluaXRpYWxIYXNoQ29kZSwgb2JqZWN0VC5oYXNoQ29kZSgpKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogVGVzdHMgdGhhdCBlcXVhbHMgaXMgc3ltZXRyaWMgaS5lLiBhLmVxdWFscyhiKSA8PT0+IGIuZXF1YWxzKGEpLiBUaGlzIG1ldGhvZCBhbHNvIHRlc3RzIHRoYXQgaGFzaENvZGUgYmVoYXZlcyBjb3JyZWN0bHkgaW4gc2Vuc2UgYS5xdWFscyhiKSA9Pg0KLQkgKiBhLmhhc2hDb2RlKCkgPT0gYi5oYXNoQ29kZSgpLiBUaGlzIHRlc3QgdXNlcyB0d28gb2JqZWN0IGl0ZXJhdG9ycy4gT25lIGZvciBhIGFuZCBvbmUgZm9yIGIsIHdoZXJlIGEgYW5kIGIgYXJlIGZyb20gdGhlIGFib3ZlIHJ1bGUuIEVhY2ggb2YNCi0JICogdGhlc2UgaXRlcmF0b3JzIGFyZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuIFRoaXMgbWV0aG9kIGFsc28gY2hlY2tzIHRoYXQgd2hlbmV2ZXIgdHdvIGluc3RhbmNlcyByZXR1cm5lZCBieSB0aGUgdHdvDQotCSAqIGl0ZXJhdG9ycyBhcmUgZXF1YWwgdGhlbiB0aGVpciBoYXNjb2RlIGlzIGVxdWFsLg0KLQkgKiANCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNTeW1ldHJpYygpDQotCXsNCi0JCWZpbmFsIGludCBpdGVyYXRpb25zRm9yVGhpc1Rlc3QgPSBnZXRJdGVyYXRpb25zRm9yU3ltZXRyaWNpdHlUZXN0KCk7DQotCQlmaW5hbCBJdGVyYXRvcjxUPiBvYmplY3RUSXRlcmF0b3IxID0gbmV3T2JqZWN0SXRlcmF0b3IoaXRlcmF0aW9uc0ZvclRoaXNUZXN0KTsNCi0JCWZpbmFsIEl0ZXJhdG9yPFQ+IG9iamVjdFRJdGVyYXRvcjIgPSBuZXdPYmplY3RJdGVyYXRvcihpdGVyYXRpb25zRm9yVGhpc1Rlc3QpOw0KLQkJd2hpbGUgKG9iamVjdFRJdGVyYXRvcjEuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCWFzc2VydFRydWUoIlRoZSB0d28gb2JqZWN0IGl0ZXJhdG9ycyBkb24ndCBoYXZlIGVxdWFsIG51bWJlciBvZiBvYmplY3RzIiwgb2JqZWN0VEl0ZXJhdG9yMi5oYXNOZXh0KCkpOw0KLQkJCWZpbmFsIFQgb2JqZWN0VDEgPSBvYmplY3RUSXRlcmF0b3IxLm5leHQoKTsNCi0JCQlmaW5hbCBUIG9iamVjdFQyID0gb2JqZWN0VEl0ZXJhdG9yMi5uZXh0KCk7DQotCQkJaWYgKG9iamVjdFQxLmVxdWFscyhvYmplY3RUMikpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKCJFcXVhbHMgaXMgbm90IHN5bWV0cmljIiwgb2JqZWN0VDIuZXF1YWxzKG9iamVjdFQxKSk7DQotCQkJCWFzc2VydFRydWUoIkhhc2hjb2RlIGlzIG5vdCB0aGUgc2FtZSBmb3IgZXF1YWwgaW5zdGFuY2VzIiwgb2JqZWN0VDEuaGFzaENvZGUoKSA9PSBvYmplY3RUMi5oYXNoQ29kZSgpKTsNCi0JCQl9IGVsc2UgaWYgKG9iamVjdFQyLmVxdWFscyhvYmplY3RUMSkpDQotCQkJew0KLQkJCQlmYWlsKCJFcXVhbHMgaXMgbm90IHN5bWV0cmljIik7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBUZXN0cyB0aGF0IGVxdWFscyBpcyB0cmFuc2l0aXZlIGkuZS4gYS5lcXVhbHMoYikgJiBiLmVxdWFscyhjKSA9PiBhLmVxdWFscyhjKS4gVGhpcyB0ZXN0IHVzZXMgdGhyZWUgb2JqZWN0IGl0ZXJhdG9ycy4gT25lIGZvciBhLCBvbmUgZm9yIGIsIGFuZA0KLQkgKiBvbmUgZm9yIGMsIHdoZXJlIGEsYixjIGFyZSBmcm9tIHRoZSBhYm92ZSBydWxlLiBFYWNoIG9mIHRoZXNlIGl0ZXJhdG9ycyBhcmUgaW5zdGFudGlhdGVkIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc1RyYW5zaXRpdmUoKQ0KLQl7DQotCQlmaW5hbCBpbnQgaXRlcmF0aW9uc0ZvclRoaXNUZXN0ID0gZ2V0SXRlcmF0aW9uc0ZvclRyYW5zaXRpdml0eVRlc3QoKTsNCi0JCWZpbmFsIEl0ZXJhdG9yPFQ+IG9iamVjdFRJdGVyYXRvcjEgPSBuZXdPYmplY3RJdGVyYXRvcihpdGVyYXRpb25zRm9yVGhpc1Rlc3QpOw0KLQkJZmluYWwgSXRlcmF0b3I8VD4gb2JqZWN0VEl0ZXJhdG9yMiA9IG5ld09iamVjdEl0ZXJhdG9yKGl0ZXJhdGlvbnNGb3JUaGlzVGVzdCk7DQotCQlmaW5hbCBJdGVyYXRvcjxUPiBvYmplY3RUSXRlcmF0b3IzID0gbmV3T2JqZWN0SXRlcmF0b3IoaXRlcmF0aW9uc0ZvclRoaXNUZXN0KTsNCi0NCi0JCXdoaWxlIChvYmplY3RUSXRlcmF0b3IxLmhhc05leHQoKSkNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKCJUaGUgdGhyZWUgb2JqZWN0IGl0ZXJhdG9ycyBkb24ndCBoYXZlIGVxdWFsIG51bWJlciBvZiBvYmplY3RzIiwgb2JqZWN0VEl0ZXJhdG9yMi5oYXNOZXh0KCkpOw0KLQkJCWFzc2VydFRydWUoIlRoZSB0aHJlZSBvYmplY3QgaXRlcmF0b3JzIGRvbid0IGhhdmUgZXF1YWwgbnVtYmVyIG9mIG9iamVjdHMiLCBvYmplY3RUSXRlcmF0b3IzLmhhc05leHQoKSk7DQotCQkJZmluYWwgVCBvYmplY3RUMSA9IG9iamVjdFRJdGVyYXRvcjEubmV4dCgpOw0KLQkJCWZpbmFsIFQgb2JqZWN0VDIgPSBvYmplY3RUSXRlcmF0b3IyLm5leHQoKTsNCi0JCQlmaW5hbCBUIG9iamVjdFQzID0gb2JqZWN0VEl0ZXJhdG9yMy5uZXh0KCk7DQotDQotCQkJaWYgKG9iamVjdFQxLmVxdWFscyhvYmplY3RUMikgJiYgb2JqZWN0VDEuZXF1YWxzKG9iamVjdFQzKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoImVxdWFscyBpcyBub3QgdHJhbnNpdGl2ZSIsIG9iamVjdFQyLmVxdWFscyhvYmplY3RUMykpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogVGVzdHMgdGhhdCA8Yz5lcXVhbDwvYz4gcmV0dXJucyBmYWxzZSBpZiA8Yz5udWxsPC9jPiBpcyBwYXNzZWQgYXMgYXJndW1lbnQNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzUmV0dXJuc0ZhbHNlSWZOdWxsUGFzc2VkKCkNCi0Jew0KLQkJZmluYWwgVCBvYmplY3RUID0gdGhpcy5uZXdFcXVhbEluc3RhbmNlQ2hlY2tDb3JyZWN0KCk7DQotCQlhc3NlcnRGYWxzZSgiZXF1YWxzIHJldHVybmVkIHRydWUgd2hlbiBudWxsIHBhc3NlZCBmb3Igb3RoZXIgb2JqZWN0Iiwgb2JqZWN0VC5lcXVhbHMobnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUZXN0cyB0aGF0IDxjPmVxdWFsPC9jPiByZXR1cm5zIGZhbHNlIGlmIGEgbm9uLWVxdWFsIG9iamVjdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQuIFRoZSB0d28gbm9uIGVxdWFsIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBieSBjYWxsaW5nDQotCSAqIDxjPm5ld0VxdWFsSW5zdGFuY2U8L2M+IGFuZCA8Yz4gbmV3Tm9uRXF1YWxJbnN0YW5jZTwvYz4NCi0JICogDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzUmV0dXJuc0ZhbHNlT25Ob25FcXVhbHMoKQ0KLQl7DQotCQlmaW5hbCBUIG9iamVjdFQxID0gdGhpcy5uZXdFcXVhbEluc3RhbmNlQ2hlY2tDb3JyZWN0KCk7DQotCQlmaW5hbCBUIG9iamVjdFQyID0gdGhpcy5uZXdOb25FcXVhbEluc3RhbmNlQ2hlY2tDb3JyZWN0KCk7DQotCQlhc3NlcnRUcnVlKCJFcXVhbHMgcmVwb3J0ZWQgdHJ1ZSBmb3IgaW5zdGFuY2VzIGFzc3VtZWQgbm9uIGVxdWFsLiIsICFvYmplY3RUMS5lcXVhbHMob2JqZWN0VDIpICYmICFvYmplY3RUMi5lcXVhbHMob2JqZWN0VDEpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGVzdHMgdGhhdCA8Yz5lcXVhbDwvY0wgcmV0dXJucyB0cnVlIGlmIGFuIGVxdWFsIG9iamVjdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQuIFRoZSBpbnN0YW5jZXMgdGhhdCBhcmUgY29tcGFyZWQgYXJlIG9idGFpbmVkIGJ5IHR3bw0KLQkgKiBjb25zZWN1dGl2ZSBjYWxscyB0byA8Yz5uZXdFcXVhbEluc3RhbmNlPC9jPg0KLQkgKiANCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNSZXR1cm5zVHJ1ZU9uRXF1YWxzKCkNCi0Jew0KLQkJZmluYWwgVCBvYmplY3RUMSA9IHRoaXMubmV3RXF1YWxJbnN0YW5jZUNoZWNrQ29ycmVjdCgpOw0KLQkJZmluYWwgVCBvYmplY3RUMiA9IHRoaXMubmV3RXF1YWxJbnN0YW5jZUNoZWNrQ29ycmVjdCgpOw0KLQkJYXNzZXJ0VHJ1ZSgiRXF1YWxzIHJlcG9ydGVkIGZhbHNlIGZvciBpbnN0YW5jZXMgYXNzdW1lZCBlcXVhbC4iLCBvYmplY3RUMS5lcXVhbHMob2JqZWN0VDIpICYmIG9iamVjdFQyLmVxdWFscyhvYmplY3RUMSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUZXN0cyB0aGF0IGVxdWFscyByZXR1cm5zIGZhbHNlIGlmIGFuIG9iamVjdCBvZiBhbm90aGVyIGNsYXNzIGlzIHBhc3NlZC4gSW4gY2FzZSB0aGF0IHRoZSB0ZXN0ZWQgY2xhc3MgaXMgbm90IGZpbmFsIHRoaXMgdGVzdCBwYXNzZXMgYSBzdWJjbGFzcw0KLQkgKiBvZiB0aGUgdGVzdCBjbGFzcyBhcyBhbiBhcmd1bWVudCB0byA8Yz5lcXVhbHM8L2M+LiBUaGUgcGFzc2VkIGFuY2VzdG9yIG9iamVjdCBoYXMgdGhlIHNhbWUgdmFsdWUgZm9yIGFsbCBpdHMgZmllbGQuIFRoaXMgaXMgaW50ZW5kZWQgdG8gY2FodGNoDQotCSAqIHdyb25nIGltcGxlbWVudGF0aW9ucyB1c2luZyAiaW5zdGFuY2VvZiIgcmF0aGVyIHRoYW4gPGM+Z2V0Q2xhc3MoKSA9PSBvdGhlci5nZXRDbGFzcygpPC9jPg0KLQkgKiANCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNSZXR1cm5zRmFsc2VJZk90aGVyQ2xhc3NQYXNzZWQoKQ0KLQl7DQotCQlmaW5hbCBUIG9iamVjdFQgPSBuZXdFcXVhbEluc3RhbmNlQ2hlY2tDb3JyZWN0KCk7DQotCQlPYmplY3Qgb2JqZWN0ID0gbmV3QW5jZXN0b3JFcXVhbEluc3RhbmNlQ2hlY2tDb3JyZWN0KCk7DQotCQlpZiAob2JqZWN0ID09IG51bGwpDQotCQl7DQotCQkJLy8gY2xhc3MgaXMgZmluYWwuIE5vIGFuY2VzdG9yIGNvdWxkIGJlIGNyZWF0ZWQuIFVzZSBzb21lIG90aGVyIGNsYXNzLg0KLQkJCW9iamVjdCA9IG5ldyBPYmplY3QoKTsNCi0JCX0NCi0JCWFzc2VydEZhbHNlKCJlcXVhbHMgcmV0dXJuZWQgdHJ1ZSB3aGVuIG9iamVjdCBvZiBhbm90aGVyIHR5cGUgcGFzc2VkIiwgb2JqZWN0VC5lcXVhbHMob2JqZWN0KSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRlc3RzIHRoYXQgPGM+ZXF1YWxzPC9jPiBpcyBwcm9wZXJseSBpbXBsZW1lbnRlZCBmb3IgdXNlIGluIHN1YmNsYXNzZXMuIEl0IHRha2VzIHR3byBlcXVhbCBhbmNlc3RvciBpbnN0YW5jZXMgYW5kIGNvbXBhcmVzIHRoZW0gZm9yIGVxdWFsaXR5Lg0KLQkgKiBTaW5jZSB0aGUgYW5jZXN0b3IgY2xhc3MgZG9lcyBub3Qgb3ZlcnJpZGUgdGhlIGVxdWFscyBtZXRob2QuIFRoZSB0ZXN0cyBhc3NlcnRzIHRoYXQgZXF1YWxzIHNob3VsZCByZXR1cm4gdHJ1ZS4NCi0JICogDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzU3VpdGFibGVGb3JBbmNlc3RvcnMoKQ0KLQl7DQotCQlmaW5hbCBUIGFuY2VzdG9yVDEgPSBuZXdBbmNlc3RvckVxdWFsSW5zdGFuY2VDaGVja0NvcnJlY3QoKTsNCi0JCWZpbmFsIFQgYW5jZXN0b3JUMiA9IG5ld0FuY2VzdG9yRXF1YWxJbnN0YW5jZUNoZWNrQ29ycmVjdCgpOw0KLQkJaWYgKGFuY2VzdG9yVDEgPT0gbnVsbCkNCi0JCXsNCi0JCQlhc3NlcnROdWxsKA0KLQkJCQkJCQkJCQkJIlRoZSBuZXdBbmNlc3Rvckluc3RhbmNlKCkgbWV0aG9kIHJldHVybmVkIG51bGwgb24gdGhlIHNlY29uZCBpbnZvY2F0aW9uLCB3aGlsZSBpdCByZXR1cm4gYSB2YWx1ZSBkaWZmZXJldCB0aGFuIG51bGwgZnJvbSB0aGUgZmlyc3QiLA0KLQkJCQkJCQkJCQkJYW5jZXN0b3JUMik7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJYXNzZXJ0VHJ1ZShhbmNlc3RvclQxLmVxdWFscyhhbmNlc3RvclQyKSAmJiBhbmNlc3RvclQyLmVxdWFscyhhbmNlc3RvclQxKSk7DQotDQotCX0NCi0NCi0JcHJpdmF0ZSBUIG5ld0FuY2VzdG9yRXF1YWxJbnN0YW5jZUNoZWNrQ29ycmVjdCgpDQotCXsNCi0JCWZpbmFsIFQgYW5jZXN0b3JUID0gbmV3QW5jZXN0b3JFcXVhbEluc3RhbmNlKCk7DQotCQlpZiAoYW5jZXN0b3JUID09IG51bGwpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSgibmV3QW5jZXN0b3JFcXVhbEluc3RhbmNlIHJldHVybmVkIG51bGwsIGFsdGhvdWdoIHRoZSB0ZXN0IGNsYXNzICIsIE1vZGlmaWVyLmlzRmluYWwodGVzdENsYXNzLmdldE1vZGlmaWVycygpKSk7DQotCQl9IGVsc2UNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKCJuZXdBbmNlc3RvckVxdWFsSW5zdGFuY2UgcmV0dXJuZWQgb2JqZWN0IG9mIGNsYXNzICIgKyBhbmNlc3RvclQuZ2V0Q2xhc3MoKSArICIsIHdoaWNoIGlzIG5vdCBzdWJ0eXBlIG9mICINCi0JCQkJCQkJCQkJCSsgdGVzdENsYXNzLmdldE5hbWUoKSwgdGVzdENsYXNzLmlzQXNzaWduYWJsZUZyb20oYW5jZXN0b3JULmdldENsYXNzKCkpKTsNCi0JCX0NCi0JCXJldHVybiBhbmNlc3RvclQ7DQotCX0NCi0NCi0JcHJpdmF0ZSBUIG5ld0VxdWFsSW5zdGFuY2VDaGVja0NvcnJlY3QoKQ0KLQl7DQotCQlmaW5hbCBUIG9iamVjdFQgPSBuZXdFcXVhbEluc3RhbmNlKCk7DQotCQlhc3NlcnRUcnVlKCJuZXdFcXVhbEluc3RhbmNlIHJldHVybmVkIG9iamVjdCBvZiBjbGFzcyAiICsgb2JqZWN0VC5nZXRDbGFzcygpLmdldE5hbWUoKSArICJFeHBlY3RlZCB3YXMgY2xhc3MgIiArIHRlc3RDbGFzcy5nZXROYW1lKCksDQotCQkJCQkJCQkJCXRlc3RDbGFzcyA9PSBvYmplY3RULmdldENsYXNzKCkpOw0KLQkJcmV0dXJuIG9iamVjdFQ7DQotCX0NCi0NCi0JcHJpdmF0ZSBUIG5ld05vbkVxdWFsSW5zdGFuY2VDaGVja0NvcnJlY3QoKQ0KLQl7DQotCQlmaW5hbCBUIG9iamVjdFQgPSBuZXdOb25FcXVhbEluc3RhbmNlKCk7DQotCQlhc3NlcnRUcnVlKCJuZXdOb25FcXVhbEluc3RhbmNlIHJldHVybmVkIG9iamVjdCBvZiBjbGFzcyAiICsgb2JqZWN0VC5nZXRDbGFzcygpLmdldE5hbWUoKSArICJFeHBlY3RlZCB3YXMgY2xhc3MgIiArIHRlc3RDbGFzcy5nZXROYW1lKCksDQotCQkJCQkJCQkJCXRlc3RDbGFzcyA9PSBvYmplY3RULmdldENsYXNzKCkpOw0KLQkJcmV0dXJuIG9iamVjdFQ7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay90ZXN0Y2FzZXMvSUJlZm9yZUFmdGVyRW5hYmxlZC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay90ZXN0Y2FzZXMvSUJlZm9yZUFmdGVyRW5hYmxlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MTE1ZWVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svdGVzdGNhc2VzL0lCZWZvcmVBZnRlckVuYWJsZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay50ZXN0Y2FzZXM7DQotDQotcHVibGljIGludGVyZmFjZSBJQmVmb3JlQWZ0ZXJFbmFibGVkIHsNCi0NCi0JcHVibGljIHZvaWQgYmVmb3JlVGVzdENhc2UoKSB0aHJvd3MgRXhjZXB0aW9uOw0KLQkNCi0JcHVibGljIHZvaWQgYWZ0ZXJUZXN0Q2FzZSgpIHRocm93cyBFeGNlcHRpb247DQotCQ0KLQlwdWJsaWMgdm9pZCBydW5CYXJlSW50ZXJuYWwoKSB0aHJvd3MgVGhyb3dhYmxlOw0KLQkNCi0JDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam9icy9Kb2JVdGlscy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qb2JzL0pvYlV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ1ZTIwOGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qb2JzL0pvYlV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmpvYnM7DQotDQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guVHlwZU5hbWVSZXF1ZXN0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMudGhyZWFkaW5nLlRlc3RDb250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5JTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5Mb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQotDQotcHVibGljIGNsYXNzIEpvYlV0aWxzDQotew0KLQlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckpvYnNJbnRlcnJ1cHRhYmxlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uDQotCXsNCi0JCXdoaWxlIChQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuY3VycmVudEpvYigpICE9IG51bGwpDQotCQl7DQotCQkJZGVsYXkoNSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhaXRGb3JKb2JzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl3YWl0Rm9yRHVtbXlKb2IoSm9iLklOVEVSQUNUSVZFKTsNCi0JCQ0KLQkJd2hpbGUgKHRydWUpDQotCQl7DQotCQkJdHJ5DQotCQkJew0KLQkJCQl3YWl0Rm9ySm9ic0ludGVycnVwdGFibGUoKTsNCi0JCQkJYnJlYWs7DQotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpDQotCQkJew0KLQ0KLQkJCX0NCi0JCX0NCi0NCi0JCS8vIGkwMzY1MDkgYWRkZWQgY291c2Ugd2FpdGluZyBmb3Igam9icyBpcyBub3QgZW5vdWdodA0KLQkJd2FpdEZvckluZGV4ZXIoKTsNCi0JCQ0KLQkJLy8gRm9yY2Ugbm90aWZpY2F0aW9ucw0KLQkJd2FpdEZvck5vdGlmaWNhdGlvbnMoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsYXkoZmluYWwgbG9uZyBtaWxsaXMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbg0KLQl7DQotCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsNCi0JCS8vIGlmIHRoaXMgaXMgdGhlIFVJIHRocmVhZCwgdGhlbiBwcm9jZXNzIHRoZSBpbnB1dA0KLQkJaWYgKGRpc3BsYXkgIT0gbnVsbCkNCi0JCXsNCi0JCQlmaW5hbCBsb25nIGVudFRpbWVNaWxsaXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIG1pbGxpczsNCi0JCQl3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCBlbnRUaW1lTWlsbGlzKQ0KLQkJCXsNCi0JCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQ0KLQkJCQl7DQotCQkJCQlkaXNwbGF5LnNsZWVwKCk7DQotCQkJCX0NCi0JCQl9DQotCQkJZGlzcGxheS51cGRhdGUoKTsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCVRocmVhZC5zbGVlcCgxMDAwKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhaXRGb3JJbmRleGVyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoQWxsVHlwZU5hbWVzKG51bGwsU2VhcmNoUGF0dGVybi5SX0VYQUNUX01BVENILCBudWxsLCANCi0JCQkJU2VhcmNoUGF0dGVybi5SX0NBU0VfU0VOU0lUSVZFLCBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUywgU2VhcmNoRW5naW5lDQotCQkJCQkJCQkJCQkJCQkJCQkJLmNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFFbGVtZW50WzBdKSwgbmV3IFR5cGVOYW1lUmVxdWVzdG9yKCkNCi0JCQkJCQkJCQkJew0KLQkJCQkJCQkJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBhY2NlcHRDbGFzcyhjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBzaW1wbGVUeXBlTmFtZSwgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLA0KLQkJCQkJCQkJCQkJCQkJCQkJCQlTdHJpbmcgcGF0aCkNCi0JCQkJCQkJCQkJCXsNCi0JCQkJCQkJCQkJCX0NCi0JCQkJCQkJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQ0KLQkJCQkJCQkJCQkJcHVibGljIHZvaWQgYWNjZXB0SW50ZXJmYWNlKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsDQotCQkJCQkJCQkJCQkJCQkJCQkJCVN0cmluZyBwYXRoKQ0KLQkJCQkJCQkJCQkJew0KLQkJCQkJCQkJCQkJfQ0KLQkJCQkJCQkJCQl9LCBJSmF2YVNlYXJjaENvbnN0YW50cy5XQUlUX1VOVElMX1JFQURZX1RPX1NFQVJDSCwgbnVsbCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBTY2hlZHVsZSBhIGR1bW15IGpvYiB3aXRoIHRoZSBwcmlvcml0eSBzcGVjaWZpZWQgYW5kIHdhaXQgZm9yIGl0IGlzIGRvbmUNCi0JICovDQotCXByaXZhdGUgc3RhdGljIHZvaWQgd2FpdEZvckR1bW15Sm9iKGZpbmFsIGludCBwcmlvcml0eSkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJd2FpdEZvckR1bW15Sm9iV2l0aFByaW8ocHJpb3JpdHkpOw0KLQkJfQ0KLQkJY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQkNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3YWl0Rm9yRHVtbXlKb2JXaXRoUHJpbyhmaW5hbCBpbnQgcHJpbykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uDQotCXsNCi0JCUpvYiBteUR1bW15Sm9iID0gbmV3IEpvYigiRFVNTVkiKXsNCi0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCQkJfX07DQotCQkJDQotCQlteUR1bW15Sm9iLnNldFByaW9yaXR5KHByaW8pOw0KLQkJbXlEdW1teUpvYi5zZXRVc2VyKGZhbHNlKTsNCi0JCW15RHVtbXlKb2Iuc2NoZWR1bGUoKTsNCi0JCQ0KLQkJbXlEdW1teUpvYi5qb2luKCk7DQotCX0NCi0JDQotCQ0KLQkvKioNCi0JICogRm9yY2VzIGRlbGl2ZXJpbmcgb2Ygbm90aWZpY2F0aW9uIGV2ZW50cy4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtZXRob2QgaXMgImluc3BpcmVkIiBieSBOb3RpZmljYXRpb25NYW5hZ2VyJ3Mgbm90aWZpY2F0aW9uIGpvYg0KLQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIA0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3YWl0Rm9yTm90aWZpY2F0aW9ucygpDQotCXsNCi0JCWZpbmFsIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOw0KLQkJZmluYWwgSVdvcmtzcGFjZVJ1bm5hYmxlIGR1bW15UnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCl7DQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JCQl7DQotCQkJfQ0KLQkJfTsNCi0JCQ0KLQkJZmluYWwgSm9iIG5vdGlmRm9yY2luZ0pvYiA9IG5ldyBKb2IoIkRlbGl2ZXJpbmcgbm90aWZpY2F0aW9ucy4uLiIpew0KLQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQkJew0KLQkJCQl0cnkNCi0JCQkJew0KLQkJCQkJd29ya3NwYWNlLnJ1bihkdW1teVJ1bm5hYmxlLCBudWxsLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbnVsbCk7DQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkNCi0JCQkJew0KLQkJCQkJbG9nZ2VyKCkubG9nRGVidWcoIGUuZ2V0TWVzc2FnZSgpLCBlICk7DQotCQkJCX0NCi0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCQkJfX07DQotCQkNCi0JCXN5bmNFeGVjSm9iKG5vdGlmRm9yY2luZ0pvYiwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckpvYnNTbG93KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl3YWl0Rm9ySm9icygpOw0KLQkJd2FpdEZvckR1bW15Sm9iKEpvYi5ERUNPUkFURSk7DQotCQkNCi0JCXdhaXRGb3JFdmVudExvb3AoKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdhaXRGb3JFdmVudExvb3AoKQ0KLQl7DQotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsNCi0JCQ0KLQkJZmluYWwgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKXsNCi0NCi0JCQlwdWJsaWMgdm9pZCBydW4oKQ0KLQkJCXsNCi0JCQkJLy8gTGV0IHRoZSBkaXNwbGF5IHByb2Nlc3MgdGhlIGV2ZW50cyBpbiBpdHMgcXVldWUNCi0JCQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSl7fTsNCi0JCQl9fTsNCi0JCQ0KLQkJaWYoRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbCkNCi0JCXsNCi0JCQlydW5uYWJsZS5ydW4oKTsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQlkaXNwbGF5LnN5bmNFeGVjKHJ1bm5hYmxlKTsNCi0JCX0NCi0JCQkNCi0JfQ0KLQ0KLQkvKioNCi0JICogRXhlY3V0ZXMgc3luY2hyb25vdXNseSAoc2NoZWR1bGVzIGFuZCBqb2lucykgdGhlIGpvYiBzcGVjaWZpZWQuPGJyPg0KLQkgKiBJZiB0aGUgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQsIHRoZSBqb2IgaXMgc2NoZWR1bGVkIGFuZCBqb2luZWQgaW4gYSBtb2RhbCBjb250ZXh0IHRocmVhZCB0aHVzIGxldHRpbmcgdGhlIGV2ZW50IGxvb3AgcHJvY2VzcyBhc3luY2hyb25vdXMgZXZlbnRzPGJyPg0KLQkgKiBJZiB0aGUgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIGEgd29ya2VyIHRocmVhZCwgdGhlIGpvYiBpcyBzY2hlZHVsZWQgYW5kIGpvaW5lZCBpbiB0aGUgY2FsbGVyIHRocmVhZC4NCi0JICogDQotCSAqIEBwYXJhbSBqb2INCi0JICogQHBhcmFtIGRpc3BsYXkNCi0JICovDQotCXByaXZhdGUgc3RhdGljIHZvaWQgc3luY0V4ZWNKb2IoZmluYWwgSm9iIGpvYiwgZmluYWwgRGlzcGxheSBkaXNwbGF5KQ0KLQl7DQotCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkNCi0JCXsNCi0NCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24NCi0JCQl7DQotCQkJCWpvYi5zY2hlZHVsZSgpOw0KLQkJCQl0cnkNCi0JCQkJew0KLQkJCQkJam9iLmpvaW4oKTsNCi0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkNCi0JCQkJew0KLQkJCQkJbG9nZ2VyKCkubG9nRGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfTsNCi0JCXRyeQ0KLQkJew0KLQkJCVRlc3RDb250ZXh0LnJ1bihydW5uYWJsZSwgRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgZGlzcGxheSk7DQotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpDQotCQl7DQotCQkJbG9nZ2VyKCkubG9nRGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlsb2dnZXIoKS5sb2dEZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgc3RhdGljIElMb2dnZXIgbG9nZ2VyKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBMb2dnZXIoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvQ2xhc3NMb2FkaW5nVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L0NsYXNzTG9hZGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDNjYWM0OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvQ2xhc3NMb2FkaW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0Ow0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotDQotLyoqDQotICogRXh0ZW5kcyB7QGxpbmsgUHJvamVjdEJhc2VkVGVzdH0gYnkgYWRkaW5nIGZpbmN0aW9uYWxpdGllcyB0byBjcmVhdGUgY2xhc3NlcyBpbiBzb21lIHBhY2thZ2UgZWlkZXIgYnkgcmVhZGluZyBpdCBmcm9tIHRleHQgZmlsZSBvciBwYXNzZWQgYXMNCi0gKiBzdHJpbmdzLg0KLSAqIA0KLSAqIDwvcHJlPg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NMb2FkaW5nVGVzdCBleHRlbmRzIFByb2plY3RCYXNlZFRlc3QNCi17DQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0VYVCA9ICIuamF2YSI7DQotDQotCXByaXZhdGUgZmluYWwgc3RhdGljIGNoYXIgU0VQQVJBVE9SID0gJyMnOw0KLQ0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCBkZWZhdWx0UGFja2FnZTsNCi0NCi0JcHVibGljIHZvaWQgY3JlYXRlSmF2YVByb2plY3QoU3RyaW5nIHNyY0ZvbGRlciwgU3RyaW5nIGRlZmF1bHRQYWNrYWdlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3Qoc3JjRm9sZGVyKTsNCi0NCi0JCWlmIChkZWZhdWx0UGFja2FnZU5hbWUgIT0gbnVsbCkNCi0JCXsNCi0JCQlkZWZhdWx0UGFja2FnZSA9IGdldFNvdXJjZUZvbGRlcigpLmNyZWF0ZVBhY2thZ2VGcmFnbWVudChkZWZhdWx0UGFja2FnZU5hbWUsIHRydWUsIG51bGwpOw0KLQkJfQ0KLQl9DQotCQ0KLQkvKioNCi0JICogQ3JlYXRlcyBjbGFzcyBpbiB0ZXN0IHByb2plY3QuIDxjb2RlPnNvdXJjZUZpbGVQYXRoPC9jb2RlPiBtdXN0IGNvbnRhaW4gdGhlIGNsYXNzIHNvdXJjZSB3aXRob3V0IHBhY2thZ2UgZGVjbGFyYXRpb24uIFRoZSBjbGFzcyBpcyBjcmVhdGVkIGluDQotCSAqIGRlZmF1bHQgcGFja2FnZS4NCi0JICogDQotCSAqIFByb2plY3QgbXVzdCBiZSBjcmVhdGVkIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuDQotCSAqIA0KLQkgKiBAcGFyYW0gc291cmNlRmlsZVBhdGgNCi0JICogQHBhcmFtIGNsYXNzTmFtZQ0KLQkgKiBAcmV0dXJuIElUeXBlIG9iamVjdCBmb3IgdGhlIGNyZWF0ZWQgY2xhc3MNCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJvdGVjdGVkIElUeXBlIGNyZWF0ZUNsYXNzKFN0cmluZyBzb3VyY2VGaWxlUGF0aCwgU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKHNvdXJjZUZpbGVQYXRoID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJzb3VyY2VGaWxlUGF0aCBzaG91bGQgbm90IGJlIG51bGwuIik7DQotCQl9DQotDQotCQlTdHJpbmcgc291cmNlID0gVGVzdFByb2plY3RzVXRpbHMucmVhZFNvdXJjZSh0aGlzLmdldENsYXNzKCksIHNvdXJjZUZpbGVQYXRoKTsNCi0NCi0JCXJldHVybiBjcmVhdGVDbGFzcyhkZWZhdWx0UGFja2FnZSwgY2xhc3NOYW1lLCBzb3VyY2UpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGNsYXNzIGluIDxjb2RlPnBjazwvY29kZT4gcGFja2FnZSB3aXRoIG5hbWUgYW5kIHNvdXJjZSA8Y29kZT5jbGFzc05hbWUsIHNvdXJjZTwvY29kZT4uIFNvdXJjZSBtdXN0IG5vdCBpbmNsdXNlIHBhY2thZ2UNCi0JICogZGVjbGFyYXRpb24uIFByb2plY3QgbXVzdCBiZSBjcmVhdGVkIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuDQotCSAqIA0KLQkgKiBAcGFyYW0gcGNrDQotCSAqIEBwYXJhbSBjbGFzc05hbWUNCi0JICogQHBhcmFtIHNvdXJjZQ0KLQkgKiBAcmV0dXJuDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgaW4gY2FzZSBzb21lIG9mIHRoZSBwYXJhbXMgaXMgbnVsbC4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXByb3RlY3RlZCBJVHlwZSBjcmVhdGVDbGFzcyhJUGFja2FnZUZyYWdtZW50IHBjaywgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHNvdXJjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoY2xhc3NOYW1lID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwYXJhbSAnY2xhc3NOYW1lJyBzaG91bGQgbm90IGJlIG51bGwuIik7DQotCQl9DQotDQotCQlpZiAoc291cmNlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwYXJhbSAnc291cmNlJyBzaG91bGQgbm90IGJlIG51bGwuIik7DQotCQl9DQotDQotCQlpZiAoZ2V0VGVzdFByb2plY3QoKSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicHJvamVjdCBtdXN0IGJlIGNyZWF0ZWQgYmVmb3JlIGNsYXNzZXMgY2FuIGJlIGFkZGVkIHRvIGl0Iik7DQotCQl9DQotDQotCQlyZXR1cm4gZ2V0VGVzdFByb2plY3QoKS5jcmVhdGVUeXBlKHBjaywgY2xhc3NOYW1lICsgSkFWQV9FWFQsIHNvdXJjZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJlYWRzIHRoZSBjb250ZW50IG9mIDxjb2RlPnNvdXJjZXNGaWxlUGF0aDwvY29kZT4gYW5kIGNyZWF0ZXMgY2xhc3NlcyBpbiB0ZXN0IHByb2plY3QuIFRoZSBjb250ZW50IG9mIDxjb2RlPnNvdXJjZXNGaWxlUGF0aDwvY29kZT4gc291bGQgYmUgLQ0KLQkgKiAnIycgY2hhciAoc2VwYXJhdG9yIGZvciBjbGFzc2VzKSBmb2xsb3dlZCBieSBDbGFzcyBuYW1lLCBuZXcgbGluZSBhbmQgYWZ0ZXIgdGhhdCBjbGFzcyBzb3VyY2Ugd2l0aG91dCBwYWNrYWdlIGRlY2xhcmF0aW9uLjxicj4NCi0JICogRXhhbXBsZToNCi0JICogDQotCSAqIDxwcmU+DQotCSAqICAjSW1wbGVtZW50c1JlbW90ZQ0KLQkgKiAgcHVibGljIGNsYXNzIEltcGxlbWVudHNSZW1vdGUgaW1wbGVtZW50cyBqYXZhLnJtaS5SZW1vdGUNCi0JICogIHsNCi0JICogIH0NCi0JICogCQ0KLQkgKiAgI05vRGVmYXVsdENvbnN0cnVjdG9yDQotCSAqICBwdWJsaWMgY2xhc3MgTm9EZWZhdWx0Q29uc3RydWN0b3IgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQ0KLQkgKiAgew0KLQkgKiAJcHVibGljIE5vRGVmYXVsdENvbnN0cnVjdG9yKFN0cmluZyBwYXJhbSkgew0KLQkgKiAgCX0NCi0JICogIH0NCi0JICogPC9wcmU+DQotCSAqIA0KLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgaWYgbG90cyBvZiBzbWFsbCBjbGFzc2VzIHNob3VsZCBiZSBjcmVhdGVkIGZyb20gYSBzb3VyY2UgZmlsZS4gUHJvamVjdCBtdXN0IGJlIGNyZWF0ZWQgYmVmb3JlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4NCi0JICogDQotCSAqIEBwYXJhbSBzb3VyY2VzRmlsZVBhdGgNCi0JICogQHJldHVybiBtYXAgb2YgY2xhc3NOYW1lLT5JVHlwZS4gdGhhdCBoYXZlIGJlZW4gY3JlYXRlZA0KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIElUeXBlPiBjcmVhdGVDbGFzc2VzKFN0cmluZyBzb3VyY2VzRmlsZVBhdGgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJTWFwPFN0cmluZywgSVR5cGU+IHR5cGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJVHlwZT4oKTsNCi0JCVN0cmluZyBzb3VyY2UgPSBUZXN0UHJvamVjdHNVdGlscy5yZWFkU291cmNlKHRoaXMuZ2V0Q2xhc3MoKSwgc291cmNlc0ZpbGVQYXRoKTsNCi0NCi0JCWludCBzdGFydFBvcyA9IDA7DQotCQl3aGlsZSAoKHN0YXJ0UG9zID0gc291cmNlLmluZGV4T2YoU0VQQVJBVE9SKSkgPiAtMSkNCi0JCXsNCi0JCQlpbnQgZW5kUG9zID0gc291cmNlLmluZGV4T2YoU0VQQVJBVE9SLCBzdGFydFBvcyArIDEpOw0KLQkJCWlmIChlbmRQb3MgPT0gLTEpDQotCQkJCWVuZFBvcyA9IHNvdXJjZS5sZW5ndGgoKTsNCi0NCi0JCQlTdHJpbmcgc3JjID0gc291cmNlLnN1YnN0cmluZyhzdGFydFBvcyArIDEsIGVuZFBvcyk7DQotCQkJc291cmNlID0gc291cmNlLnN1YnN0cmluZyhlbmRQb3MpOw0KLQ0KLQkJCVN0cmluZyBjbGFzc05hbWUgPSBzcmMuc3Vic3RyaW5nKDAsIHNyYy5pbmRleE9mKCdcbicpKS5yZXBsYWNlQWxsKCJcciIsICIiKTsNCi0JCQlzcmMgPSBzcmMuc3Vic3RyaW5nKHNyYy5pbmRleE9mKCdcbicpICsgMSk7DQotDQotCQkJdHlwZXMucHV0KGNsYXNzTmFtZSwgY3JlYXRlQ2xhc3MoZGVmYXVsdFBhY2thZ2UsIGNsYXNzTmFtZSwgc3JjKSk7DQotCQl9DQotDQotCQlyZXR1cm4gdHlwZXM7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L1Byb2plY3RCYXNlZFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvcHJvamVjdC9Qcm9qZWN0QmFzZWRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0ZTA4OTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L1Byb2plY3RCYXNlZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0Ow0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsNCi0NCi0vKioNCi0gKiBHZW5lcmFsIGNsYXNzIGZvciB0ZXN0cyB0aGF0IHNob3VsZCBiZSBzdGFydGVkIGFzIEpVbml0IFBsdWdpbiB0ZXN0cy4gUHJvdmlkZXMgYmFzaWMgZnVuY3Rpb25hbGl0aWVzIGZvciBmdW5jdGlvbmFsIHRlc3Rpbmc6IDEuIENyZWF0ZSBKYXZhIHByb2plY3QNCi0gKiBpbiBqdW5pdC1ydW50aW1lLXdvcmtiZW5jaC4gMi4gQ3JlYXRlIGRlZmF1bHQgc291cmNlIGZvbGRlci4gMy4gQ3JlYXRlIGRlZmF1bHQgcGFja2FnZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb2plY3RCYXNlZFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0JcHJpdmF0ZSBUZXN0UHJvamVjdCBwcm9qZWN0Ow0KLQ0KLQkvKioNCi0JICogPGNvZGU+c3JjRm9sZGVyTmFtZTwvY29kZT4gdGhlIHNvdXJjZSBmb2xkZXIgd2hlcmUgY2xhc3NlcyB3aWxsIGJlIGNyZWF0ZWQsIDxjb2RlPnBhY2thZ2VOYW1lPC9jb2RlPiBpcyB0aGUgcGFja2FnZSB3aGVyZSBjbGFzc2VzIHdpbGwgYmUNCi0JICogY3JlYXRlZC4NCi0JICogDQotCSAqIEBwYXJhbSBzcmNGb2xkZXJOYW1lDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIC0NCi0JICogICAgICAgICAgICAgaW4gY2FzZSBzcmNGb2xkZXJOYW1lIGlzIG51bGwNCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUphdmFQcm9qZWN0KFN0cmluZyBzcmNGb2xkZXJOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoc3JjRm9sZGVyTmFtZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigic3JjRm9sZGVyTmFtZSBzaG91bGQgbm90IGJlIG51bGwuIik7DQotCQl9DQotDQotCQlwcm9qZWN0ID0gbmV3IFRlc3RQcm9qZWN0KCk7DQotCQlwcm9qZWN0LmNyZWF0ZVNvdXJjZUZvbGRlcihzcmNGb2xkZXJOYW1lKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWlmIChwcm9qZWN0ICE9IG51bGwpDQotCQl7DQotCQkJcHJvamVjdC5kaXNwb3NlKCk7DQotCQl9DQotCX0NCi0NCi0JcHJvdGVjdGVkIGZpbmFsIFRlc3RQcm9qZWN0IGdldFRlc3RQcm9qZWN0KCkNCi0Jew0KLQkJcmV0dXJuIHByb2plY3Q7DQotCX0NCi0NCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFNvdXJjZUZvbGRlcigpDQotCXsNCi0JCXJldHVybiBwcm9qZWN0LmdldFNvdXJjZUZvbGRlcigpOw0KLQl9DQotDQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKQ0KLQl7DQotCQlyZXR1cm4gcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvcHJvamVjdC9UZXN0RWpiM1Byb2plY3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvcHJvamVjdC9UZXN0RWpiM1Byb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTBhNzliNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvVGVzdEVqYjNQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3Q7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmV4Y2VwdGlvbi5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotcHVibGljIGNsYXNzIFRlc3RFamIzUHJvamVjdA0KLXsNCi0JcHJpdmF0ZSBJUHJvamVjdCBlamJQcm9qZWN0Ow0KLQ0KLQlwdWJsaWMgVGVzdEVqYjNQcm9qZWN0KGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWVqYlByb2plY3QgPSBjcmVhdGVFamJNb2R1bGUobmFtZSArICJfIiArIExvbmcudG9TdHJpbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIFRlc3RFamIzUHJvamVjdChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgYm9vbGVhbiBhcHBlbmRVaWQsIGZpbmFsIGJvb2xlYW4gcmV1c2VFeGlzdGluZykgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHByb2plY3ROYW1lID0gbmV3IFN0cmluZ0J1aWxkZXIobmFtZSk7DQotCQlpZiAoYXBwZW5kVWlkKQ0KLQkJew0KLQkJCXByb2plY3ROYW1lLmFwcGVuZCgiXyIpOw0KLQkJCXByb2plY3ROYW1lLmFwcGVuZChMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7DQotCQl9DQotCQlJUHJvamVjdCBleGlzdGluZ1Byb2plY3QgPSBudWxsOw0KLQkJaWYgKHJldXNlRXhpc3RpbmcpDQotCQl7DQotCQkJZXhpc3RpbmdQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lLnRvU3RyaW5nKCkpOw0KLQkJfQ0KLQkJaWYgKGV4aXN0aW5nUHJvamVjdCA9PSBudWxsKQ0KLQkJew0KLQkJCXRoaXMuZWpiUHJvamVjdCA9IGNyZWF0ZUVqYk1vZHVsZShwcm9qZWN0TmFtZS50b1N0cmluZygpKTsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCXRoaXMuZWpiUHJvamVjdCA9IGV4aXN0aW5nUHJvamVjdDsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJUHJvamVjdCBjcmVhdGVFamJNb2R1bGUoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24gew0KLQkJcmV0dXJuIFRlc3RQcm9qZWN0c1V0aWxzLmNyZWF0ZUVqYjNQcm9qZWN0KG5hbWUpOw0KLQl9DQotDQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkNCi0Jew0KLQkJcmV0dXJuIGVqYlByb2plY3QuZ2V0UHJvamVjdCgpOw0KLQl9DQotDQotCXB1YmxpYyBJRm9sZGVyIGdldE1ldGFJbmZGb2xkZXIoKSB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uDQotCXsNCi0JCXJldHVybiBlamJQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGb2xkZXIoImVqYk1vZHVsZSIpLmdldEZvbGRlcigiTUVUQS1JTkYiKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudCBjcmVhdGVQYWNrYWdlKFN0cmluZyBzb3VyY2VGb2xkZXIsIFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoZ2V0UHJvamVjdCgpKTsNCi0JCWZpbmFsIElGb2xkZXIgZm9sZGVyID0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcihzb3VyY2VGb2xkZXIpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudFJvb3Qgc3JjRm9sZGVyID0gamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChmb2xkZXIpOw0KLQkJcmV0dXJuIHNyY0ZvbGRlci5jcmVhdGVQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUsIGZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSUZpbGUgY3JlYXRlRmlsZShmaW5hbCBJRm9sZGVyIGZvbGRlciwgZmluYWwgU3RyaW5nIGZpbGVOYW1lLCBmaW5hbCBVUkwgaW5wdXRVcmwpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZm9sZGVyLCAiZm9sZGVyIik7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZmlsZU5hbWUsICJmaWxlTmFtZSIpOw0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGlucHV0VXJsLCAiaW5wdXRVcmwiKTsNCi0JCQ0KLQkJZmluYWwgSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKGZpbGVOYW1lKTsNCi0JCWZpbmFsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaW5wdXRVcmwub3BlblN0cmVhbSgpOw0KLQkJdHJ5DQotCQl7DQotCQkJZmlsZS5jcmVhdGUoaW5wdXRTdHJlYW0sIGZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsNCi0JCQlyZXR1cm4gZmlsZTsNCi0JCX0NCi0JCWZpbmFsbHkNCi0JCXsNCi0JCQlpbnB1dFN0cmVhbS5jbG9zZSgpOw0KLQkJfQ0KLQl9DQotCQ0KLQkvKiogVG8gZ2V0IGEgaGFuZGxlIHRvIGEgZmlsZSBsb2NhdGVkIGluIHRoaXMgcHJvamVjdCBzcGVjaWZpZWQgYnkgdGhlIHJlbGF0aXZlIGZpbGUgcGF0aC4NCi0JICogQHBhcmFtIGZpbGVQYXRoIGZpbGUgcGF0aCByZWxhdGl2ZSBpbnNpZGUgb2YgdGhlIHByb2plY3QsIGkuZS4gdGhlIHByb2plY3QgbmFtZSBtdXN0IE5PVA0KLQkgKiAgYmUgcGFydCBvZiB0aGUgcGF0aCANCi0JICogQHJldHVybiB0aGUgZmlsZSBoYW5kbGUgKi8NCi0JcHVibGljIGZpbmFsIElGaWxlIGdldEZpbGUoZmluYWwgU3RyaW5nIGZpbGVQYXRoKQ0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZmlsZVBhdGgsICJmaWxlUGF0aCIpOw0KLQkJcmV0dXJuIHRoaXMuZWpiUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RmlsZShmaWxlUGF0aCk7DQotCX0NCi0NCi0JcHVibGljIGZpbmFsIHZvaWQgZGVsZXRlRmlsZShmaW5hbCBJRm9sZGVyIGZvbGRlciwgZmluYWwgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24NCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGZvbGRlciwgImZvbGRlciIpOw0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGZpbGVOYW1lLCAiZmlsZU5hbWUiKTsNCi0JCQ0KLQkJZmluYWwgSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKGZpbGVOYW1lKTsNCi0JCWlmIChmaWxlLmV4aXN0cygpKQ0KLQkJew0KLQkJCWZpbGUuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOw0KLQkJfQ0KLQl9DQotCQ0KLQkvKiogVG8gY3JlYXRlIGEgcHJvamVjdCBmb2xkZXIgc3BlY2lmaWVkIGJ5IHRoZSByZWxhdGl2ZSBmb2xkZXIgcGF0aC4gQWxsIGZvbGRlciBzZWdtZW50cw0KLQkgKiBoYXZlIGFscmVhZHkgdG8gZXhpc3QgYXBhcnQgZnJvbSB0aGUgbGFzdCBvbmUsIGkuZS4gcGFyZW50IGZvbGRlcnMgYXJlIG5vdCBjcmVhdGVkIGF1dG9tYXRpY2FsbHkuDQotCSAqIEBwYXJhbSBmb2xkZXJQYXRoIGZvbGRlciBwYXRoIHJlbGF0aXZlIGluc2lkZSBvZiB0aGUgcHJvamVjdCwgaS5lLiB0aGUgcHJvamVjdCBuYW1lIG11c3QgTk9UDQotCSAqICBiZSBwYXJ0IG9mIHRoZSBwYXRoIA0KLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGZvbGRlcg0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gKi8NCi0JcHVibGljIGZpbmFsIElGb2xkZXIgY3JlYXRlRm9sZGVyKGZpbmFsIFN0cmluZyBmb2xkZXJQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZm9sZGVyUGF0aCwgImZvbGRlclBhdGgiKTsNCi0JCQ0KLQkJZmluYWwgSUZvbGRlciBmb2xkZXIgPSB0aGlzLmVqYlByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZvbGRlcihmb2xkZXJQYXRoKTsNCi0JCWZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7DQotCQlyZXR1cm4gZm9sZGVyOw0KLQl9DQotDQotCS8qKiBUbyBnZXQgYSBoYW5kbGUgdG8gYSBwcm9qZWN0IGZvbGRlciBzcGVjaWZpZWQgYnkgdGhlIHJlbGF0aXZlIGZvbGRlciBwYXRoLg0KLQkgKiBAcGFyYW0gZm9sZGVyUGF0aCBmb2xkZXIgcGF0aCByZWxhdGl2ZSBpbnNpZGUgb2YgdGhlIHByb2plY3QsIGkuZS4gdGhlIHByb2plY3QgbmFtZSBtdXN0IE5PVA0KLQkgKiAgYmUgcGFydCBvZiB0aGUgcGF0aCANCi0JICogQHJldHVybiB0aGUgZm9sZGVyIGhhbmRsZSAqLw0KLQlwdWJsaWMgZmluYWwgSUZvbGRlciBnZXRGb2xkZXIoZmluYWwgU3RyaW5nIGZvbGRlclBhdGgpDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmb2xkZXJQYXRoLCAiZm9sZGVyUGF0aCIpOw0KLQkJcmV0dXJuIHRoaXMuZWpiUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKGZvbGRlclBhdGgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvcHJvamVjdC9UZXN0UHJvamVjdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L1Rlc3RQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAyMDc1OGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L1Rlc3RQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3Q7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam9icy5Kb2JVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsNCi0NCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQ0KLXB1YmxpYyBjbGFzcyBUZXN0UHJvamVjdA0KLXsNCi0JcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyIENMQVNTX1NFUEFSQVRPUiA9ICcjJzsNCi0JDQotCXByaXZhdGUgaW50IGlkSW5NaWxsaXMgPSAwOw0KLQkNCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0Ow0KLQ0KLQlwcml2YXRlIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsNCi0NCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50Um9vdCBzb3VyY2VGb2xkZXI7DQotDQotCXB1YmxpYyBUZXN0UHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRoaXMoIiIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgVGVzdFByb2plY3QoU3RyaW5nIG5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOw0KLQkJLyoNCi0JCSAqIENhbGN1bGF0ZSB0aGUgbmFtZSBvZiB0aGUgdGVzdCBwcm9qZWN0LiBUaGUgZm9ybXVsYTogSmF2YVByb2pfICsgPGN1cnJlbnRfdGltZV9pbl9taWxsaXM/ICsgPGlkSW5NaWxsaXM+IGlzIHVzc2VkLiBJbiB0aGlzIGZvcm11bGENCi0JCSAqIEphdmFQcm9qXyBpcyBhIHN0cmluZyBsaXR0ZXJhbCwgY3VycmVudF90aW1lX2luX21pbGxpcyBpcyBvYnZpb3VzLiBpZEluTWlsbGlzIGlzIGFuIGludGVnZXIgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIGEgcHJvamVjdCBuYW1lIGlzDQotCQkgKiBjYWxjdWxhdGVkLiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBzeXN0ZW0gdGltZXIgaGFzIHByZWNpc2lvbiBhYm91dCAxMCBtcy4gVGh1cyBpdCdzIHBvc3NpYmxlIHRoYXQgdHdvIGNvbnNlY3V0aXZlIHByb2plY3QgY3JlYXRpb25zDQotCQkgKiBnaXZlIHRoZSBzYW1lIHByb2plY3QgbmFtZS4gRm9yIGV4YW1wbGUgdGhlIHByb2plY3QgaXMgY3JldGVkIHRoZW4gdGhlIHRlc3QgZXhlY3V0ZXMgdmVyeSBmYXN0IGFuZCBhIG5ldyBwcm9qZWN0IGlzIGNyZWF0ZWQgYWdhaW4uIEluIHRoZQ0KLQkJICogc2FtZSB0aW1lIHNpbXBseSB0aGUgaWQgaXMgbm90IGVub3VnaCBhcyBhIGRpZmZlcmVudCB0ZXN0IHJ1biBtaWdodCBwcm9kdWNlIHRoZSBzYW1lIHByb2plY3QgbmFtZS4gVGh1cyB0aGUgY29tYmluYXRpb24gdGltX21pbGxpcyArDQotCQkgKiBpZEluTWlsbGlzIGdpdmVzIGEgdW5pcXVlIHByb2plY3QgbmFtZQ0KLQkJICovDQotCQlmaW5hbCBTdHJpbmcgdGVzdFByb2plY3ROYW1lID0gIkphdmFQcm9qXyIgKyBMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSArICJfIiArIGlkSW5NaWxsaXMrKyArIG5hbWU7DQotCQlwcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KHRlc3RQcm9qZWN0TmFtZSk7DQotCQlwcm9qZWN0LmNyZWF0ZShudWxsKTsNCi0JCXByb2plY3Qub3BlbihudWxsKTsNCi0NCi0JCWNvbmZpZ3VyZUphdmFQcm9qZWN0KCk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUphdmFQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7DQotDQotCQlJRm9sZGVyIGJpbkZvbGRlciA9IGNyZWF0ZUJpbkZvbGRlcigpOw0KLQ0KLQkJc2V0SmF2YU5hdHVyZSgpOw0KLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ldyBJQ2xhc3NwYXRoRW50cnlbMF0sIG51bGwpOw0KLQ0KLQkJY3JlYXRlT3V0cHV0Rm9sZGVyKGJpbkZvbGRlcik7DQotCQlhZGRTeXN0ZW1MaWJyYXJpZXMoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgVGVzdFByb2plY3QoZmluYWwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJaWYgKHByb2plY3QgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInByb2plY3Qgc2hvdWxkIG5vdCBiZSBudWxsIik7DQotCQl9DQotDQotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0Ow0KLQkJdGhpcy5qYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsNCi0JCXRoaXMuc291cmNlRm9sZGVyID0gZmluZFNvdXJjZUZvbGRlcigpOw0KLQl9DQotDQotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3QgZmluZFNvdXJjZUZvbGRlcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCBwZnIgOiBqYXZhUHJvamVjdC5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpKQ0KLQkJew0KLQkJCWlmIChwZnIuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHBmcjsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpDQotCXsNCi0JCXJldHVybiBwcm9qZWN0Ow0KLQl9DQotDQotCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKQ0KLQl7DQotCQlyZXR1cm4gamF2YVByb2plY3Q7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgYWRkSmFyKFN0cmluZyBwbHVnaW4sIFN0cmluZyBqYXIpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJUGF0aCByZXN1bHQgPSBmaW5kRmlsZUluUGx1Z2luKHBsdWdpbiwgamFyKTsNCi0JCUlDbGFzc3BhdGhFbnRyeVtdIG9sZEVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsNCi0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0VudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZEVudHJpZXMubGVuZ3RoICsgMV07DQotCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIG9sZEVudHJpZXMubGVuZ3RoKTsNCi0JCW5ld0VudHJpZXNbb2xkRW50cmllcy5sZW5ndGhdID0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KHJlc3VsdCwgbnVsbCwgbnVsbCk7DQotCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3RW50cmllcywgbnVsbCk7DQotCQkNCi0JCVN0cmluZyBsb2cgPSAiXG4iK2phdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkrIlxuIitTdHJpbmcudmFsdWVPZihqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKS5sZW5ndGgpKyJcbiI7IA0KLQ0KLQkJZm9yKGludCBpaT0wOyBpaSA8IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlsb2cgPSBsb2cgKyAgamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKClbaWldLmdldFBhdGgoKS50b1N0cmluZygpKyJcbiI7DQotCQl9DQotCQkNCi0JCWlmKGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpLmxlbmd0aD09MCkNCi0JCXsNCi0JCQlsb2cgPSBsb2cgKyAiQ2xhc3NwYXRoIG5vdCBpbml0aWFsaXplZCAhXG4iOw0KLQkJfQ0KLQkJDQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoMCwidGVzdE91dHB1dCIsbG9nKSk7DQotCX0NCi0NCi0JcHVibGljIElQYWNrYWdlRnJhZ21lbnQgY3JlYXRlUGFja2FnZShTdHJpbmcgbmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJaWYgKHNvdXJjZUZvbGRlciA9PSBudWxsKQ0KLQkJCXNvdXJjZUZvbGRlciA9IGNyZWF0ZVNvdXJjZUZvbGRlcigic3JjIik7DQotCQlyZXR1cm4gc291cmNlRm9sZGVyLmNyZWF0ZVBhY2thZ2VGcmFnbWVudChuYW1lLCBmYWxzZSwgbnVsbCk7DQotCX0NCi0NCi0JcHVibGljIElUeXBlIGNyZWF0ZVR5cGUoSVBhY2thZ2VGcmFnbWVudCBwYWNrLCBTdHJpbmcgY3VOYW1lLCBTdHJpbmcgc291cmNlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotCQlidWYuYXBwZW5kKCJwYWNrYWdlICIgKyBwYWNrLmdldEVsZW1lbnROYW1lKCkgKyAiO1xuIik7DQotCQlidWYuYXBwZW5kKCJcbiIpOw0KLQkJYnVmLmFwcGVuZChzb3VyY2UpOw0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHBhY2suY3JlYXRlQ29tcGlsYXRpb25Vbml0KGN1TmFtZSwgYnVmLnRvU3RyaW5nKCksIGZhbHNlLCBudWxsKTsNCi0JCXJldHVybiBjdS5nZXRUeXBlcygpWzBdOw0KLQl9DQotDQotCQ0KLQkvKioNCi0JICogQ3JlYXRlcyBtdWx0aXBsZSBjbGFzc2VzIGluIHByb2plY3QuIFRoZSBjb250ZW50IG9mIDxjb2RlPnNvdXJjZTwvY29kZT4gc2hvdWxkIGJlIGluIGZvcm0gLQ0KLQkgKiAnIycgY2hhciAoc2VwYXJhdG9yIGZvciBjbGFzc2VzKSBmb2xsb3dlZCBieSBDbGFzcyBuYW1lLCBuZXcgbGluZSBhbmQgYWZ0ZXIgdGhhdCBjbGFzcyBzb3VyY2Ugd2l0aG91dCBwYWNrYWdlIGRlY2xhcmF0aW9uLjxicj4NCi0JICogRXhhbXBsZToNCi0JICogDQotCSAqIDxwcmU+DQotCSAqICAjSW1wbGVtZW50c1JlbW90ZQ0KLQkgKiAgcHVibGljIGNsYXNzIEltcGxlbWVudHNSZW1vdGUgaW1wbGVtZW50cyBqYXZhLnJtaS5SZW1vdGUNCi0JICogIHsNCi0JICogIH0NCi0JICogCQ0KLQkgKiAgI05vRGVmYXVsdENvbnN0cnVjdG9yDQotCSAqICBwdWJsaWMgY2xhc3MgTm9EZWZhdWx0Q29uc3RydWN0b3IgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQ0KLQkgKiAgew0KLQkgKiAJcHVibGljIE5vRGVmYXVsdENvbnN0cnVjdG9yKFN0cmluZyBwYXJhbSkgew0KLQkgKiAgCX0NCi0JICogIH0NCi0JICogPC9wcmU+DQotCSAqIA0KLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgaWYgbG90cyBvZiBzbWFsbCBjbGFzc2VzIHNob3VsZCBiZSBjcmVhdGVkIGZyb20gYSBzb3VyY2UgZmlsZS4NCi0JICogDQotCSAqIEBwYXJhbSBzb3VyY2VzRmlsZVBhdGgNCi0JICogQHJldHVybiBtYXAgb2YgY2xhc3NOYW1lLT5JVHlwZS4gdGhhdCBoYXZlIGJlZW4gY3JlYXRlZA0KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIE1hcDxTdHJpbmcsIElUeXBlPiBjcmVhdGVUeXBlcyhJUGFja2FnZUZyYWdtZW50IHBhY2ssIFN0cmluZyBzb3VyY2UpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJTWFwPFN0cmluZywgSVR5cGU+IHR5cGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJVHlwZT4oKTsNCi0JCWludCBzdGFydFBvcyA9IDA7DQotCQl3aGlsZSAoKHN0YXJ0UG9zID0gc291cmNlLmluZGV4T2YoQ0xBU1NfU0VQQVJBVE9SKSkgPiAtMSkNCi0JCXsNCi0JCQlpbnQgZW5kUG9zID0gc291cmNlLmluZGV4T2YoQ0xBU1NfU0VQQVJBVE9SLCBzdGFydFBvcyArIDEpOw0KLQkJCWlmIChlbmRQb3MgPT0gLTEpIHsNCi0JCQkJZW5kUG9zID0gc291cmNlLmxlbmd0aCgpOw0KLQkJCX0NCi0NCi0JCQlTdHJpbmcgc3JjID0gc291cmNlLnN1YnN0cmluZyhzdGFydFBvcyArIDEsIGVuZFBvcyk7DQotCQkJc291cmNlID0gc291cmNlLnN1YnN0cmluZyhlbmRQb3MpOw0KLQ0KLQkJCVN0cmluZyBjbGFzc05hbWUgPSBzcmMuc3Vic3RyaW5nKDAsIHNyYy5pbmRleE9mKCdcbicpKS5yZXBsYWNlQWxsKCJcciIsICIiKS50cmltKCk7DQotCQkJc3JjID0gc3JjLnN1YnN0cmluZyhzcmMuaW5kZXhPZignXG4nKSArIDEpOw0KLQ0KLQkJCXR5cGVzLnB1dChjbGFzc05hbWUsIGNyZWF0ZVR5cGUocGFjaywgY2xhc3NOYW1lICsgIi5qYXZhIiwgc3JjKSk7DQotCQl9DQotDQotCQlyZXR1cm4gdHlwZXM7DQotCX0JCQ0KLQkNCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQl0cnkgew0KLQkJCXByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7DQotCQkJcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7DQotCQl9IGNhdGNoIChSZXNvdXJjZUV4Y2VwdGlvbiByZSkgew0KLQkJCS8qDQotCQkJICogc2lsZW50bHkgc3dhbGxvdyB0aGUgcmVzb3VyY2UgZXhjZXB0aW9uLiBGb3Igc29tZSByZWFzb24gdGhpcyBleGNlcHRpb24gZ2V0cyB0aHJvd24NCi0JCQkgKiBmcm9tIHRpbWUgdG8gdGltZSBhbmQgcmVwb3J0cyB0aGUgdGVzdCBmYWlsaW5nLiBUaGUgcHJvamVjdCBkZWxldGlvbiBpdHNlbGYgaGFwcGVucw0KLQkJCSAqIGFmdGVyIHRoZSB0ZXN0IGhhcyBjb21wbGV0ZWQgYW5kIGEgZmFpbHVyZSB3aWxsIG5vdCByZXBvcnQgYSBwcm9ibGVtIGluIHRoZSB0ZXN0Lg0KLQkgICAgCSAqIE9ubHkgUmVzb3VyY2VFeGNlcHRpb24gaXMgY2F1Z2h0IGluIG9yZGVyIG5vdCB0byBoaWRlIHVuZXhwZWN0ZWQgZXJyb3JzLgkNCi0JCQkgKi8NCi0JCQlyZXR1cm47DQotCQl9DQotCX0NCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlwcm9qZWN0LmNsb3NlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwkJDQotCX0NCi0NCi0JcHJpdmF0ZSBJRm9sZGVyIGNyZWF0ZUJpbkZvbGRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUlGb2xkZXIgYmluRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoImJpbiIpOw0KLQkJYmluRm9sZGVyLmNyZWF0ZShmYWxzZSwgdHJ1ZSwgbnVsbCk7DQotCQlyZXR1cm4gYmluRm9sZGVyOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBzZXRKYXZhTmF0dXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsNCi0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXcgU3RyaW5nW10geyBKYXZhQ29yZS5OQVRVUkVfSUQgfSk7DQotCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgY3JlYXRlT3V0cHV0Rm9sZGVyKElGb2xkZXIgYmluRm9sZGVyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUlQYXRoIG91dHB1dExvY2F0aW9uID0gYmluRm9sZGVyLmdldEZ1bGxQYXRoKCk7DQotCQlqYXZhUHJvamVjdC5zZXRPdXRwdXRMb2NhdGlvbihvdXRwdXRMb2NhdGlvbiwgbnVsbCk7DQotCX0NCi0NCi0JcHVibGljIElQYWNrYWdlRnJhZ21lbnRSb290IGNyZWF0ZVNvdXJjZUZvbGRlcihTdHJpbmcgbmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJSUZvbGRlciBmb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihuYW1lKTsNCi0JCWZvbGRlci5jcmVhdGUoZmFsc2UsIHRydWUsIG51bGwpOw0KLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoZm9sZGVyKTsNCi0NCi0JCUlDbGFzc3BhdGhFbnRyeVtdIG9sZEVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsNCi0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0VudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZEVudHJpZXMubGVuZ3RoICsgMV07DQotCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIG9sZEVudHJpZXMubGVuZ3RoKTsNCi0JCW5ld0VudHJpZXNbb2xkRW50cmllcy5sZW5ndGhdID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkocm9vdC5nZXRQYXRoKCkpOw0KLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0VudHJpZXMsIG51bGwpOw0KLQkJdGhpcy5zb3VyY2VGb2xkZXIgPSByb290Ow0KLQkJDQotCQlTdHJpbmcgbG9nID0gIlxuIitqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKyJcbiIrU3RyaW5nLnZhbHVlT2YoamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCkubGVuZ3RoKSsiXG4iOyANCi0NCi0JCWZvcihpbnQgaWk9MDsgaWkgPCBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKS5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJbG9nID0gbG9nICsgIGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpW2lpXS5nZXRQYXRoKCkudG9TdHJpbmcoKSsiXG4iOw0KLQkJfQ0KLQkJDQotCQlpZihqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKS5sZW5ndGg9PTApDQotCQl7DQotCQkJbG9nID0gbG9nICsgIkNsYXNzcGF0aCBub3QgaW5pdGlhbGl6ZWQgIVxuIjsNCi0JCX0NCi0JCQ0KLQkJUmVzb3VyY2VzUGx1Z2luLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKDAsInRlc3RPdXRwdXQiLGxvZykpOw0KLQkJDQotCQlyZXR1cm4gcm9vdDsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgYWRkU3lzdGVtTGlicmFyaWVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlJQ2xhc3NwYXRoRW50cnlbXSBvbGRFbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7DQotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvbGRFbnRyaWVzLmxlbmd0aCArIDFdOw0KLQkJU3lzdGVtLmFycmF5Y29weShvbGRFbnRyaWVzLCAwLCBuZXdFbnRyaWVzLCAwLCBvbGRFbnRyaWVzLmxlbmd0aCk7DQotCQluZXdFbnRyaWVzW29sZEVudHJpZXMubGVuZ3RoXSA9IEphdmFSdW50aW1lLmdldERlZmF1bHRKUkVDb250YWluZXJFbnRyeSgpOw0KLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0VudHJpZXMsIG51bGwpOw0KLQkJDQotCQlTdHJpbmcgbG9nID0gIlxuIitqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKyJcbiIrU3RyaW5nLnZhbHVlT2YoamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCkubGVuZ3RoKSsiXG4iOyANCi0NCi0JCWZvcihpbnQgaWk9MDsgaWkgPCBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKS5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJbG9nID0gbG9nICsgIGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpW2lpXS5nZXRQYXRoKCkudG9TdHJpbmcoKSsiXG4iOw0KLQkJfQ0KLQkJDQotCQlpZihqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKS5sZW5ndGg9PTApDQotCQl7DQotCQkJbG9nID0gbG9nICsgIkNsYXNzcGF0aCBub3QgaW5pdGlhbGl6ZWQgIVxuIjsNCi0JCX0NCi0JCQ0KLQkJUmVzb3VyY2VzUGx1Z2luLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKDAsInRlc3RPdXRwdXQiLGxvZykpOw0KLQl9DQotDQotCXByaXZhdGUgUGF0aCBmaW5kRmlsZUluUGx1Z2luKFN0cmluZyBwbHVnaW4sIFN0cmluZyBmaWxlKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbg0KLQl7DQotCQlCdW5kbGUgcGx1Z2luQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbik7DQotCQlVUkwgamFyVVJMID0gbmV3IFVSTChwbHVnaW5CdW5kbGUuZ2V0RW50cnkoIi8iKSwgZmlsZSk7DQotCQlVUkwgbG9jYWxKYXJVUkwgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwoamFyVVJMKTsNCi0JCXJldHVybiBuZXcgUGF0aChsb2NhbEphclVSTC5nZXRQYXRoKCkpOw0KLQl9DQotDQotCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRTb3VyY2VGb2xkZXIoKQ0KLQl7DQotCQlyZXR1cm4gc291cmNlRm9sZGVyOw0KLQl9DQotCQ0KLQkvKioNCi0JICogDQotCSAqIEByZXR1cm4gdGhlIGNvbnRhaW5lciBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QsIGkuZS4gdGhlIHNvdXJjZSBmb2xkZXIuPGJyPg0KLQkgKiBJZiB0aGlzIHByb2plY3QgaXMgYSBqYXIvemlwIChpZiB0aGlzIGlzIHBvc3NpYmxlIGF0IGFsbCksIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbC4NCi0JICovDQotCXB1YmxpYyBJQ29udGFpbmVyIGdldFNvdXJjZUZvbGRlckNvbnRhaW5lcigpDQotCXsNCi0JCXRyeXsNCi0JCQlJUmVzb3VyY2UgcmVzID0gZ2V0U291cmNlRm9sZGVyKCkuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7DQotCQkJaWYocmVzPT1udWxsKSB7DQotCQkJCXJldHVybiBudWxsOw0KLQkJCX1lbHNlIHsNCi0JCQkJSUNvbnRhaW5lciByZXRWYWwgPSAoSUNvbnRhaW5lcikgcmVzOw0KLQkJCQlyZXR1cm4gcmV0VmFsOw0KLQkJCX0NCi0JCX1jYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX1jYXRjaChDbGFzc0Nhc3RFeGNlcHRpb24gZXgpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgSUZvbGRlciBjcmVhdGVGb2xkZXIoZmluYWwgU3RyaW5nIGZvbGRlck5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmb2xkZXJOYW1lLCAiZm9sZGVyTmFtZSIpOw0KLQkJZmluYWwgSUZvbGRlciBmb2xkZXIgPSB0aGlzLnByb2plY3QuZ2V0Rm9sZGVyKGZvbGRlck5hbWUpOw0KLQkJZm9sZGVyLmNyZWF0ZShmYWxzZSwgdHJ1ZSwgbnVsbCk7DQotCQlyZXR1cm4gZm9sZGVyOwkJDQotCX0NCi0JDQotCS8qKg0KLQkgKiBTZXQgdGhlIHByb2plY3Qgcm9vdCBhcyBzb3VyY2UgZm9sZGVyDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgYXNzaWduUHJvamVjdFJvb3RBc1NvdXJjZUZvbGRlcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJSUNsYXNzcGF0aEVudHJ5IGRlZmF1bHRTcmNGb2xkZXJFbnRyeSA9IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KHByb2plY3QuZ2V0RnVsbFBhdGgoKSk7DQotCQlJQ2xhc3NwYXRoRW50cnlbXSBvbGRDcCA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOw0KLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q3AgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZENwLmxlbmd0aCArIDFdOw0KLQkJU3lzdGVtLmFycmF5Y29weShvbGRDcCwgMCwgbmV3Q3AsIDAsIG9sZENwLmxlbmd0aCk7DQotCQluZXdDcFtuZXdDcC5sZW5ndGggLSAxXSA9IGRlZmF1bHRTcmNGb2xkZXJFbnRyeTsNCi0JCQ0KLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NwLCBudWxsKTsNCi0JCXRoaXMuc291cmNlRm9sZGVyID0gIFRlc3RQcm9qZWN0c1V0aWxzLmdldFNvdXJjZUZvbGRlcihwcm9qZWN0LCAiIik7DQotCQkNCi0JCVN0cmluZyBsb2cgPSAiXG4iK2phdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkrIlxuIitTdHJpbmcudmFsdWVPZihqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKS5sZW5ndGgpKyJcbiI7IA0KLQ0KLQkJZm9yKGludCBpaT0wOyBpaSA8IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlsb2cgPSBsb2cgKyAgamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKClbaWldLmdldFBhdGgoKS50b1N0cmluZygpKyJcbiI7DQotCQl9DQotCQkNCi0JCWlmKGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpLmxlbmd0aD09MCkNCi0JCXsNCi0JCQlsb2cgPSBsb2cgKyAiQ2xhc3NwYXRoIG5vdCBpbml0aWFsaXplZCAhXG4iOw0KLQkJfQ0KLQkJDQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoMCwidGVzdE91dHB1dCIsbG9nKSk7DQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L1Rlc3RQcm9qZWN0c1V0aWxzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvVGVzdFByb2plY3RzVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWJiMzM4Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvVGVzdFByb2plY3RzVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdDsNCi0NCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhdHRlcm47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5UeXBlTmFtZVJlcXVlc3RvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qb2JzLkpvYlV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnRocmVhZGluZy5UZXN0Q29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0UHJvamVjdHNVdGlscw0KLXsNCi0JLyoqDQotCSAqIFJlYWRzIGNvbnRlbnQgb2YgdGV4dCBmaWxlIGFuZCByZXR1cm5zIGl0IGFzIFN0cmluZy4NCi0JICogDQotCSAqIEBwYXJhbSBjbGFzcyBjb250ZXh0DQotCSAqIEBwYXJhbSBuYW1lDQotCSAqIEByZXR1cm4NCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZFNvdXJjZShDbGFzczw/PiBjbGFzc0NvbnRleHQsIFN0cmluZyBmaWxlUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCUlucHV0U3RyZWFtUmVhZGVyIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihjbGFzc0NvbnRleHQuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlUGF0aCkpOw0KLQkJdHJ5DQotCQl7DQotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQkJCWNoYXJbXSBidWZmID0gbmV3IGNoYXJbNTEyXTsNCi0NCi0JCQlpbnQgbGVuID0gMDsNCi0JCQl3aGlsZSAoKGxlbiA9IGlzci5yZWFkKGJ1ZmYpKSA+IDApDQotCQkJew0KLQkJCQlzYi5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoYnVmZiwgMCwgbGVuKSk7DQotCQkJfQ0KLQ0KLQkJCXJldHVybiBzYi50b1N0cmluZygpOw0KLQ0KLQkJfSBmaW5hbGx5DQotCQl7DQotCQkJaXNyLmNsb3NlKCk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFN0YXJ0cyBhbiBpbmRleGVyIGpvYi4gVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCB3b3JrYmVuY2ggcmVmcmVzaC9idWlsZCBwcm9jZXNzZXMgYXJlIG92ZXIgDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckluZGV4ZXIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2hBbGxUeXBlTmFtZXMobnVsbCwgU2VhcmNoUGF0dGVybi5SX0VYQUNUX01BVENILCANCi0JCQkJCQkJCQkJCSAgbnVsbCwgU2VhcmNoUGF0dGVybi5SX0NBU0VfU0VOU0lUSVZFLCANCi0JCQkJCQkJCQkJCSAgSUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1MsIA0KLQkJCQkJCQkJCQkJICBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKG5ldyBJSmF2YUVsZW1lbnRbMF0pLCBuZXcgVHlwZU5hbWVSZXF1ZXN0b3IoKQ0KLQkJCQkJCQkJCQkJICB7DQotCQkJCQkJCQkJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQkJCQkJCQkJCQkJcHVibGljIHZvaWQgYWNjZXB0Q2xhc3MoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywNCi0JCQkJCQkJCQkJCQkJCQkJCQkJCVN0cmluZyBwYXRoKQ0KLQkJCQkJCQkJCQkJCQl7DQotCQkJCQkJCQkJCQkJCX0NCi0JCQkJCQkJCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCi0JCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBhY2NlcHRJbnRlcmZhY2UoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywNCi0JCQkJCQkJCQkJCQkJCQkJCQkJCVN0cmluZyBwYXRoKQ0KLQkJCQkJCQkJCQkJCQl7DQotCQkJCQkJCQkJCQkJCX0NCi0JCQkJCQkJCQkJCSAgfSwNCi0JCQkJCQkJCQkJCSAgSUphdmFTZWFyY2hDb25zdGFudHMuV0FJVF9VTlRJTF9SRUFEWV9UT19TRUFSQ0gsIG51bGwpOw0KLQl9DQotDQotCQ0KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGNyZWF0ZUphdmFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7DQotCQlwcm9qZWN0LmNyZWF0ZShudWxsKTsNCi0JCXByb2plY3Qub3BlbihudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JJbmRleGVyKCk7DQotCQkNCi0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7DQotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3IFN0cmluZ1tdIHsgSmF2YUNvcmUuTkFUVVJFX0lEIH0pOw0KLQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7DQotCQlJSmF2YVByb2plY3QgamF2YVAgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7DQotCQlhZGRUb0NsYXNzcGF0aChqYXZhUCwgSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdEpSRUNvbnRhaW5lckVudHJ5KCkpOw0KLQ0KLQkJcmV0dXJuIHByb2plY3Q7DQotCX0NCi0JDQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkVG9DbGFzc3BhdGgoZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgY3BFbnRyeSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlJQ2xhc3NwYXRoRW50cnlbXSBvbGRFbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7DQotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvbGRFbnRyaWVzLmxlbmd0aCArIDFdOw0KLQkJU3lzdGVtLmFycmF5Y29weShvbGRFbnRyaWVzLCAwLCBuZXdFbnRyaWVzLCAwLCBvbGRFbnRyaWVzLmxlbmd0aCk7DQotCQluZXdFbnRyaWVzW29sZEVudHJpZXMubGVuZ3RoXSA9IGNwRW50cnk7DQotCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3RW50cmllcywgbnVsbCk7DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRTb3VyY2VGb2xkZXIoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGZvbGRlck5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOw0KLQkJZm9yKElQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgOiBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpKQ0KLQkJew0KLQkJCWlmKHJvb3QuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoZm9sZGVyTmFtZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gcm9vdDsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwdWJsaWMgc3RhdGljIElQYWNrYWdlRnJhZ21lbnRSb290IGNyZWF0ZVNvdXJjZUZvbGRlcihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZm9sZGVyTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJaWYoZ2V0U291cmNlRm9sZGVyKHByb2plY3QsIGZvbGRlck5hbWUpICE9IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU291cmNlIGZvbGRlciBhbHJlYWR5IGV4aXN0czogIiArIGZvbGRlck5hbWUpOw0KLQkJfQ0KLQ0KLQkJSUZvbGRlciBzcmNGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihmb2xkZXJOYW1lKTsNCi0JCXNyY0ZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7DQotCQkNCi0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsNCi0JCUlDbGFzc3BhdGhFbnRyeSBzcmNDcEVudHJ5ID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkoc3JjRm9sZGVyLmdldEZ1bGxQYXRoKCkubWFrZUFic29sdXRlKCkpOw0KLQkJSUNsYXNzcGF0aEVudHJ5W10gb2xkRW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOw0KLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3RW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb2xkRW50cmllcy5sZW5ndGggKyAxXTsgDQotCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIG9sZEVudHJpZXMubGVuZ3RoKTsNCi0JCW5ld0VudHJpZXNbbmV3RW50cmllcy5sZW5ndGggLSAxXSA9IHNyY0NwRW50cnk7DQotCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3RW50cmllcywgbnVsbCk7DQotDQotCQlyZXR1cm4gZ2V0U291cmNlRm9sZGVyKHByb2plY3QsIGZvbGRlck5hbWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBJbXBvcnRzIGEgZmlsZSBpbnRvIGEgcHJvamVjdA0KLQkgKiBAcGFyYW0gY2xhc3NDb250ZXh0IHRoZSBjbGFzcyB3aGljaCBjbGFzc2xvYWRlciBpcyB1c2VkIHRvIGdldCB0aGUgc291cmNlIHJlc291cmNlIA0KLQkgKiBAcGFyYW0gcmVsYXRpdmVTcmNGaWxlTG9jYXRpb24gc291cmNlIGZpbGUgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIDxjb2RlPmNsYXNzQ29udGV4dDwvY29kZT4gcGFyYW1ldGVyDQotCSAqIEBwYXJhbSB0YXJnZXRSZXNvdXJjZSB0aGUgdGFyZ2V0IHJlc291cmNlOyANCi0JICogQHBhcmFtIHRhcmdldEZpbGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIGNyZWF0ZWQNCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKiBAcmV0dXJucyB0aGUgZmlsZSBpbXBvcnRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBGaWxlIGltcG9ydEZpbGVJbnRvUHJvamVjdChDbGFzczw/PiBjbGFzc0NvbnRleHQsIFN0cmluZyByZWxhdGl2ZVNyY0ZpbGVMb2NhdGlvbiwgSUNvbnRhaW5lciB0YXJnZXRSZXNvdXJjZSwgU3RyaW5nIHRhcmdldEZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nIHNyYyA9IFRlc3RQcm9qZWN0c1V0aWxzLnJlYWRTb3VyY2UoY2xhc3NDb250ZXh0LCByZWxhdGl2ZVNyY0ZpbGVMb2NhdGlvbik7DQotCQlGaWxlIGYgPSBuZXcgRmlsZSh0YXJnZXRSZXNvdXJjZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSArICJcXCIgKyB0YXJnZXRGaWxlTmFtZSk7DQotCQkNCi0JCWlmKGYuZXhpc3RzKCkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRmlsZSBhbHJlYWR5IGV4aXN0czogIiArIGYuZ2V0QWJzb2x1dGVQYXRoKCkpOw0KLQkJfQ0KLQkJDQotCQlpZihmLmlzRGlyZWN0b3J5KCkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmLmdldEFic29sdXRlUGF0aCgpICsgIiBpcyBhIGRpcmVjdG9yeSIpOw0KLQkJfQ0KLQkJaWYoIGYuY3JlYXRlTmV3RmlsZSgpICkNCi0JCXsNCi0JCQlCdWZmZXJlZFdyaXRlciBvdXQgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShmKSkpOw0KLQkJCW91dC53cml0ZShzcmMpOw0KLQkJCW91dC5mbHVzaCgpOw0KLQkJCW91dC5jbG9zZSgpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZjsNCi0JfQ0KLQkNCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZVdvcmtzcGFjZVByb2plY3RzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCWZvcihJUHJvamVjdCBwcm9qZWN0IDogUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpKQ0KLQkJew0KLQkJCXRyeQ0KLQkJCXsNCi0JCQkJcHJvamVjdC5kZWxldGUoZmFsc2UsIG1vbml0b3IpOw0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkNCi0JCQl7DQotCQkJCShuZXcgTG9nZ2VyKCkpLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpKTsNCi0JCQl9DQotCQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGNyZWF0ZUVqYjNQcm9qZWN0KGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVByb2plY3QgZWpiUHJvamVjdCA9IGNyZWF0ZVByb2plY3RXaXRoRmFjZXQocHJvamVjdE5hbWUsIG5ldyBTdHJpbmdbXXsianN0LmphdmEiLCAianN0LmVqYiJ9LCBuZXcgU3RyaW5nW117IjUuMCIsICIzLjAifSk7DQotCQlmaW5hbCBJSmF2YVByb2plY3QgamF2YVAgPSBKYXZhQ29yZS5jcmVhdGUoZWpiUHJvamVjdCk7DQotCQkNCi0JCXJlbW92ZUFsbFNvdXJjZUZvbGRlcnMoamF2YVApOw0KLQ0KLQkJLy8gU2V0IGVqYk1vZHVsZSBmb2xkZXIgKGNyZWF0ZWQgZHVyaW5nIGpzdC5lamIgZmFjZXQgaW5zdGFsbGF0aW9uKSBhcyBzb3VyY2UgZm9sZGVyDQotCQlmaW5hbCBJRm9sZGVyIHNyY0ZvbGRlciA9IGVqYlByb2plY3QuZ2V0Rm9sZGVyKCJlamJNb2R1bGUiKTsNCi0JCWZpbmFsIElDbGFzc3BhdGhFbnRyeSBlamJNb2R1bGVDcEVudHJ5ID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkoc3JjRm9sZGVyLmdldEZ1bGxQYXRoKCkubWFrZUFic29sdXRlKCkpOw0KLQkJYWRkVG9DbGFzc3BhdGgoSmF2YUNvcmUuY3JlYXRlKGVqYlByb2plY3QpLCBlamJNb2R1bGVDcEVudHJ5KTsNCi0JCQ0KLQkJcmV0dXJuIGVqYlByb2plY3Q7DQotCX0NCi0JDQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWxsU291cmNlRm9sZGVycyhmaW5hbCBJSmF2YVByb2plY3QgamF2YVApIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IG5ld0NsYXNzcGF0aCA9IG5ldyBBcnJheUxpc3Q8SUNsYXNzcGF0aEVudHJ5PigpOw0KLQkJZm9yKElDbGFzc3BhdGhFbnRyeSBjcEVudHJ5IDogamF2YVAuZ2V0UmF3Q2xhc3NwYXRoKCkpDQotCQl7DQotCQkJaWYoY3BFbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkNCi0JCQl7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQluZXdDbGFzc3BhdGguYWRkKGNwRW50cnkpOw0KLQkJfQ0KLQkJamF2YVAuc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aC50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbbmV3Q2xhc3NwYXRoLnNpemUoKV0pLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgSVByb2plY3QgY3JlYXRlUHJvamVjdFdpdGhGYWNldChmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUsIGZpbmFsIFN0cmluZ1tdIGZhY2V0SWQsIGZpbmFsIFN0cmluZ1tdIGZhY2V0VmVyc2lvbikgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJYXNzZXJ0IGZhY2V0SWQubGVuZ3RoID09IGZhY2V0VmVyc2lvbi5sZW5ndGg7DQotCQlmaW5hbCBJUHJvamVjdFtdIHJlc3VsdCA9IG5ldyBJUHJvamVjdFsxXTsNCi0JCXRyeQ0KLQkJew0KLQkJCVRlc3RDb250ZXh0LnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCl7DQotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbg0KLQkJCQl7DQotCQkJCQl0cnkNCi0JCQkJCXsNCi0JCQkJCQlyZXN1bHRbMF0gPSBjcmVhdGVKYXZhUHJvamVjdChwcm9qZWN0TmFtZSk7DQotCQkJCQkJZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHJlc3VsdFswXSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7DQotCQ0KLQkJCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBmYWNldElkLmxlbmd0aDsgaSsrKQ0KLQkJCQkJCXsNCi0JCQkJCQkJZmluYWwgSVByb2plY3RGYWNldCBmYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChmYWNldElkW2ldKTsNCi0JCQkJCQkJZmFjZXRlZFByb2plY3QuaW5zdGFsbFByb2plY3RGYWNldChmYWNldC5nZXRWZXJzaW9uKGZhY2V0VmVyc2lvbltpXSksIG51bGwsIG1vbml0b3IpOw0KLQkJCQkJCX0NCi0JCQkJCQkNCi0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkNCi0JCQkJCXsNCi0JCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsNCi0JCQkJCX0NCi0JCQkJfX0sIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpKTsNCi0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlpZihlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKQ0KLQkJCXsNCi0JCQkJdGhyb3cgKENvcmVFeGNlcHRpb24pZS5nZXRDYXVzZSgpOw0KLQkJCX0NCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsNCi0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7DQotCQl9DQotCQkNCi0JCXJldHVybiByZXN1bHRbMF07DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBkeW5hbWljIHdlYiBtb2R1bGUgcHJvamVjdCB3aXRoICJqc3Qud2ViIiBmYWNldCB2ZXIuIDIuNSBpbnN0YWxsZWQNCi0JICogQHBhcmFtIHByb2plY3ROYW1lDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgY3JlYXRlV2ViMjVQcm9qZWN0KGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVByb2plY3Qgd2ViUHJvamVjdCA9IGNyZWF0ZVByb2plY3RXaXRoRmFjZXQocHJvamVjdE5hbWUsIG5ldyBTdHJpbmdbXXsianN0LmphdmEiLCAianN0LndlYiJ9LCBuZXcgU3RyaW5nW117IjUuMCIsICIyLjUifSk7DQotCQlmaW5hbCBJSmF2YVByb2plY3QgamF2YVAgPSBKYXZhQ29yZS5jcmVhdGUod2ViUHJvamVjdCk7DQotDQotCQlyZW1vdmVBbGxTb3VyY2VGb2xkZXJzKGphdmFQKTsNCi0NCi0JCXJldHVybiB3ZWJQcm9qZWN0Ow0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvdGhyZWFkaW5nL1Rlc3RDb250ZXh0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3RocmVhZGluZy9UZXN0Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3Zjc2ODg2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvdGhyZWFkaW5nL1Rlc3RDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnRocmVhZGluZzsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5Nb2RhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7DQotDQotLyoqDQotICogVXRpbGl0eSB0byBleGVjdXRlIHJ1bm5hYmxlIGluc3RhbmNlcyBpbiBhIHNlcGFyYXRlIHRocmVhZC4gSW1wbGVtZW50YXRpb24gaXMgcHJldHR5IHNpbWlsYXIgdG8ge0BsaW5rIE1vZGFsQ29udGV4dH0gYnV0IGl0IHVzZXMge0BsaW5rIFRlc3RDb250ZXh0VGhyZWFkfSB0byBwZXJmb3JtIGZvcmtpbmcNCi0gKiANCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBUZXN0Q29udGV4dA0KLXsNCi0JLyoqDQotCSAqIEV4ZWN1dGVzIHRoZSBvcGVyYXRpb24gc3BlY2lmaWVkIGluIHRoZSBjYWxsZXIgb3IgaW4gYSB7QGxpbmsgVGVzdENvbnRleHRUaHJlYWR9IHRocmVhZCBkZXBlbmRpbmcgb24gdGhlIDxjb2RlPmZvcms8L2NvZGU+IHZhbHVlLiBJbiBjYXNlIHRoZSBjYWxsZXIgb2YgdGhpcyBtZXRob2QgaXMgYSB7QGxpbmsgVGVzdENvbnRleHRUaHJlYWR9IGluc3RhbmNlLCB0aGUgZXhlY3V0aW9uIG9mIHRoZSA8Y29kZT5vcGVyYXRpb248L2NvZGU+IGlzIHBlcmZvcm1lZCBpbiB0aGUgY3VycmVudCB0aHJlYWQgbm8gbWF0dGVyDQotCSAqIG9mIHRoZSA8Y29kZT5mb3JrPC9jb2RlPiB2YWx1ZQ0KLQkgKiANCi0JICogQHBhcmFtIG9wZXJhdGlvbg0KLQkgKiAgICAgICAgICAgIHRoZSBvcGVyYXRpb247IG11c3Qgbm90IGJlIG51bGwNCi0JICogQHBhcmFtIGZvcmsNCi0JICogICAgICAgICAgICB0cnVlIHRvIHBlcmZvcm0gdGhlIDxjb2RlPm9wZXJhdGlvbjwvY29kZT4gaW4gYSB7QGxpbmsgVGVzdENvbnRleHRUaHJlYWR9OyBmYWxzZSB0byBwZXJmb3JtIHRoZSA8Y29kZT5vcGVyYXRpb248L2NvZGU+IGluIHRoZSBjdXJyZW50IHRocmVhZA0KLQkgKiBAcGFyYW0gbW9uaXRvcg0KLQkgKiAgICAgICAgICAgIHByb2dyZXNzIG1vbml0b3INCi0JICogQHBhcmFtIGRpc3BsYXkgVE9ETw0KLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24NCi0JICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bihmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uLCBmaW5hbCBib29sZWFuIGZvcmssIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgRGlzcGxheSBkaXNwbGF5KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24NCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKG9wZXJhdGlvbiwgIm9wZXJhdGlvbiIpOw0KLQ0KLQkJZmluYWwgYm9vbGVhbiB3aWxsRm9yayA9ICFpc0luVGVzdENvbnRleHRUaHJlYWQoKSAmJiBmb3JrOw0KLQkJaWYgKHdpbGxGb3JrKQ0KLQkJew0KLQkJCXJ1bkluVGVzdENvbnRleHRUaHJlYWQob3BlcmF0aW9uLCBtb25pdG9yLCBkaXNwbGF5KTsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCXJ1bkluQ3VycmVudFRocmVhZChvcGVyYXRpb24sIG1vbml0b3IpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBSdW5zIHRoZSBvcGVyYXRpb24gaW4gdGhlIGN1cnJlbnQgdGhyZWFkDQotCSAqIA0KLQkgKiBAcGFyYW0gb3BlcmF0aW9uDQotCSAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgaWYgYSB7QGxpbmsgVGhyb3dhYmxlfSBoYXMgYmVlbiB0aHJvd24gZHVyaW5nIG9wZXJhdGlvbiBleGVjdXRpb24uIFRoZSBleGNlcHRpb24gd3JhcHMgdGhhdCB7QGxpbmsgVGhyb3dhYmxlfQ0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBydW5JbkN1cnJlbnRUaHJlYWQoZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24NCi0Jew0KLQkJb3BlcmF0aW9uLnJ1bihtb25pdG9yKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUnVucyB0aGUgb3BlcmF0aW9uIGluIGEge0BsaW5rIFRlc3RDb250ZXh0VGhyZWFkfS4NCi0JICogDQotCSAqIEBwYXJhbSBydW5uYWJsZQ0KLQkgKiAgICAgICAgICAgIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgaWYgdGhlIHtAbGluayBUZXN0Q29udGV4dFRocmVhZH0gZmluaXNoZWQgd2l0aCBlcnJvcg0KLQkgKiBAc2VlIFRlc3RDb250ZXh0VGhyZWFkI2dldEVycm9yKCkNCi0JICovDQotCXByaXZhdGUgc3RhdGljIHZvaWQgcnVuSW5UZXN0Q29udGV4dFRocmVhZChmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgRGlzcGxheSBkaXNwbGF5KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBUZXN0Q29udGV4dFRocmVhZCBjb250ZXh0VGhyZWFkID0gbmV3IFRlc3RDb250ZXh0VGhyZWFkKHJ1bm5hYmxlLCBtb25pdG9yLCBkaXNwbGF5KTsNCi0JCWNvbnRleHRUaHJlYWQuc3RhcnQoKTsNCi0JCWNvbnRleHRUaHJlYWQuYmxvY2soKTsNCi0NCi0JCWlmIChjb250ZXh0VGhyZWFkLmdldEVycm9yKCkgIT0gbnVsbCkNCi0JCXsNCi0JCQlpZihjb250ZXh0VGhyZWFkLmdldEVycm9yKCkgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7DQotCQkJCXRocm93IChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKWNvbnRleHRUaHJlYWQuZ2V0RXJyb3IoKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGNvbnRleHRUaHJlYWQuZ2V0RXJyb3IoKSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCB0aHJlYWQgaXMgaW5zdGFuY2Ugb2Yge0BsaW5rIFRlc3RDb250ZXh0VGhyZWFkfQ0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luVGVzdENvbnRleHRUaHJlYWQoKQ0KLQl7DQotCQlmaW5hbCBUaHJlYWQgdCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7DQotCQlyZXR1cm4gdCBpbnN0YW5jZW9mIFRlc3RDb250ZXh0VGhyZWFkOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvdGhyZWFkaW5nL1Rlc3RDb250ZXh0VGhyZWFkLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3RocmVhZGluZy9UZXN0Q29udGV4dFRocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDFiYjkxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvdGhyZWFkaW5nL1Rlc3RDb250ZXh0VGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnRocmVhZGluZzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsNCi0NCi0vKioNCi0gKiB7QGxpbmsgVGhyZWFkfSBleHRlbmRlciB3aGljaCBpcyBjYXBhYmxlIG9mIHByb3ZpZGluZyBldmVudCBsb29wIHByb2Nlc3Npbmcgd2hpbGUgdGhlIHJ1bm5hYmxlIGlzIGV4ZWN1dGVkPGJyPg0KLSAqIEEgdHlwaWNhbCB1c2FnZSBvZiB0aGlzIGNsYXNzIHNob3VsZCBiZToNCi0gKiANCi0gKiA8cHJlPg0KLSAqIFRlc3RDb250ZXh0VGhyZWFkIHQgPSBuZXcgVGVzdENvbnRleHRUaHJlYWQoc29tZVJ1bm5hYmxlKCkpOw0KLSAqIHQuc3RhcnQoKTsNCi0gKiB0LmJsb2NrKCk7DQotICogPC9wcmU+DQotICogDQotICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgdGhyZWFkIHJlc2VtYmxlcyB0byB0aGUgTW9kYWxDb250ZXh0VGhyZWFkIHdpdGggdGhlIGRpZmZlcmVuY2UgdGhhdCBpdCBkb2VzIG5vdCBjYWxsIHtAbGluayBEaXNwbGF5I3NsZWVwKCl9IGFuZCBpcyBzaW1wbGlmaWVkIGluIG9yZGVyIHRvIG1lZXQgdGVzdCByZXF1aXJlbWVudHMuIFRoZSByZWFzb24gbm90IHRvIGNhbGwge0BsaW5rIERpc3BsYXkjc2xlZXAoKX0gaXMgdGhhdCB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMgcHV0dGluZyB0aGUgZGlzcGxheSB0bw0KLSAqIHNsZWVwIGNhdXNlcyBqdW5pdCB0ZXN0cyB0byB3YWl0IGZvcmV2ZXINCi0gKiANCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqLw0KLWNsYXNzIFRlc3RDb250ZXh0VGhyZWFkIGV4dGVuZHMgVGhyZWFkDQotew0KLQlwcml2YXRlIGJvb2xlYW4gaXNSdW5uaW5nOw0KLQlwcml2YXRlIFRocm93YWJsZSBlcnJvclRocm93YWJsZTsNCi0JcHJpdmF0ZSBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7DQotCXByaXZhdGUgZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlOw0KLQlwcml2YXRlIGZpbmFsIERpc3BsYXkgZGlzcGxheTsNCi0NCi0JVGVzdENvbnRleHRUaHJlYWQoZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIERpc3BsYXkgZGlzcGxheSkNCi0Jew0KLQkJc3VwZXIoKTsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShydW5uYWJsZSwgInJ1bm5hYmxlIik7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0obW9uaXRvciwgIm1vbml0b3IiKTsNCi0JCQ0KLQkJaXNSdW5uaW5nID0gdHJ1ZTsNCi0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7DQotCQl0aGlzLnJ1bm5hYmxlID0gcnVubmFibGU7DQotCQl0aGlzLnNldE5hbWUoIlRlc3RDb250ZXh0Iik7DQotCQl0aGlzLnNldERhZW1vbih0cnVlKTsNCi0JCXRoaXMuZGlzcGxheSA9IGRpc3BsYXk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlcyB0aGUgZXJyb3IgdGhyb3dhYmxlIHdoaWNoIGhhcHBlbmVkIGR1cmluZyBleGVjdXRpb24NCi0JICogDQotCSAqIEByZXR1cm4gdGhlIGVycm9yIHRocm93YWJsZSBvciBudWxsIGlmIG5vbmUNCi0JICovDQotCXB1YmxpYyBUaHJvd2FibGUgZ2V0RXJyb3IoKQ0KLQl7DQotCQlyZXR1cm4gZXJyb3JUaHJvd2FibGU7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHJ1bigpDQotCXsNCi0JCWlzUnVubmluZyA9IHRydWU7DQotCQl0cnkNCi0JCXsNCi0JCQlydW5uYWJsZS5ydW4obW9uaXRvcik7DQotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkNCi0JCXsNCi0JCQllcnJvclRocm93YWJsZSA9IHQ7DQotCQl9IGZpbmFsbHkNCi0JCXsNCi0JCQkvLyBNYWtlIHN1cmUgdGhhdCBhc3luY2hyb25vdXMgZXZlbnRzIGFyZSBwcm9jZXNzZWQgYnkgdGhlIGV2ZW50IGxvb3AgdmlhIHN5bmMgZXhlY3V0aW9uIG9mIGFuICJlbXB0eSIgcnVubmFibGUNCi0JCQlkaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkNCi0JCQl7DQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpDQotCQkJCXsNCi0JCQkJfQ0KLQkJCX0pOw0KLQkJCWlzUnVubmluZyA9IGZhbHNlOw0KLQ0KLQkJCS8vIEZvcmNlIHRoZSBkaXNwbGF5IHRvIHdha2UgdXANCi0JCQlkaXNwbGF5KCkuYXN5bmNFeGVjKG51bGwpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBCbG9ja3MgdGhlIGNhbGxlciB3aGlsZSB0aGUge0BsaW5rIFJ1bm5hYmxlfSBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGlzIGJlaW5nIGV4ZWN1dGVkLjxicj4NCi0JICogSWYgdGhlIGNhbGxlciBpcyB0aGUgVUkgdGhyZWFkLCB7QGxpbmsgRGlzcGxheSNyZWFkQW5kRGlzcGF0Y2goKX0gaXMgaW52b2tlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgZXZlbnQgbG9vcCBpcyBwcm9jZXNzZWQ8YnI+DQotCSAqIElmIHRoZSBjYWxsZXIgaXMgbm90IGEgVUkgdGhyZWFkLCB0aGlzIG1ldGhvZCBzaW1wbHkgam9pbnMuIDxicj4NCi0JICogDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIGluIGNhc2UgdGhlIG1ldGhvZCBpcyBpbnZva2VkIHdpdGhpbiBpdHMgb3duIHRocmVhZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgYmxvY2soKQ0KLQl7DQotCQlpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSB0aGlzKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSBpbnNpZGUgdGhlIHNhbWUgdGhyZWFkIik7DQotCQl9DQotDQotCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkNCi0JCXsNCi0JCQl0cnkNCi0JCQl7DQotCQkJCWpvaW4oKTsNCi0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkNCi0JCQl7DQotCQkJCWVycm9yVGhyb3dhYmxlID0gZTsNCi0JCQl9DQotCQl9IGVsc2UNCi0JCXsNCi0JCQl3aGlsZSAoaXNSdW5uaW5nKQ0KLQkJCXsNCi0JCQkJaWYoIWRpc3BsYXkoKS5yZWFkQW5kRGlzcGF0Y2goKSkNCi0JCQkJew0KLQkJCQkJdHJ5DQotCQkJCQl7DQotCQkJCQkJVGhyZWFkLnNsZWVwKDUwKTsNCi0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpDQotCQkJCQl7DQotCQkJCQkJLy8gaWdub3JlDQotCQkJCQkJKG5ldyBMb2dnZXIoKSkubG9nRGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIERpc3BsYXkgZGlzcGxheSgpDQotCXsNCi0JCXJldHVybiBkaXNwbGF5Ow0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMWE0MzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGZiMDMwOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlMDQ4NGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI01vbiBKdWwgMjAgMTU6MjU6MzEgRUVTVCAyMDA5DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVkOTI5ZGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMA0KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjANCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMNCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4NCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyDQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41DQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsDQotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMsDQotIG9yZy5qbW9jaywNCi0gb3JnLmp1bml0DQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5jbGF6eg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjdhY2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXVndXN0IDIwLCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2M4OGVmZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNGM2MDBiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1CdW5kbGUtTmFtZS4wPVV0aWxzIFRlc3RzIChJbmN1YmF0aW9uKQ0KLUJ1bmRsZS1WZW5kb3IuMD1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9TdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMmJmZDljLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9TdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXM7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotLyoqDQotICogVGVzdCBjYXNlIGZvciBTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIgY2xhc3MNCi0gKiANCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UNCi17DQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGlvbigpDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCW5ldyBTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIobnVsbCk7DQotCQkJZmFpbCgiTlBFIGV4cGVjdGVkIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCS8vIGV4cGVjdGVkDQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0NCi0JCVN0cmluZ0lucHV0U3RyZWFtQWRhcHRlciBhZGFwdGVyID0gbmV3IFN0cmluZ0lucHV0U3RyZWFtQWRhcHRlcigiQUJDIik7DQotCQlhc3NlcnROb3ROdWxsKGFkYXB0ZXIpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RSZWFkKCkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyIGFkYXB0ZXIgPSBuZXcgU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyKCJBQkMiKTsNCi0JCQlhc3NlcnRUcnVlKGFkYXB0ZXIucmVhZCgpID4gMCk7DQotDQotCQkJYWRhcHRlciA9IG5ldyBTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIoIiIpOw0KLQkJCWFzc2VydFRydWUoYWRhcHRlci5yZWFkKCkgPT0gLTEpOw0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9BbGxUZXN0c1N1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9BbGxUZXN0c1N1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY4YzFiZmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvQWxsVGVzdHNTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLlN0cmluZ0lucHV0U3RyZWFtQWRhcHRlclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5GaWxlVXRpbHNVbml0VGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLkpheFdzVXRpbHNUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3RvcnlUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkluc3BlY3RvckltcGxUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zLkFubm90YXRpb25VdGlsc1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uc0Jhc2VJbXBsVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zLkFycmF5VmFsdWVJbXBsVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zLkJvb2xlYW5WYWx1ZUltcGxUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuQ2xhc3NWYWx1ZUltcGxUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuSW50ZWdlclZhbHVlSW1wbFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5QYXJhbVZhbHVlUGFpckltcGxUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuUXVhbGlmaWVkTmFtZVZhbHVlSW1wbFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5TdHJpbmdWYWx1ZUltcGxUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuY2xhenouQVNUVXRpbHNUZXN0Ow0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBBbGxUZXN0c1N1aXRlDQotew0KLQkvKioNCi0JICogUmV0dXJucyBhIHRlc3Qgc3VpdGUgY29udGFpbmluZyB0aGUgdGVzdHMgdG8gYmUgcnVuIGJ5IEphdmEgRGV2ZWxvcGVyIFRlc3QgRGlzcGF0Y2hlcg0KLQkgKiANCi0JICogQHJldHVybiAtIGEgc3VpdGUgb2YganVuaXQgcGRlIHRlc3QNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotCXsNCi0JCWZpbmFsIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsNCi0NCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBbm5vdGF0aW9uRmFjdG9yeVRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFycmF5VmFsdWVJbXBsVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQW5ub3RhdGlvbnNCYXNlSW1wbFRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFubm90YXRpb25JbnNwZWN0b3JJbXBsVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQW5ub3RhdGlvblV0aWxzVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQm9vbGVhblZhbHVlSW1wbFRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEludGVnZXJWYWx1ZUltcGxUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQYXJhbVZhbHVlUGFpckltcGxUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShRdWFsaWZpZWROYW1lVmFsdWVJbXBsVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RyaW5nVmFsdWVJbXBsVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xhc3NWYWx1ZUltcGxUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXJUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBU1RVdGlsc1Rlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEZpbGVVdGlsc1VuaXRUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXhXc1V0aWxzVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyVGVzdC5jbGFzcyk7DQotCQkNCi0JCXJldHVybiBzdWl0ZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9GaWxlVXRpbHNVbml0VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvRmlsZVV0aWxzVW5pdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWQ0YTkxNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9GaWxlVXRpbHNVbml0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5TdGF0dXNVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5GaWxlVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuSUZpbGVVdGlsczsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuY29uc3RyYWludC5Jc0VxdWFsOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5jb25zdHJhaW50LklzU2FtZTsNCi0NCi1wdWJsaWMgY2xhc3MgRmlsZVV0aWxzVW5pdFRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UNCi17DQotCXByaXZhdGUgZmluYWwgSUZpbGVVdGlscyBmaWxlVXRpbHMgPSBGaWxlVXRpbHMuZ2V0SW5zdGFuY2UoKTsNCi0JcHJpdmF0ZSBNb2NrPElDb21waWxhdGlvblVuaXQ+IGN1TW9jazsNCi0JcHJpdmF0ZSBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOw0KLQkNCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQljdU1vY2sgPSBtb2NrKElDb21waWxhdGlvblVuaXQuY2xhc3MpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29tcGlsYXRpb25Vbml0Q29udGVudERlYWxzQ29ycmVjdGx5V2l0aFdvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBTdHJpbmcgdGVzdENvbnRlbnQgPSAiTXlUZXN0Q29udGVudCI7DQotCQlmaW5hbCBNb2NrPElCdWZmZXI+IGJ1ZmZlck1vY2sgPSBtb2NrKElCdWZmZXIuY2xhc3MpOw0KLQkJYnVmZmVyTW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJzZXRDb250ZW50cyIpLndpdGgobmV3IElzU2FtZSh0ZXN0Q29udGVudCkpOw0KLQkJDQotCQljdU1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiYmVjb21lV29ya2luZ0NvcHkiKTsNCi0JCWN1TW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJnZXRCdWZmZXIiKS53aWxsKHJldHVyblZhbHVlKGJ1ZmZlck1vY2sucHJveHkoKSkpOw0KLQkJY3VNb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImNvbW1pdFdvcmtpbmdDb3B5Iikud2l0aChuZXcgSXNFcXVhbCh0cnVlKSwgbmV3IElzU2FtZShtb25pdG9yKSk7DQotCQljdU1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZGlzY2FyZFdvcmtpbmdDb3B5Iik7DQotDQotCQlmaWxlVXRpbHMuc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudChjdU1vY2sucHJveHkoKSwgdGVzdENvbnRlbnQsIHRydWUsIG1vbml0b3IpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29tcGlsYXRpb25Vbml0Q29udGVudERvZXNOb3REaXNjYXJkV29ya2luZ0NvcHlPbkpNRSgpDQotCXsNCi0JCWZpbmFsIEphdmFNb2RlbEV4Y2VwdGlvbiB0ZXN0RXhjZXB0aW9uID0gbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgQ29yZUV4Y2VwdGlvbihTdGF0dXNVdGlscy5zdGF0dXNFcnJvcigiVEVTVCIpKSk7DQotCQljdU1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiYmVjb21lV29ya2luZ0NvcHkiKS53aWxsKHRocm93RXhjZXB0aW9uKHRlc3RFeGNlcHRpb24pKTsNCi0JCWN1TW9jay5leHBlY3RzKG5ldmVyKCkpLm1ldGhvZCgiZGlzY2FyZFdvcmtpbmdDb3B5Iik7DQotCQljdU1vY2suZXhwZWN0cyhuZXZlcigpKS5tZXRob2QoImNvbW1pdFdvcmtpbmdDb3B5Iik7DQotCQkNCi0JCXRyeQ0KLQkJew0KLQkJCWZpbGVVdGlscy5zZXRDb21waWxhdGlvblVuaXRDb250ZW50KGN1TW9jay5wcm94eSgpLCAiMTIzIiwgdHJ1ZSwgbW9uaXRvcik7DQotCQl9DQotCQljYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKCJUZXN0IGV4Y2VwdGlvbiB3YXMgbm90IGNhdWdodCIsIGUgPT0gdGVzdEV4Y2VwdGlvbik7DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDdUNvbnRlbnRTYXZlc0RpcnR5RWRpdG9ycygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgYm9vbGVhbltdIHNhdmVFZGl0b3JJbnZva2VkID0gbmV3IGJvb2xlYW5bXXtmYWxzZX07DQotCQlmaW5hbCBib29sZWFuW10gc2V0Q29udGVudHNJbnZva2VkID0gbmV3IGJvb2xlYW5bXXtmYWxzZX07DQotCQkNCi0JCWZpbmFsIElGaWxlVXRpbHMgbXlGaWxlVXRpbHMgPSBuZXcgRmlsZVV0aWxzKCl7DQotCQkJcHVibGljIGJvb2xlYW4gaXNDb21waWxhdGlvblVuaXREaXNwbGF5ZWRJbkRpcnR5RWRpdG9yKGZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIGNvbXBpbGF0aW9uIHVuaXQiLCBjdSA9PSBjdU1vY2sucHJveHkoKSk7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgdm9pZCBzYXZlRWRpdG9yKGZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKCJTYXZlIGVkaXRvcnMgaW52b2tlZCBiZWZvcmUgc2V0IENVIGNvbnRlbnQiLCBzZXRDb250ZW50c0ludm9rZWRbMF0pOw0KLQkJCQlhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIGNvbXBpbGF0aW9uIHVuaXQiLCBjdSA9PSBjdU1vY2sucHJveHkoKSk7DQotCQkJCXNhdmVFZGl0b3JJbnZva2VkWzBdID0gdHJ1ZTsNCi0JCQl9DQotCQkJDQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIHZvaWQgc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudChJQ29tcGlsYXRpb25Vbml0IHVuaXQsIFN0cmluZyBjb250ZW50LCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQkJCQkJCQkJCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCQkJew0KLQkJCQlhc3NlcnRGYWxzZSgiU2V0IENVIGNvbnRlbnQgaW52b2tlZCBhZnRlciBlZGl0b3Igc2F2ZWQiLCBzYXZlRWRpdG9ySW52b2tlZFswXSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBDVSBjb250ZW50IiwgIk15Q29udGVudCIsIGNvbnRlbnQpOw0KLQkJCQlzZXRDb250ZW50c0ludm9rZWRbMF0gPSB0cnVlOw0KLQkJCX0NCi0JCX07DQotCQkNCi0JCW15RmlsZVV0aWxzLnNldENvbXBpbGF0aW9uVW5pdENvbnRlbnRBbmRTYXZlRGlydHlFZGl0b3JzKGN1TW9jay5wcm94eSgpLCAiTXlDb250ZW50IiwgdHJ1ZSwgbnVsbCk7DQotCQlhc3NlcnRUcnVlKCJTZXQgY29udGVudHMgbm90IGludm9rZWQiLCBzZXRDb250ZW50c0ludm9rZWRbMF0pOw0KLQkJYXNzZXJ0VHJ1ZSgiU2F2ZSBlZGl0b3JzIG5vdCBpbnZva2VkIiwgc2F2ZUVkaXRvckludm9rZWRbMF0pOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q3VDb250ZW50RG9lc05vdFNhdmVzQ2xlYW5FZGl0b3JzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBib29sZWFuW10gaXNEaXNwbGF5ZWRJbnZva2VkID0gbmV3IGJvb2xlYW5bXXtmYWxzZX07DQotCQlmaW5hbCBib29sZWFuW10gc2V0Q29udGVudHNJbnZva2VkID0gbmV3IGJvb2xlYW5bXXtmYWxzZX07DQotCQkNCi0JCWZpbmFsIElGaWxlVXRpbHMgbXlGaWxlVXRpbHMgPSBuZXcgRmlsZVV0aWxzKCl7DQotCQkJcHVibGljIGJvb2xlYW4gaXNDb21waWxhdGlvblVuaXREaXNwbGF5ZWRJbkRpcnR5RWRpdG9yKGZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIGNvbXBpbGF0aW9uIHVuaXQiLCBjdSA9PSBjdU1vY2sucHJveHkoKSk7DQotCQkJCWlzRGlzcGxheWVkSW52b2tlZFswXSA9IHRydWU7DQotCQkJCXJldHVybiBmYWxzZTsNCi0JCQl9DQotCQkJDQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIHZvaWQgc2F2ZUVkaXRvcihmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1KQ0KLQkJCXsNCi0JCQkJZmFpbCgiVW5leHBlY3RlZCBpbnZvY2F0aW9uIik7DQotCQkJfQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyB2b2lkIHNldENvbXBpbGF0aW9uVW5pdENvbnRlbnQoSUNvbXBpbGF0aW9uVW5pdCB1bml0LCBTdHJpbmcgY29udGVudCwgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQkJCQkJCQkJCQkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkJCXsNCi0JCQkJYXNzZXJ0RmFsc2UoIlNldCBDVSBjb250ZW50IGludm9rZWQgYWZ0ZXIgZWRpdG9yIHNhdmVkIiwgaXNEaXNwbGF5ZWRJbnZva2VkWzBdKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIENVIGNvbnRlbnQiLCAiTXlDb250ZW50IiwgY29udGVudCk7DQotCQkJCXNldENvbnRlbnRzSW52b2tlZFswXSA9IHRydWU7DQotCQkJfQ0KLQkJfTsNCi0JCQ0KLQkJbXlGaWxlVXRpbHMuc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudEFuZFNhdmVEaXJ0eUVkaXRvcnMoY3VNb2NrLnByb3h5KCksICJNeUNvbnRlbnQiLCB0cnVlLCBudWxsKTsNCi0JCWFzc2VydFRydWUoIlNldCBjb250ZW50cyBub3QgaW52b2tlZCIsIHNldENvbnRlbnRzSW52b2tlZFswXSk7DQotCQlhc3NlcnRUcnVlKCJJcyBkaXNwbGF5ZWQgaW4gZGlydHkgZWRpdG9yIG5vdCBpbnZva2VkIiwgaXNEaXNwbGF5ZWRJbnZva2VkWzBdKTsNCi0JfQ0KLQkNCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvSmF4V3NVdGlsc1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL0pheFdzVXRpbHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAxMGY0YjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvSmF4V3NVdGlsc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkpheFdzVXRpbHM7DQotDQotcHVibGljIGNsYXNzIEpheFdzVXRpbHNUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRSA9ICJUZXN0QmVhbiI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19GUV9OQU1FID0gIm9yZy5lY2xpcHNlLnRlc3QuIiArIENMQVNTX05BTUU7DQotCQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZV9XaXRoTnVsbCgpDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCUpheFdzVXRpbHMuY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKG51bGwpOw0KLQkJCWZhaWwoIk5QRSBleHBlY3RlZCIpOw0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJLy8gZXhwZWN0ZWQNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2UoKQ0KLQl7DQotCQlTdHJpbmcgbnMgPSBKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSgiIik7DQotCQlhc3NlcnRUcnVlKG5zLmVxdWFscygiaHR0cDovLy8iKSk7DQotCQlucyA9IEpheFdzVXRpbHMuY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKCJhIik7DQotCQlhc3NlcnRUcnVlKG5zLmVxdWFscygiaHR0cDovL2EvIikpOw0KLQkJbnMgPSBKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSgiYS5iLmMiKTsNCi0JCWFzc2VydFRydWUobnMuZXF1YWxzKCJodHRwOi8vYi5hL2MvIikpOw0KLQkJbnMgPSBKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSgiYS5iLmMuZCIpOw0KLQkJYXNzZXJ0VHJ1ZShucy5lcXVhbHMoImh0dHA6Ly9iLmEvYy9kLyIpKTsNCi0JCW5zID0gSmF4V3NVdGlscy5jb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2UoImEuYi5jLmQuZSIpOw0KLQkJYXNzZXJ0VHJ1ZShucy5lcXVhbHMoImh0dHA6Ly9iLmEvYy9kL2UvIikpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFNlcnZpY2VOYW1lKCkNCi0Jew0KLQkJdHJ5IHsNCi0JCQlKYXhXc1V0aWxzLmdldERlZmF1bHRTZXJ2aWNlTmFtZShudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBfKXt9DQotCQkNCi0JCWFzc2VydEVxdWFscyhDTEFTU19OQU1FICsgIlNlcnZpY2UiLCAgSmF4V3NVdGlscy5nZXREZWZhdWx0U2VydmljZU5hbWUoQ0xBU1NfRlFfTkFNRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFBvcnR0eXBlTmFtZSgpDQotCXsNCi0JCXRyeSB7DQotCQkJSmF4V3NVdGlscy5nZXREZWZhdWx0UG9ydHR5cGVOYW1lKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIF8pe30NCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKENMQVNTX05BTUUsICBKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0dHlwZU5hbWUoQ0xBU1NfRlFfTkFNRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFBvcnROYW1lKCkNCi0Jew0KLQkJdHJ5IHsNCi0JCQlKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0TmFtZShudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBfKXt9DQotCQkNCi0JCWFzc2VydEVxdWFscyhDTEFTU19OQU1FICsgIlBvcnQiLCAgSmF4V3NVdGlscy5nZXREZWZhdWx0UG9ydE5hbWUoQ0xBU1NfRlFfTkFNRSkpOw0KLQl9DQotCQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25GYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZDBjYjk1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25GYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi0NCi0vKioNCi0gKiBBbm5vdGF0aW9uRmFjdG9yeSBjbGFzcyB0ZXN0IGNhc2VzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikNCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkZhY3RvcnlUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLmRlbW8iOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlU3RyaW5nVmFsdWUoKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZShudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJSVZhbHVlIHN0clZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlIik7DQotCQlhc3NlcnROb3ROdWxsKHN0clZhbHVlKTsNCi0JCWFzc2VydFRydWUoc3RyVmFsdWUudG9TdHJpbmcoKS5lcXVhbHMoInZhbHVlIikpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVQYXJhbVZhbHVlUGFpcigpDQotCXsNCi0JCUlWYWx1ZSBzdHJWYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJ2YWx1ZSIpOw0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZShudWxsLCBzdHJWYWx1ZSk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoIiIsIG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCQlmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIA0KLQkJew0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0JCQ0KLQkJSVBhcmFtVmFsdWVQYWlyIHZhbHVlUGFpciA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgc3RyVmFsdWUpOw0KLQkJYXNzZXJ0Tm90TnVsbCh2YWx1ZVBhaXIpOw0KLQkJYXNzZXJ0VHJ1ZSh2YWx1ZVBhaXIuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIElWYWx1ZSk7DQotCQlhc3NlcnRUcnVlKHZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygicGFyYW0iKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUNvbXBsZXhBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiANCi0Jew0KLQkJSVZhbHVlIHN0clZhbHVlMSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJ2YWx1ZSIpOw0KLQkJSVBhcmFtVmFsdWVQYWlyIHZhbHVlUGFpcjEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHN0clZhbHVlMSk7DQotDQotCQlJVmFsdWUgc3RyVmFsdWUyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlMSIpOw0KLQkJSVBhcmFtVmFsdWVQYWlyIHZhbHVlUGFpcjIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbTEiLCBzdHJWYWx1ZTIpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwYXJhbVZhbHVlcy5hZGQodmFsdWVQYWlyMSk7DQotCQlwYXJhbVZhbHVlcy5hZGQodmFsdWVQYWlyMik7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKG51bGwsIHBhcmFtVmFsdWVzLCBlbmRwb2ludCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIiIsIG51bGwsIGVuZHBvaW50KTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQkJDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJNeU5hbWUiLCBudWxsLCBlbmRwb2ludCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotLy8JCXRyeQ0KLS8vCQl7DQotLy8JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJNeU5hbWUiLCBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCkpOw0KLS8vCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0vLwkJfQ0KLS8vCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpDQotLy8JCXsNCi0vLwkJfQ0KLQ0KLQkJDQotCQlwcmVwYXJlUHJvamVjdCgpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IGNhID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigibmFtZSIsIHBhcmFtVmFsdWVzLCBlbmRwb2ludCk7DQotCQlhc3NlcnROb3ROdWxsKGNhKTsNCi0JCWFzc2VydEVxdWFscyhjYS5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCksIDIpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVWYWx1ZVBhaXIoKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCIiLCBudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZShudWxsLCBudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBcnJheVZhbHVlKCkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQXJyYXlWYWx1ZShudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQXJyYXlWYWx1ZShuZXcgSGFzaFNldDxJVmFsdWU+KCkpOw0KLQkJCWZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCUlWYWx1ZSBzdHJWYWx1ZTEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUxIik7DQotCQlJVmFsdWUgc3RyVmFsdWUyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlMiIpOw0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJdmFsdWVzLmFkZChzdHJWYWx1ZTEpOw0KLQkJdmFsdWVzLmFkZChzdHJWYWx1ZTIpOw0KLQkJDQotCQkNCi0JCUlWYWx1ZSBhcnJWYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFycmF5VmFsdWUodmFsdWVzKTsNCi0JCWFzc2VydE5vdE51bGwoYXJyVmFsdWUpOw0KLQkJYXNzZXJ0VHJ1ZShhcnJWYWx1ZS50b1N0cmluZygpLmVxdWFscygiW3ZhbHVlMSwgdmFsdWUyXSIpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCkNCi0Jew0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJRTmFtZSIpOw0KLQkJCWZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9DQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotCQkNCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZShudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJSVZhbHVlIHFOYW1lID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJvcmcuZWNsaXBzZS5kZW1vLlRlc3QiKTsNCi0JCWFzc2VydE5vdE51bGwocU5hbWUpOw0KLQkJYXNzZXJ0VHJ1ZShxTmFtZS50b1N0cmluZygpLmVxdWFscygib3JnLmVjbGlwc2UuZGVtby5UZXN0IikpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVCb29sZWFuVmFsdWUoKQ0KLQl7DQotCQlJVmFsdWUgYm9vbFZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQm9vbGVhblZhbHVlKHRydWUpOw0KLQkJYXNzZXJ0Tm90TnVsbChib29sVmFsdWUpOw0KLQkJYXNzZXJ0RXF1YWxzKGJvb2xWYWx1ZS50b1N0cmluZygpLCAidHJ1ZSIpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uc0Zyb21DbGFzcygpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0Jew0KLQkJcHJlcGFyZVByb2plY3QoKTsNCi0NCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDIpOw0KLQl9DQotDQotLy8JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25zRnJvbUZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLS8vCXsNCi0vLwkJcHJlcGFyZVByb2plY3QoKTsNCi0vLw0KLS8vCQlJRmllbGQgZmllbGQgPSBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIik7DQotLy8JCWFzc2VydE5vdE51bGwoZmllbGQpOw0KLS8vDQotLy8JCUlBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0dGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpIGdldEFubm90YXRpb25zRnJvbUZpZWxkKGZpZWxkKTsNCi0vLwkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7DQotLy8JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMubGVuZ3RoID09IDEpOw0KLS8vCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25zRnJvbU1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0Jew0KLQkJcHJlcGFyZVByb2plY3QoKTsNCi0NCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7Ow0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbnNJVHlwZSgpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0Jew0KLQkJcHJlcGFyZVByb2plY3QoKTsNCi0JCQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQobnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChlbmRwb2ludC5nZXRQYWNrYWdlRnJhZ21lbnQoKSk7DQotCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0NCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0JCQ0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZW5kcG9pbnQpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuIGluc3BlY3RUeXBlKCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAwKTsNCi0NCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBhbm5vdGF0aW9uc01ldGhvZCA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDApOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uc0lUeXBlU2V0T2ZTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkDQotCXsNCi0JCXByZXBhcmVQcm9qZWN0KCk7DQotDQotCQlTZXQ8U3RyaW5nPiB0b1JlbW92ZSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsNCi0JCXRvUmVtb3ZlLmFkZCgiV2ViU2VydmljZSIpOw0KLQkJdG9SZW1vdmUuYWRkKCJXZWJNZXRob2QiKTsNCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zKG51bGwsIHRvUmVtb3ZlKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zKGVuZHBvaW50LmdldFBhY2thZ2VGcmFnbWVudCgpLCB0b1JlbW92ZSk7DQotCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0NCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCQ0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnMoZW5kcG9pbnQsIHRvUmVtb3ZlKTsNCi0NCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0NCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gYW5ub3RhdGlvbnNNZXRob2QgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zTWV0aG9kLnNpemUoKSA9PSAwKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbnNJRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkDQotCXsNCi0JCXByZXBhcmVQcm9qZWN0KCk7DQotDQotCQlJRmllbGQgZmllbGQgPSBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIik7DQotCQlhc3NlcnROb3ROdWxsKGZpZWxkKTsNCi0NCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGZpZWxkKTsNCi0NCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAyKTsNCi0NCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gYW5ub3RhdGlvbnNNZXRob2QgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zTWV0aG9kLnNpemUoKSA9PSAxKTsNCi0NCi0vLwkJYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5nZXRBbm5vdGF0aW9uc0Zyb21GaWVsZChmaWVsZCk7DQotLy8JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOw0KLS8vCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLmxlbmd0aCA9PSAwKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbnNJTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQlwcmVwYXJlUHJvamVjdCgpOw0KLQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoImFubm90YXRlZE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7DQotCQllbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIik7DQotDQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChtZXRob2QpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDIpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gYW5ub3RhdGlvbnNNZXRob2QgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zTWV0aG9kLnNpemUoKT09IDApOw0KLQ0KLS8vCQlhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmdldEFubm90YXRpb25zRnJvbUZpZWxkKGZpZWxkKTsNCi0vLwkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7DQotLy8JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMubGVuZ3RoID09IDApOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBwcmVwYXJlUHJvamVjdCgpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnQuc3JjIiwgIkVuZHBvaW50Iik7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkluc3BlY3RvckltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uSW5zcGVjdG9ySW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTA4NDViOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uSW5zcGVjdG9ySW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uV3JpdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotcHVibGljIGNsYXNzIEFubm90YXRpb25JbnNwZWN0b3JJbXBsVGVzdCBleHRlbmRzIENsYXNzTG9hZGluZ1Rlc3QNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUkMgPSAic3JjIjsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDSyA9ICJvcmcuZWNsaXBzZS5kZW1vIjsNCi0NCi0JcHJpdmF0ZSBJVHlwZSBlbmRwb2ludDsNCi0NCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnQuc3JjIiwgIkVuZHBvaW50Iik7DQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChlbmRwb2ludCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0VXBTcGVjaWZpYygpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludEFubkluc3BlY3Rvci5zcmMiLCAiRW5kcG9pbnRBbm5JbnNwZWN0b3IiKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zcGVjdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcCgpOw0KLQkJDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKG51bGwpLmluc3BlY3RUeXBlKCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biEiKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSANCi0JCXsNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duISIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIA0KLQkJew0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0RmllbGQobnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biEiKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSANCi0JCXsNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFBhcmFtKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24hIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0JCQ0KLQkJSVZhbHVlIHN2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoIk15IFZhbHVlIik7DQotDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHN2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElGaWVsZD4gYW5uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24iLCBwdiwgZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm4sIGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKSk7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElGaWVsZD4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdEZpZWxkKGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKSk7DQotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJSUFubm90YXRpb248SUZpZWxkPiBhbm5QID0gYW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkucmVtb3ZlKGFublApOw0KLQkJDQotCQlhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RGaWVsZChlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIikpOw0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAwKTsNCi0JCQ0KLQ0KLQkJSU1ldGhvZFtdIG1ldGhvZHMgPSBlbmRwb2ludC5nZXRNZXRob2RzKCk7DQotCQlmb3IgKElNZXRob2QgbWV0aG9kIDogbWV0aG9kcykNCi0JCXsNCi0JCQlpZihtZXRob2QuZ2V0UmF3UGFyYW1ldGVyTmFtZXMoKSAhPSBudWxsICYmIG1ldGhvZC5nZXRSYXdQYXJhbWV0ZXJOYW1lcygpLmxlbmd0aCA+IDApDQotCQkJew0KLQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgbWV0aG9kLmdldFJhd1BhcmFtZXRlck5hbWVzKCkubGVuZ3RoOyBpKyspDQotCQkJCXsNCi0JCQkJCUlUeXBlUGFyYW1ldGVyIHBhcmFtID0gbWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIobWV0aG9kLmdldFJhd1BhcmFtZXRlck5hbWVzKClbaV0pOw0KLQ0KLQkJCQkJSVZhbHVlIHN2UGFyYW0gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgiU3RyaW5nIFZhbHUgUGFyYW0iKTsNCi0JCQkJCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2UGFyYW0gPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQkJCQlwdlBhcmFtLmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJQYXJhbUF0cmlidXRlIiwgc3ZQYXJhbSkpOw0KLQkJCQkJSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGFublBhbSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIlBhcmFtQW5ub3RhdGlvbiIsIHB2UGFyYW0sIHBhcmFtKTsNCi0JCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm5QYW0sIHBhcmFtKTsNCi0JCQkJCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+PiBwYXJhbUFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFBhcmFtKHBhcmFtKTsNCi0JCQkJCWFzc2VydE5vdE51bGwocGFyYW1Bbm5vdGF0aW9ucyk7DQotCQkJCQlhc3NlcnRUcnVlKHBhcmFtQW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJCQkJSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IHRtcEFubiA9IHBhcmFtQW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQkJCQkNCi0JCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUodG1wQW5uKTsNCi0JCQkJCXBhcmFtQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0UGFyYW0ocGFyYW0pOw0KLQkJCQkJYXNzZXJ0Tm90TnVsbChwYXJhbUFubm90YXRpb25zKTsNCi0JCQkJCWFzc2VydFRydWUocGFyYW1Bbm5vdGF0aW9ucy5zaXplKCkgPT0gMCk7DQotCQkJCQkNCi0JCQkJCWFublBhbSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIlBhcmFtQW5ub3RhdGlvbjIiLCBwdlBhcmFtLCBwYXJhbSk7DQotCQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uUGFtLCBwYXJhbSk7DQotCQkJCQlwYXJhbUFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFBhcmFtKHBhcmFtKTsNCi0JCQkJCWFzc2VydE5vdE51bGwocGFyYW1Bbm5vdGF0aW9ucyk7DQotCQkJCQlhc3NlcnRUcnVlKHBhcmFtQW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJCQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQocGFyYW0pOw0KLQkJCQkJcGFyYW1Bbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RQYXJhbShwYXJhbSk7DQotCQkJCQlhc3NlcnROb3ROdWxsKHBhcmFtQW5ub3RhdGlvbnMpOw0KLQkJCQkJYXNzZXJ0VHJ1ZShwYXJhbUFubm90YXRpb25zLnNpemUoKSA9PSAwKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEluc3BlY3RvclNwZWNpZmljQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXBTcGVjaWZpYygpOw0KLQkJDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gaW5zcGVjdGVkVHlwZUFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgib3JnLmVjbGlwc2UuZGVtby5NeUFubm90YXRpb24iKTsNCi0JCWFzc2VydE5vdE51bGwoaW5zcGVjdGVkVHlwZUFubm90YXRpb24pOw0KLQkJYXNzZXJ0RXF1YWxzKGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm15VmFsdWUiKSwgIk15U3RyaW5nIik7IA0KLQkJDQotCQlpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbiA9IG51bGw7DQotCQkJCQ0KLQkJaW5zcGVjdGVkVHlwZUFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgiamF2YXguandzLldlYlNlcnZpY2UiKTsNCi0JCWFzc2VydE5vdE51bGwoaW5zcGVjdGVkVHlwZUFubm90YXRpb24pOw0KLQkJYXNzZXJ0VHJ1ZSgiamF2YXguandzLldlYlNlcnZpY2UiLmVuZHNXaXRoKGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKTsNCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJzZXJ2aWNlTmFtZSIpLCAiV1NJbXBsQmVhblNlcnZpY2UiKTsgDQotCQlhc3NlcnRFcXVhbHMoaW5zcGVjdGVkVHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmFtZSIpLCAiV1NJbXBsQmVhbiIpOyANCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJ0YXJnZXROYW1lc3BhY2UiKSwgImh0dHA6Ly9kZW1vL2VjbGlwc2Uvb3JnLyIpOyANCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJwb3J0TmFtZSIpLCAiV1NJbXBsQmVhblBvcnQiKTsgDQotDQotCQlJRmllbGQgZmllbGQgPSBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIik7DQotCQlJQW5ub3RhdGlvbjxJRmllbGQ+IGluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RGaWVsZChmaWVsZCwgIm9yZy5lY2xpcHNlLmRlbW8uTXlGaWVsZEFubm90YXRpb24iKTsNCi0JCWFzc2VydE5vdE51bGwoaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uKTsNCi0JCWFzc2VydFRydWUoIm9yZy5lY2xpcHNlLmRlbW8uTXlGaWVsZEFubm90YXRpb24iLmVuZHNXaXRoKGluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKSk7DQotCQlhc3NlcnRFcXVhbHMoaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm5hbWUiKSwgImZpZWxkMSIpOw0KLQkJDQotCQlpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24gPSBudWxsOw0KLQkJDQotCQlpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0RmllbGQoZmllbGQsICJqYXZheC5qd3MuV2ViRmllbGQiKTsNCi0JCWFzc2VydE5vdE51bGwoaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uKTsNCi0JCWFzc2VydFRydWUoImphdmF4Lmp3cy5XZWJGaWVsZCIuZW5kc1dpdGgoaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKTsNCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmFtZSIpLCAiTXlGaWVsZCIpOw0KLQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2RzKClbMF07DQotCQlJQW5ub3RhdGlvbjxJTWV0aG9kPiBpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QsICJvcmcuZWNsaXBzZS5kZW1vLk15TWV0aG9kQW5ub3RhdGlvbiIpOw0KLQkJYXNzZXJ0Tm90TnVsbChpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uKTsNCi0JCWFzc2VydFRydWUoIm9yZy5lY2xpcHNlLmRlbW8uTXlNZXRob2RBbm5vdGF0aW9uIi5lbmRzV2l0aChpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKTsNCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm5hbWUiKSwgImFubm90YXRlZE1ldGhvZCIpOw0KLQkJDQotCQlpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uID0gbnVsbDsNCi0JCQ0KLQkJaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kLCAiamF2YXguandzLldlYk1ldGhvZCIpOw0KLQkJYXNzZXJ0Tm90TnVsbChpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uKTsNCi0JCWFzc2VydFRydWUoImphdmF4Lmp3cy5XZWJNZXRob2QiLmVuZHNXaXRoKGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkpOw0KLQkJYXNzZXJ0RXF1YWxzKGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiZXhjbHVkZSIpLCAiZmFsc2UiKTsNCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm9wZXJhdGlvbk5hbWUiKSwgInRlc3QiKTsNCi0NCi0JCUlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSBtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcigiYW5ub3RhdGVkUGFyYW0iKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0UGFyYW0odHlwZVBhcmFtZXRlciwgIm9yZy5lY2xpcHNlLmRlbW8uTXlQYXJhbUFubm90YXRpb24iKTsNCi0JCWFzc2VydE5vdE51bGwoaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uKTsNCi0JCWFzc2VydFRydWUoIm9yZy5lY2xpcHNlLmRlbW8uTXlQYXJhbUFubm90YXRpb24iLmVuZHNXaXRoKGluc3BlY3RlZFBhcmFtQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKSk7DQotCQlhc3NlcnRFcXVhbHMoaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm5hbWUiKSwgImFubm90YXRlZE15UGFyYW0iKTsNCi0JCQ0KLQkJaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uID0gbnVsbDsNCi0JCQ0KLQkJaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFBhcmFtKHR5cGVQYXJhbWV0ZXIsICJqYXZheC5qd3MuV2ViUGFyYW0iKTsNCi0JCWFzc2VydE5vdE51bGwoaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uKTsNCi0JCWFzc2VydFRydWUoImphdmF4Lmp3cy5XZWJQYXJhbSIuZW5kc1dpdGgoaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKTsNCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmFtZSIpLCAiYW5ub3RhdGVkUGFyYW0iKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEluc3BlY3RvckxvY2F0b3JSZXRyaWV2ZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwU3BlY2lmaWMoKTsJCQ0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgiamF2YXguandzLldlYlNlcnZpY2UiKTsNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7DQotDQotCQlhc3NlcnRFcXVhbHMoMTEsIGFubm90YXRpb24uZ2V0TG9jYXRvcigpLmdldExpbmVOdW1iZXIoKSk7DQotCQlhc3NlcnRFcXVhbHMoMjI2LCBhbm5vdGF0aW9uLmdldExvY2F0b3IoKS5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEzNCwgYW5ub3RhdGlvbi5nZXRMb2NhdG9yKCkuZ2V0TGVuZ3RoKCkpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoMTEsIGdldFBhcmFtKCJwb3J0TmFtZSIsIGFubm90YXRpb24pLmdldExvY2F0b3IoKS5nZXRMaW5lTnVtYmVyKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDMzNCwgZ2V0UGFyYW0oInBvcnROYW1lIiwgYW5ub3RhdGlvbikuZ2V0TG9jYXRvcigpLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoMjUsIGdldFBhcmFtKCJwb3J0TmFtZSIsIGFubm90YXRpb24pLmdldExvY2F0b3IoKS5nZXRMZW5ndGgoKSk7CQkNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJUGFyYW1WYWx1ZVBhaXIgZ2V0UGFyYW0oZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24pIA0KLQl7DQotCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYXJhbSA6IGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkpIHsNCi0JCQlpZihwYXJhbS5nZXRQYXJhbSgpLmVxdWFscyhuYW1lKSkgew0KLQkJCQlyZXR1cm4gcGFyYW07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMGRiZTdmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQW5ub3RhdGlvblByb3BlcnR5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Bbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkF0dHJpYnV0ZVR5cGVFbnVtOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXJUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlDQotew0KLQlwcml2YXRlIE1vY2s8SVR5cGU+IHR5cGUgPSBtb2NrKElUeXBlLmNsYXNzKTsNCi0JcHJpdmF0ZSBNb2NrPElNZXRob2Q+IG1ldGhvZCA9IG1vY2soSU1ldGhvZC5jbGFzcyk7DQotCXByaXZhdGUgTW9jazxJVHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlciA9IG1vY2soSVR5cGVQYXJhbWV0ZXIuY2xhc3MpOw0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEJhc2UoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyKCk7DQotCQl0cnkgDQotCQl7DQotCQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShudWxsLCBudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgbm90IHRocm93biEiKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotDQotCQl0cnkgDQotCQl7DQotCQkJQW5ub3RhdGlvblByb3BlcnR5IGFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWUiLCAidmFsdWUiLCBBdHRyaWJ1dGVUeXBlRW51bS5TVFJJTkcpOw0KLQkJCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgbm90IHRocm93biEiKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotDQotCQl0cnkgDQotCQl7DQotCQkJQW5ub3RhdGlvblByb3BlcnR5IGFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWUiLCAidmFsdWUiLCBBdHRyaWJ1dGVUeXBlRW51bS5TVFJJTkcpOw0KLQkJCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQUNLQUdFKTsNCi0JCQlmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24hIik7DQotCQl9DQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZUxldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIgY29udGFpbmVyID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcigpOw0KLQkJQW5ub3RhdGlvblByb3BlcnR5IGFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWVCb29sZWFuIiwgInRydWUiLCBBdHRyaWJ1dGVUeXBlRW51bS5CT09MRUFOKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5UWVBFKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWVJbnRlZ2VyIiwgIjEwMCIsIEF0dHJpYnV0ZVR5cGVFbnVtLklOVEVHRVIpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIsICJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVkFMVUUiLCBBdHRyaWJ1dGVUeXBlRW51bS5RVUFMSUZJRURfTkFNRSk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuVFlQRSk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZSIsICJhdHRyaWJ1dGVOYW1lU3RyaW5nIiwgInZhbHVlU3RyaW5nIiwgQXR0cmlidXRlVHlwZUVudW0uU1RSSU5HKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5UWVBFKTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0VHlwZUFubm90YXRpb25zKHR5cGUucHJveHkoKSkuc2l6ZSgpID09IDEpOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnModHlwZVBhcmFtZXRlci5wcm94eSgpKS5zaXplKCkgPT0gMCk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRNZXRob2RBbm5vdGF0aW9ucyhtZXRob2QucHJveHkoKSkuc2l6ZSgpID09IDApOw0KLQkJU2V0PElBbm5vdGF0aW9uPElUeXBlPj4gdHlwZUFubm90YXRpb25zID0gY29udGFpbmVyLmdldFR5cGVBbm5vdGF0aW9ucyh0eXBlLnByb3h5KCkpOw0KLQkJDQotCQlmb3IgKElBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uIDogdHlwZUFubm90YXRpb25zKQ0KLQkJew0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSA0KTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZUJvb2xlYW4iKS5lcXVhbHMoInRydWUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVJbnRlZ2VyIikuZXF1YWxzKCIxMDAiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5WQUxVRSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZVN0cmluZyIpLmVxdWFscygidmFsdWVTdHJpbmciKSk7DQotCQl9DQotDQotCQljb250YWluZXIgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyKCk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZTEiLCAiYXR0cmlidXRlTmFtZUJvb2xlYW4iLCAidHJ1ZSIsIEF0dHJpYnV0ZVR5cGVFbnVtLkJPT0xFQU4pOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUyIiwgImF0dHJpYnV0ZU5hbWVJbnRlZ2VyIiwgIjEwMCIsIEF0dHJpYnV0ZVR5cGVFbnVtLklOVEVHRVIpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUzIiwgImF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiLCAib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIiwgQXR0cmlidXRlVHlwZUVudW0uUVVBTElGSUVEX05BTUUpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWU0IiwgImF0dHJpYnV0ZU5hbWVTdHJpbmciLCAidmFsdWVTdHJpbmciLCBBdHRyaWJ1dGVUeXBlRW51bS5TVFJJTkcpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQkJDQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRUeXBlQW5ub3RhdGlvbnModHlwZS5wcm94eSgpKS5zaXplKCkgPT0gNCk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLnByb3h5KCkpLnNpemUoKSA9PSAwKTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldE1ldGhvZEFubm90YXRpb25zKG1ldGhvZC5wcm94eSgpKS5zaXplKCkgPT0gMCk7DQotCQl0eXBlQW5ub3RhdGlvbnMgPSBjb250YWluZXIuZ2V0VHlwZUFubm90YXRpb25zKHR5cGUucHJveHkoKSk7DQotDQotCQlTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsNCi0JCW5hbWVzLmNsZWFyKCk7DQotCQluYW1lcy5hZGQoImFubm90YXRpb25OYW1lMSIpOw0KLQkJbmFtZXMuYWRkKCJhbm5vdGF0aW9uTmFtZTIiKTsNCi0JCW5hbWVzLmFkZCgiYW5ub3RhdGlvbk5hbWUzIik7DQotCQluYW1lcy5hZGQoImFubm90YXRpb25OYW1lNCIpOw0KLQkJDQotCQlmb3IgKElBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uIDogdHlwZUFubm90YXRpb25zKQ0KLQkJew0KLQkJCWFzc2VydFRydWUobmFtZXMuY29udGFpbnMoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKSk7DQotCQkJbmFtZXMucmVtb3ZlKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQkJaWYoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWUxIikpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDEpOwkNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVCb29sZWFuIikuZXF1YWxzKCJ0cnVlIikpOw0KLQkJCX0NCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTIiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7CQ0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZUludGVnZXIiKS5lcXVhbHMoIjEwMCIpKTsNCi0JCQl9DQotCQkJaWYoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWUzIikpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDEpOwkNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5WQUxVRSIpKTsNCi0JCQl9DQotCQkJaWYoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWU0IikpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDEpOw0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZVN0cmluZyIpLmVxdWFscygidmFsdWVTdHJpbmciKSk7CQkJCQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZExldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIgY29udGFpbmVyID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcigpOw0KLQkJQW5ub3RhdGlvblByb3BlcnR5IGFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWVCb29sZWFuIiwgInRydWUiLCBBdHRyaWJ1dGVUeXBlRW51bS5CT09MRUFOKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5NRVRIT0QpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZUludGVnZXIiLCAiMTAwIiwgQXR0cmlidXRlVHlwZUVudW0uSU5URUdFUik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuTUVUSE9EKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiLCAib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIiwgQXR0cmlidXRlVHlwZUVudW0uUVVBTElGSUVEX05BTUUpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLk1FVEhPRCk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZSIsICJhdHRyaWJ1dGVOYW1lU3RyaW5nIiwgInZhbHVlU3RyaW5nIiwgQXR0cmlidXRlVHlwZUVudW0uU1RSSU5HKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5NRVRIT0QpOw0KLQkJDQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRUeXBlQW5ub3RhdGlvbnModHlwZS5wcm94eSgpKS5zaXplKCkgPT0gMCk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLnByb3h5KCkpLnNpemUoKSA9PSAwKTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldE1ldGhvZEFubm90YXRpb25zKG1ldGhvZC5wcm94eSgpKS5zaXplKCkgPT0gMSk7DQotCQlTZXQ8SUFubm90YXRpb248SU1ldGhvZD4+IG1ldGhvZEFubm90YXRpb25zID0gY29udGFpbmVyLmdldE1ldGhvZEFubm90YXRpb25zKG1ldGhvZC5wcm94eSgpKTsNCi0JCQ0KLQkJZm9yIChJQW5ub3RhdGlvbjxJTWV0aG9kPiBhbm5vdGF0aW9uIDogbWV0aG9kQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDQpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lQm9vbGVhbiIpLmVxdWFscygidHJ1ZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZUludGVnZXIiKS5lcXVhbHMoIjEwMCIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lU3RyaW5nIikuZXF1YWxzKCJ2YWx1ZVN0cmluZyIpKTsNCi0JCX0NCi0NCi0JCWNvbnRhaW5lciA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIoKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lMSIsICJhdHRyaWJ1dGVOYW1lQm9vbGVhbiIsICJ0cnVlIiwgQXR0cmlidXRlVHlwZUVudW0uQk9PTEVBTik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuTUVUSE9EKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lMiIsICJhdHRyaWJ1dGVOYW1lSW50ZWdlciIsICIxMDAiLCBBdHRyaWJ1dGVUeXBlRW51bS5JTlRFR0VSKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5NRVRIT0QpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUzIiwgImF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiLCAib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIiwgQXR0cmlidXRlVHlwZUVudW0uUVVBTElGSUVEX05BTUUpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLk1FVEhPRCk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZTQiLCAiYXR0cmlidXRlTmFtZVN0cmluZyIsICJ2YWx1ZVN0cmluZyIsIEF0dHJpYnV0ZVR5cGVFbnVtLlNUUklORyk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuTUVUSE9EKTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0VHlwZUFubm90YXRpb25zKHR5cGUucHJveHkoKSkuc2l6ZSgpID09IDApOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnModHlwZVBhcmFtZXRlci5wcm94eSgpKS5zaXplKCkgPT0gMCk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRNZXRob2RBbm5vdGF0aW9ucyhtZXRob2QucHJveHkoKSkuc2l6ZSgpID09IDQpOw0KLQkJbWV0aG9kQW5ub3RhdGlvbnMgPSBjb250YWluZXIuZ2V0TWV0aG9kQW5ub3RhdGlvbnMobWV0aG9kLnByb3h5KCkpOw0KLQ0KLQkJU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7DQotCQluYW1lcy5jbGVhcigpOw0KLQkJbmFtZXMuYWRkKCJhbm5vdGF0aW9uTmFtZTEiKTsNCi0JCW5hbWVzLmFkZCgiYW5ub3RhdGlvbk5hbWUyIik7DQotCQluYW1lcy5hZGQoImFubm90YXRpb25OYW1lMyIpOw0KLQkJbmFtZXMuYWRkKCJhbm5vdGF0aW9uTmFtZTQiKTsNCi0JCQ0KLQkJZm9yIChJQW5ub3RhdGlvbjxJTWV0aG9kPiBhbm5vdGF0aW9uIDogbWV0aG9kQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZShuYW1lcy5jb250YWlucyhhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKTsNCi0JCQluYW1lcy5yZW1vdmUoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsNCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTEiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7CQ0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZUJvb2xlYW4iKS5lcXVhbHMoInRydWUiKSk7DQotCQkJfQ0KLQkJCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lMiIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSAxKTsJDQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lSW50ZWdlciIpLmVxdWFscygiMTAwIikpOw0KLQkJCX0NCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTMiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7CQ0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIikpOw0KLQkJCX0NCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTQiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lU3RyaW5nIikuZXF1YWxzKCJ2YWx1ZVN0cmluZyIpKTsJCQkJDQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJMZXZlbCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIoKTsNCi0JCUFubm90YXRpb25Qcm9wZXJ0eSBhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZSIsICJhdHRyaWJ1dGVOYW1lQm9vbGVhbiIsICJ0cnVlIiwgQXR0cmlidXRlVHlwZUVudW0uQk9PTEVBTik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWVJbnRlZ2VyIiwgIjEwMCIsIEF0dHJpYnV0ZVR5cGVFbnVtLklOVEVHRVIpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlBBUkFNRVRFUik7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZSIsICJhdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIiwgIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5WQUxVRSIsIEF0dHJpYnV0ZVR5cGVFbnVtLlFVQUxJRklFRF9OQU1FKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQVJBTUVURVIpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZVN0cmluZyIsICJ2YWx1ZVN0cmluZyIsIEF0dHJpYnV0ZVR5cGVFbnVtLlNUUklORyk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0VHlwZUFubm90YXRpb25zKHR5cGUucHJveHkoKSkuc2l6ZSgpID09IDApOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnModHlwZVBhcmFtZXRlci5wcm94eSgpKS5zaXplKCkgPT0gMSk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRNZXRob2RBbm5vdGF0aW9ucyhtZXRob2QucHJveHkoKSkuc2l6ZSgpID09IDApOw0KLQkJU2V0PElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPj4gcGFyYW1ldGVyQW5ub3RhdGlvbnMgPSBjb250YWluZXIuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnModHlwZVBhcmFtZXRlci5wcm94eSgpKTsNCi0JCQ0KLQkJZm9yIChJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gYW5ub3RhdGlvbiA6IHBhcmFtZXRlckFubm90YXRpb25zKQ0KLQkJew0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSA0KTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZUJvb2xlYW4iKS5lcXVhbHMoInRydWUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVJbnRlZ2VyIikuZXF1YWxzKCIxMDAiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5WQUxVRSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZVN0cmluZyIpLmVxdWFscygidmFsdWVTdHJpbmciKSk7DQotCQl9DQotDQotCQljb250YWluZXIgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyKCk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZTEiLCAiYXR0cmlidXRlTmFtZUJvb2xlYW4iLCAidHJ1ZSIsIEF0dHJpYnV0ZVR5cGVFbnVtLkJPT0xFQU4pOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlBBUkFNRVRFUik7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZTIiLCAiYXR0cmlidXRlTmFtZUludGVnZXIiLCAiMTAwIiwgQXR0cmlidXRlVHlwZUVudW0uSU5URUdFUik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lMyIsICJhdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIiwgIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5WQUxVRSIsIEF0dHJpYnV0ZVR5cGVFbnVtLlFVQUxJRklFRF9OQU1FKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQVJBTUVURVIpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWU0IiwgImF0dHJpYnV0ZU5hbWVTdHJpbmciLCAidmFsdWVTdHJpbmciLCBBdHRyaWJ1dGVUeXBlRW51bS5TVFJJTkcpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlBBUkFNRVRFUik7DQotCQkNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldFR5cGVBbm5vdGF0aW9ucyh0eXBlLnByb3h5KCkpLnNpemUoKSA9PSAwKTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldFBhcmFtZXRlckFubm90YXRpb25zKHR5cGVQYXJhbWV0ZXIucHJveHkoKSkuc2l6ZSgpID09IDQpOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0TWV0aG9kQW5ub3RhdGlvbnMobWV0aG9kLnByb3h5KCkpLnNpemUoKSA9PSAwKTsNCi0JCXBhcmFtZXRlckFubm90YXRpb25zID0gY29udGFpbmVyLmdldFBhcmFtZXRlckFubm90YXRpb25zKHR5cGVQYXJhbWV0ZXIucHJveHkoKSk7DQotDQotCQlTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsNCi0JCW5hbWVzLmNsZWFyKCk7DQotCQluYW1lcy5hZGQoImFubm90YXRpb25OYW1lMSIpOw0KLQkJbmFtZXMuYWRkKCJhbm5vdGF0aW9uTmFtZTIiKTsNCi0JCW5hbWVzLmFkZCgiYW5ub3RhdGlvbk5hbWUzIik7DQotCQluYW1lcy5hZGQoImFubm90YXRpb25OYW1lNCIpOw0KLQkJDQotCQlmb3IgKElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBhbm5vdGF0aW9uIDogcGFyYW1ldGVyQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZShuYW1lcy5jb250YWlucyhhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKTsNCi0JCQluYW1lcy5yZW1vdmUoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsNCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTEiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7CQ0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZUJvb2xlYW4iKS5lcXVhbHMoInRydWUiKSk7DQotCQkJfQ0KLQkJCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lMiIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSAxKTsJDQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lSW50ZWdlciIpLmVxdWFscygiMTAwIikpOw0KLQkJCX0NCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTMiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7CQ0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIikpOw0KLQkJCX0NCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTQiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lU3RyaW5nIikuZXF1YWxzKCJ2YWx1ZVN0cmluZyIpKTsJCQkJDQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDb21iaW5lZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIoKTsNCi0JCUFubm90YXRpb25Qcm9wZXJ0eSBhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJwYXJhbUFubm90YXRpb25OYW1lIiwgInBhcmFtQXR0cmlidXRlTmFtZUJvb2xlYW4iLCAidHJ1ZSIsIEF0dHJpYnV0ZVR5cGVFbnVtLkJPT0xFQU4pOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlBBUkFNRVRFUik7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJwYXJhbUFubm90YXRpb25OYW1lIiwgInBhcmFtQXR0cmlidXRlTmFtZUludGVnZXIiLCAiMTAwIiwgQXR0cmlidXRlVHlwZUVudW0uSU5URUdFUik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoInBhcmFtQW5ub3RhdGlvbk5hbWUiLCAicGFyYW1BdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIiwgIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5QQVJBTV9WQUxVRSIsIEF0dHJpYnV0ZVR5cGVFbnVtLlFVQUxJRklFRF9OQU1FKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQVJBTUVURVIpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgicGFyYW1Bbm5vdGF0aW9uTmFtZSIsICJwYXJhbUF0dHJpYnV0ZU5hbWVTdHJpbmciLCAicGFyYW1WYWx1ZVN0cmluZyIsIEF0dHJpYnV0ZVR5cGVFbnVtLlNUUklORyk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsNCi0NCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoIm1ldGhvZEFubm90YXRpb25OYW1lIiwgIm1ldGhvZEF0dHJpYnV0ZU5hbWVCb29sZWFuIiwgImZhbHNlIiwgQXR0cmlidXRlVHlwZUVudW0uQk9PTEVBTik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuTUVUSE9EKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoIm1ldGhvZEFubm90YXRpb25OYW1lIiwgIm1ldGhvZEF0dHJpYnV0ZU5hbWVJbnRlZ2VyIiwgIjEwMSIsIEF0dHJpYnV0ZVR5cGVFbnVtLklOVEVHRVIpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLk1FVEhPRCk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJtZXRob2RBbm5vdGF0aW9uTmFtZSIsICJtZXRob2RBdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIiwgIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5NRVRIT0RfVkFMVUUiLCBBdHRyaWJ1dGVUeXBlRW51bS5RVUFMSUZJRURfTkFNRSk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuTUVUSE9EKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoIm1ldGhvZEFubm90YXRpb25OYW1lIiwgIm1ldGhvZEF0dHJpYnV0ZU5hbWVTdHJpbmciLCAibWV0aG9kVmFsdWVTdHJpbmciLCBBdHRyaWJ1dGVUeXBlRW51bS5TVFJJTkcpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLk1FVEhPRCk7DQotDQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJ0eXBlQW5ub3RhdGlvbk5hbWUiLCAidHlwZUF0dHJpYnV0ZU5hbWVCb29sZWFuIiwgImZhbHNlIiwgQXR0cmlidXRlVHlwZUVudW0uQk9PTEVBTik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuVFlQRSk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJ0eXBlQW5ub3RhdGlvbk5hbWUiLCAidHlwZUF0dHJpYnV0ZU5hbWVJbnRlZ2VyIiwgIjEiLCBBdHRyaWJ1dGVUeXBlRW51bS5JTlRFR0VSKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5UWVBFKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoInR5cGVBbm5vdGF0aW9uTmFtZSIsICJ0eXBlQXR0cmlidXRlTmFtZVF1YWxpZmllZCIsICJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVFlQRV9WQUxVRSIsIEF0dHJpYnV0ZVR5cGVFbnVtLlFVQUxJRklFRF9OQU1FKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5UWVBFKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoInR5cGVBbm5vdGF0aW9uTmFtZSIsICJ0eXBlQXR0cmlidXRlTmFtZVN0cmluZyIsICJ0eXBlVmFsdWVTdHJpbmciLCBBdHRyaWJ1dGVUeXBlRW51bS5TVFJJTkcpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0VHlwZUFubm90YXRpb25zKHR5cGUucHJveHkoKSkuc2l6ZSgpID09IDEpOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnModHlwZVBhcmFtZXRlci5wcm94eSgpKS5zaXplKCkgPT0gMSk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRNZXRob2RBbm5vdGF0aW9ucyhtZXRob2QucHJveHkoKSkuc2l6ZSgpID09IDEpOw0KLQkJDQotCQlTZXQ8SUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+PiBwYXJhbWV0ZXJBbm5vdGF0aW9ucyA9IGNvbnRhaW5lci5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLnByb3h5KCkpOw0KLQkJZm9yIChJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gYW5ub3RhdGlvbiA6IHBhcmFtZXRlckFubm90YXRpb25zKQ0KLQkJew0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygicGFyYW1Bbm5vdGF0aW9uTmFtZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDQpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJwYXJhbUF0dHJpYnV0ZU5hbWVCb29sZWFuIikuZXF1YWxzKCJ0cnVlIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJwYXJhbUF0dHJpYnV0ZU5hbWVJbnRlZ2VyIikuZXF1YWxzKCIxMDAiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInBhcmFtQXR0cmlidXRlTmFtZVF1YWxpZmllZCIpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlBBUkFNX1ZBTFVFIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJwYXJhbUF0dHJpYnV0ZU5hbWVTdHJpbmciKS5lcXVhbHMoInBhcmFtVmFsdWVTdHJpbmciKSk7DQotCQl9DQotDQotCQlTZXQ8SUFubm90YXRpb248SU1ldGhvZD4+IG1ldGhvZEFubm90YXRpb25zID0gY29udGFpbmVyLmdldE1ldGhvZEFubm90YXRpb25zKG1ldGhvZC5wcm94eSgpKTsNCi0JCWZvciAoSUFubm90YXRpb248SU1ldGhvZD4gYW5ub3RhdGlvbiA6IG1ldGhvZEFubm90YXRpb25zKQ0KLQkJew0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygibWV0aG9kQW5ub3RhdGlvbk5hbWUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSA0KTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibWV0aG9kQXR0cmlidXRlTmFtZUJvb2xlYW4iKS5lcXVhbHMoImZhbHNlIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJtZXRob2RBdHRyaWJ1dGVOYW1lSW50ZWdlciIpLmVxdWFscygiMTAxIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJtZXRob2RBdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIikuZXF1YWxzKCJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uTUVUSE9EX1ZBTFVFIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJtZXRob2RBdHRyaWJ1dGVOYW1lU3RyaW5nIikuZXF1YWxzKCJtZXRob2RWYWx1ZVN0cmluZyIpKTsNCi0JCX0NCi0NCi0JCVNldDxJQW5ub3RhdGlvbjxJVHlwZT4+IHR5cGVBbm5vdGF0aW9ucyA9IGNvbnRhaW5lci5nZXRUeXBlQW5ub3RhdGlvbnModHlwZS5wcm94eSgpKTsNCi0JCWZvciAoSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24gOiB0eXBlQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJ0eXBlQW5ub3RhdGlvbk5hbWUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSA0KTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgidHlwZUF0dHJpYnV0ZU5hbWVCb29sZWFuIikuZXF1YWxzKCJmYWxzZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgidHlwZUF0dHJpYnV0ZU5hbWVJbnRlZ2VyIikuZXF1YWxzKCIxIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJ0eXBlQXR0cmlidXRlTmFtZVF1YWxpZmllZCIpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlRZUEVfVkFMVUUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInR5cGVBdHRyaWJ1dGVOYW1lU3RyaW5nIikuZXF1YWxzKCJ0eXBlVmFsdWVTdHJpbmciKSk7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvblV0aWxzVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvblV0aWxzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZDI0NTJmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25VdGlsc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVXRpbHNUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLmRlbW8iOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludC5zcmMiLCAiRW5kcG9pbnQiKTsNCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGVuZHBvaW50KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcCgpOw0KLQkJDQotCQlJVmFsdWUgc3YgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgiTXkgU3RyaW5nIFZhbHVlIik7DQotDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJQYXJhbSIsIHN2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElGaWVsZD4gYW5uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24iLCBwdiwgZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm4sIGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKSk7DQotCQlhc3NlcnRFcXVhbHMoYW5uLmdldEFwcGxpZWRFbGVtZW50KCksIGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKSk7DQotCQkNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUoYW5uKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uc0Jhc2VJbXBsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbnNCYXNlSW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODE1ZDE0Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uc0Jhc2VJbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uV3JpdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JTG9jYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQW5ub3RhdGlvbkltcGw7DQotDQotcHVibGljIGNsYXNzIEFubm90YXRpb25zQmFzZUltcGxUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLmRlbW8iOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcFdpdG91dFJlbW92ZSgpOw0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZW5kcG9pbnQpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldFVwV2l0b3V0UmVtb3ZlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsNCi0JCWVuZHBvaW50ID0gY3JlYXRlQ2xhc3MoIkVuZHBvaW50LnNyYyIsICJFbmRwb2ludCIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRVcFdpdG91dFJlbW92ZTIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnRBbm5JbnNwZWN0b3Iuc3JjIiwgIkVuZHBvaW50QW5uSW5zcGVjdG9yIik7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RCYXNlQW5ub3RhdHRpb25GdW5jdGlvbmFsaXR5KCkNCi0Jew0KLQkJQW5ub3RhdGlvbkltcGw8SVR5cGU+IGFubiA9IG5ldyBBbm5vdGF0aW9uSW1wbDxJVHlwZT4oImNvbS5zcGEudGVzdC5NeUFubm90YXRpb24iLCBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCkpOw0KLQkJYXNzZXJ0RXF1YWxzKGFubi5nZXRBbm5vdGF0aW9uTmFtZSgpLCAiY29tLnNwYS50ZXN0Lk15QW5ub3RhdGlvbiIpOw0KLQkJYXNzZXJ0RXF1YWxzKGFubi5nZXRTaW1wbGVBbm5vdGF0aW9uTmFtZSgpLCAiTXlBbm5vdGF0aW9uIik7DQotCQkvL2Fzc2VydEVxdWFscyhhbm4uZ2V0VmFsdWVUeXBlKCksIElWYWx1ZS5BTk5PVEFUSU9OX1ZBTFVFKTsNCi0JCQ0KLQkJYW5uID0gbmV3IEFubm90YXRpb25JbXBsPElUeXBlPigiTXlOZXdBbm5vdGF0aW9uIiwgbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpKTsNCi0JCWFzc2VydEVxdWFscyhhbm4uZ2V0QW5ub3RhdGlvbk5hbWUoKSwgIk15TmV3QW5ub3RhdGlvbiIpOw0KLQkJYXNzZXJ0RXF1YWxzKGFubi5nZXRTaW1wbGVBbm5vdGF0aW9uTmFtZSgpLCAiTXlOZXdBbm5vdGF0aW9uIik7DQotCQkvL2Fzc2VydEVxdWFscyhhbm4uZ2V0VmFsdWVUeXBlKCksIElWYWx1ZS5BTk5PVEFUSU9OX1ZBTFVFKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEFkZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwKCk7DQotCQkNCi0JCUlWYWx1ZSBxdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZSIpOw0KLQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBxdikpOw0KLQkJDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24iLCBwdiwgZW5kcG9pbnQpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubiwgZW5kcG9pbnQpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gdG1wQW5uID0gYW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQkNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUodG1wQW5uKTsNCi0JCQ0KLQkJYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMCk7DQotCQkNCi0JCUlNZXRob2RbXSBtZXRob2RzID0gZW5kcG9pbnQuZ2V0TWV0aG9kcygpOw0KLQkJZm9yIChJTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpDQotCQl7DQotCQkJaWYobWV0aG9kLmdldFJhd1BhcmFtZXRlck5hbWVzKCkgIT0gbnVsbCAmJiBtZXRob2QuZ2V0UmF3UGFyYW1ldGVyTmFtZXMoKS5sZW5ndGggPiAwKQ0KLQkJCXsNCi0JCQkJSUFubm90YXRpb248SU1ldGhvZD4gYW5uTSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uTWV0aG9kIiwgcHYsIG1ldGhvZCk7DQotCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm5NLCBtZXRob2QpOw0KLQkJCQlhc3NlcnRFcXVhbHMoImZ1bGwucXVhbGlmaWVkLk5hbWUiLCBhbm5NLmdldFByb3BlcnR5VmFsdWUoInBhcmFtIikpOw0KLQkJCQlhc3NlcnROdWxsKGFubk0uZ2V0UHJvcGVydHlWYWx1ZSgicGFyYW1Ob3RFeGlzdHMiKSk7DQotCQkJCUNvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IGFubm90YXRpb25zTSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCQkJSUFubm90YXRpb248SU1ldGhvZD4gYW5ub3RhdE0gPSBhbm5vdGF0aW9uc00uaXRlcmF0b3IoKS5uZXh0KCk7DQotCQkJCWFzc2VydEVxdWFscygicXVhbGlmaWVkLk5hbWUiLCBhbm5vdGF0TS5nZXRQcm9wZXJ0eVZhbHVlKCJwYXJhbSIpKTsNCi0JCQkJDQotCQkJCUlWYWx1ZSBzdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJOZXcgU3RyaW5nIFZhbHVlIik7DQotCQkJCWFubk0uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoIk5ld1BhcmFtIiwgc3YpKTsNCi0JCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZShhbm5NKTsNCi0JCQkJYW5ub3RhdGlvbnNNID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb25zTS5zaXplKCkgPT0gMSk7DQotCQkJCWFubm90YXRNID0gYW5ub3RhdGlvbnNNLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIk5ldyBTdHJpbmcgVmFsdWUiLCBhbm5vdGF0TS5nZXRQcm9wZXJ0eVZhbHVlKCJOZXdQYXJhbSIpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJxdWFsaWZpZWQuTmFtZSIsIGFubm90YXRNLmdldFByb3BlcnR5VmFsdWUoInBhcmFtIikpOw0KLQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkucmVtb3ZlKGFubm90YXRNKTsNCi0JCQkJYW5ub3RhdGlvbnNNID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb25zTS5zaXplKCkgPT0gMCk7DQotDQotCQkJCUlWYWx1ZSBzdjMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgiTmV3IFN0cmluZyBWYWx1ZTMiKTsNCi0JCQkJYW5uTS5nZXRQYXJhbVZhbHVlUGFpcnMoKS5jbGVhcigpOw0KLQkJCQlhbm5NLmdldFBhcmFtVmFsdWVQYWlycygpLmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJOZXdQYXJhbSIsIHN2MykpOw0KLQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkudXBkYXRlKGFubk0pOw0KLQkJCQlhbm5vdGF0aW9uc00gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbnNNLnNpemUoKSA9PSAxKTsNCi0JCQkJYW5ub3RhdE0gPSBhbm5vdGF0aW9uc00uaXRlcmF0b3IoKS5uZXh0KCk7DQotCQkJCWFzc2VydEVxdWFscygiTmV3IFN0cmluZyBWYWx1ZTMiLCBhbm5vdGF0TS5nZXRQcm9wZXJ0eVZhbHVlKCJOZXdQYXJhbSIpKTsNCi0NCi0JCQkJLy8gY2xlYXIgYW5ub3RhdGlvbg0KLQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkucmVtb3ZlKGFubk0pOw0KLQ0KLQkJCQlhbm5vdGF0aW9uc00gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbnNNLnNpemUoKSA9PSAwKTsNCi0JCQkJDQotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBtZXRob2QuZ2V0UmF3UGFyYW1ldGVyTmFtZXMoKS5sZW5ndGg7IGkrKykNCi0JCQkJew0KLQkJCQkJSVR5cGVQYXJhbWV0ZXIgcGFyYW0gPSBtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcihtZXRob2QuZ2V0UmF3UGFyYW1ldGVyTmFtZXMoKVtpXSk7DQotDQotCQkJCQlJVmFsdWUgc3ZQYXJhbSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJTdHJpbmcgVmFsdSBQYXJhbSIpOw0KLQkJCQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcHZQYXJhbSA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCQkJCXB2UGFyYW0uYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoIlBhcmFtQXRyaWJ1dGUiLCBzdlBhcmFtKSk7DQotCQkJCQlJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gYW5uUCA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIlBhcmFtQW5ub3RhdGlvbiIsIHB2UGFyYW0sIHBhcmFtKTsNCi0JCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm5QLCBwYXJhbSk7DQotCQkJCQkNCi0JCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUoYW5uUCk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0dGlvblVwZGF0ZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXAoKTsNCi0JCQ0KLQkJSVZhbHVlIHN2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoIlN0cmluZ1ZhbHVlIik7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBzcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlzcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInN0cmluZ1BhcmFtIiwgc3YpKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiB0eXBlQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlUeXBlQW5ub3RhdGlvbiIsIHNwdiwgZW5kcG9pbnQpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KHR5cGVBbm5vdGF0aW9uLCBlbmRwb2ludCk7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gdHlwZUFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydE5vdE51bGwodHlwZUFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUodHlwZUFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiB0ZW1wVHlwZUFubm90YXRpb24gPSB0eXBlQW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlhc3NlcnRFcXVhbHModGVtcFR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInN0cmluZ1BhcmFtIiksICJTdHJpbmdWYWx1ZSIpOw0KLQkJDQotCQlJVmFsdWUgbmV3U1YgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgiTmV3U3RyaW5nVmFsdWUiKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IG5ld1NQViA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCW5ld1NQVi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgic3RyaW5nUGFyYW0iLCBuZXdTVikpOw0KLQkJQW5ub3RhdGlvbkltcGw8SVR5cGU+IG5ld1R5cGVBbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb25JbXBsPElUeXBlPigib3JnLmVjbGlwc2UudGVzdC5NeVR5cGVBbm5vdGF0aW9uIiwgbmV3U1BWKTsNCi0JCW5ld1R5cGVBbm5vdGF0aW9uLnNldEFwcGxpZWRFbGVtZW50V2l0aG91dFNhdmUoZW5kcG9pbnQpOw0KLQkJDQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkudXBkYXRlKG5ld1R5cGVBbm5vdGF0aW9uKTsNCi0JCQ0KLQkJdHlwZUFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydE5vdE51bGwodHlwZUFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUodHlwZUFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0JCXRlbXBUeXBlQW5ub3RhdGlvbiA9IHR5cGVBbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydEVxdWFscyh0ZW1wVHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgic3RyaW5nUGFyYW0iKSwgIk5ld1N0cmluZ1ZhbHVlIik7DQotDQotCQluZXdTViA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJOZXdlc3RTdHJpbmdWYWx1ZSIpOw0KLQkJbmV3U1BWID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJbmV3U1BWLmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJuZXdlc3RTdHJpbmdQYXJhbSIsIG5ld1NWKSk7DQotCQluZXdUeXBlQW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uSW1wbDxJVHlwZT4oIm9yZy5lY2xpcHNlLnRlc3QuTXlUeXBlQW5ub3RhdGlvbiIsIG5ld1NQVik7DQotCQluZXdUeXBlQW5ub3RhdGlvbi5zZXRBcHBsaWVkRWxlbWVudFdpdGhvdXRTYXZlKGVuZHBvaW50KTsNCi0JCQ0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZShuZXdUeXBlQW5ub3RhdGlvbik7DQotDQotCQl0eXBlQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0eXBlQW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZSh0eXBlQW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJdGVtcFR5cGVBbm5vdGF0aW9uID0gdHlwZUFubm90YXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJYXNzZXJ0TnVsbCh0ZW1wVHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgic3RyaW5nUGFyYW0iKSk7DQotCQlhc3NlcnRFcXVhbHModGVtcFR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm5ld2VzdFN0cmluZ1BhcmFtIiksICJOZXdlc3RTdHJpbmdWYWx1ZSIpOw0KLQ0KLQkJSU1ldGhvZCBmaXJzdE1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZHMoKVswXTsNCi0NCi0JCUlWYWx1ZSBpdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUludGVnZXJWYWx1ZSgiMTAiKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IGlwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCWlwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiaW50ZWdlclBhcmFtIiwgaXYpKTsNCi0JCUlBbm5vdGF0aW9uPElNZXRob2Q+IG1ldGhvZEFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15TWV0aG9kQW5ub3RhdGlvbiIsIGlwdiwgZmlyc3RNZXRob2QpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KG1ldGhvZEFubm90YXRpb24sIGZpcnN0TWV0aG9kKTsNCi0NCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IG1ldGhvZEFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChmaXJzdE1ldGhvZCk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZEFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUobWV0aG9kQW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJSUFubm90YXRpb248SU1ldGhvZD4gdGVtcE1ldGhvZEFubm90YXRpb24gPSBtZXRob2RBbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydEVxdWFscyh0ZW1wTWV0aG9kQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJpbnRlZ2VyUGFyYW0iKSwgIjEwIik7DQotCQkNCi0JCUlWYWx1ZSBuZXdJViA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUludGVnZXJWYWx1ZSgiMTEiKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IG5ld0lQViA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCW5ld0lQVi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiaW50ZWdlclBhcmFtIiwgbmV3SVYpKTsNCi0JCUFubm90YXRpb25JbXBsPElNZXRob2Q+IG5ld01ldGhvZEFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbkltcGw8SU1ldGhvZD4oIm9yZy5lY2xpcHNlLnRlc3QuTXlNZXRob2RBbm5vdGF0aW9uIiwgbmV3SVBWKTsNCi0JCW5ld01ldGhvZEFubm90YXRpb24uc2V0QXBwbGllZEVsZW1lbnRXaXRob3V0U2F2ZShmaXJzdE1ldGhvZCk7DQotCQkNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS51cGRhdGUobmV3TWV0aG9kQW5ub3RhdGlvbik7DQotCQkNCi0JCW1ldGhvZEFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChmaXJzdE1ldGhvZCk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZEFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUobWV0aG9kQW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJdGVtcE1ldGhvZEFubm90YXRpb24gPSBtZXRob2RBbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydEVxdWFscyh0ZW1wTWV0aG9kQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJpbnRlZ2VyUGFyYW0iKSwgIjExIik7DQotDQotCQluZXdJViA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUludGVnZXJWYWx1ZSgiMTAwIik7DQotCQluZXdJUFYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQluZXdJUFYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoIm5ld2VzdEludGVnZXJQYXJhbSIsIG5ld0lWKSk7DQotCQluZXdNZXRob2RBbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb25JbXBsPElNZXRob2Q+KCJvcmcuZWNsaXBzZS50ZXN0Lk15TWV0aG9kQW5ub3RhdGlvbiIsIG5ld0lQVik7DQotCQluZXdNZXRob2RBbm5vdGF0aW9uLnNldEFwcGxpZWRFbGVtZW50V2l0aG91dFNhdmUoZmlyc3RNZXRob2QpOw0KLQkJDQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkudXBkYXRlKG5ld01ldGhvZEFubm90YXRpb24pOw0KLQ0KLQkJbWV0aG9kQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKGZpcnN0TWV0aG9kKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kQW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShtZXRob2RBbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQl0ZW1wTWV0aG9kQW5ub3RhdGlvbiA9IG1ldGhvZEFubm90YXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJYXNzZXJ0TnVsbCh0ZW1wTWV0aG9kQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJpbnRlZ2VyUGFyYW0iKSk7DQotCQlhc3NlcnRFcXVhbHModGVtcE1ldGhvZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmV3ZXN0SW50ZWdlclBhcmFtIiksICIxMDAiKTsNCi0NCi0JCUlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSBmaXJzdE1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKCJhbm5vdGF0ZWRQYXJhbSIpOw0KLQ0KLQkJSVZhbHVlIGJ2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQm9vbGVhblZhbHVlKHRydWUpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gYnB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJYnB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJib29sZWFuUGFyYW0iLCBidikpOw0KLQkJSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IHBhcmFtZXRlckFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15UGFyYW1ldGVyQW5ub3RhdGlvbiIsIGJwdiwgdHlwZVBhcmFtZXRlcik7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQocGFyYW1ldGVyQW5ub3RhdGlvbiwgdHlwZVBhcmFtZXRlcik7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPj4gcGFyYW1ldGVyQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0UGFyYW0odHlwZVBhcmFtZXRlcik7DQotCQlhc3NlcnROb3ROdWxsKHBhcmFtZXRlckFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUocGFyYW1ldGVyQW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IHRlbXBQYXJhbWV0ZXJBbm5vdGF0aW9uID0gcGFyYW1ldGVyQW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlhc3NlcnRFcXVhbHModGVtcFBhcmFtZXRlckFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYm9vbGVhblBhcmFtIiksICJ0cnVlIik7DQotCQkNCi0JCUlWYWx1ZSBuZXdCViA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUJvb2xlYW5WYWx1ZShmYWxzZSk7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBuZXdCUFYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQluZXdCUFYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoImJvb2xlYW5QYXJhbSIsIG5ld0JWKSk7DQotCQlBbm5vdGF0aW9uSW1wbDxJVHlwZVBhcmFtZXRlcj4gbmV3UGFyYW1ldGVyQW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uSW1wbDxJVHlwZVBhcmFtZXRlcj4oIm9yZy5lY2xpcHNlLnRlc3QuTXlQYXJhbWV0ZXJBbm5vdGF0aW9uIiwgbmV3QlBWKTsNCi0JCW5ld1BhcmFtZXRlckFubm90YXRpb24uc2V0QXBwbGllZEVsZW1lbnRXaXRob3V0U2F2ZSh0eXBlUGFyYW1ldGVyKTsNCi0JCQ0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZShuZXdQYXJhbWV0ZXJBbm5vdGF0aW9uKTsNCi0JCQ0KLQkJcGFyYW1ldGVyQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0UGFyYW0odHlwZVBhcmFtZXRlcik7DQotCQlhc3NlcnROb3ROdWxsKHBhcmFtZXRlckFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUocGFyYW1ldGVyQW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJdGVtcFBhcmFtZXRlckFubm90YXRpb24gPSBwYXJhbWV0ZXJBbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydEVxdWFscyh0ZW1wUGFyYW1ldGVyQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJib29sZWFuUGFyYW0iKSwgImZhbHNlIik7DQotDQotCQluZXdCViA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUJvb2xlYW5WYWx1ZSh0cnVlKTsNCi0JCW5ld0JQViA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCW5ld0JQVi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgibmV3ZXN0Qm9vbGVhblBhcmFtIiwgbmV3QlYpKTsNCi0JCW5ld1BhcmFtZXRlckFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbkltcGw8SVR5cGVQYXJhbWV0ZXI+KCJvcmcuZWNsaXBzZS50ZXN0Lk15UGFyYW1ldGVyQW5ub3RhdGlvbiIsIG5ld0JQVik7DQotCQluZXdQYXJhbWV0ZXJBbm5vdGF0aW9uLnNldEFwcGxpZWRFbGVtZW50V2l0aG91dFNhdmUodHlwZVBhcmFtZXRlcik7DQotCQkNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS51cGRhdGUobmV3UGFyYW1ldGVyQW5ub3RhdGlvbik7DQotDQotCQlwYXJhbWV0ZXJBbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RQYXJhbSh0eXBlUGFyYW1ldGVyKTsNCi0JCWFzc2VydE5vdE51bGwocGFyYW1ldGVyQW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShwYXJhbWV0ZXJBbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQl0ZW1wUGFyYW1ldGVyQW5ub3RhdGlvbiA9IHBhcmFtZXRlckFubm90YXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJYXNzZXJ0TnVsbCh0ZW1wUGFyYW1ldGVyQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJib29sZWFuUGFyYW0iKSk7DQotCQlhc3NlcnRFcXVhbHModGVtcFBhcmFtZXRlckFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmV3ZXN0Qm9vbGVhblBhcmFtIiksICJ0cnVlIik7DQotCQkNCi0JCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0QXBwbGllZEVsZW1lbnRXaXRob3V0U2F2ZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXAoKTsNCi0JCUlWYWx1ZSBxdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZSIpOw0KLQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBxdikpOw0KLQkJDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24iLCBwdiwgZW5kcG9pbnQpOw0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubiwgbnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24uIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdHlBZGRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcFdpdG91dFJlbW92ZSgpOw0KLQkJDQotCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkNCi0JCXsNCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkJCXsNCi0JCQkJdHJ5DQotCQkJCXsNCi0JCQkJCVNldDxTdHJpbmc+IGFubm9TZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7DQotCQkJCQlhbm5vU2V0LmFkZCgiU3RhdGVsZXNzIik7DQotCQkJCQkNCi0JCQkJCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zKGVuZHBvaW50LCBhbm5vU2V0KTsNCi0JCQkJCQ0KLQkJCQkJSVZhbHVlIHF2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lIik7DQotDQotCQkJCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCQkJCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHF2KSk7DQotCQkJCQkNCi0JCQkJCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludCk7DQotCQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uLCBlbmRwb2ludCk7DQotDQotCQkJCQlJVmFsdWUgc3YgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgiU3RyaW5nVmFsdWUiKTsNCi0NCi0JCQkJCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHNwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCQkJCXNwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgic3RyaW5nUGFyYW0iLCBzdikpOw0KLQkJCQkJDQotCQkJCQlJQW5ub3RhdGlvbjxJVHlwZT4gc0FubiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlTdHJpbmdBbm5vdGF0aW9uIiwgc3B2LCBlbmRwb2ludCk7DQotCQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoc0FubiwgZW5kcG9pbnQpOw0KLQkJCQkJDQotCQkJCQkNCi0JCQkJCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQkJCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0JCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDMpOw0KLQkJCQkJSUFubm90YXRpb248SVR5cGU+IHRtcEFubiA9IGFubm90YXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJCQkJDQotCQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkucmVtb3ZlKHRtcEFubik7DQotCQkJCQkNCi0JCQkJCWFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDIpOw0KLQkJCQkJDQotCQkJCQlJTWV0aG9kW10gbWV0aG9kcyA9IGVuZHBvaW50LmdldE1ldGhvZHMoKTsNCi0JCQkJCWZvciAoSU1ldGhvZCBtZXRob2QgOiBtZXRob2RzKQ0KLQkJCQkJew0KLQkJCQkJCUlWYWx1ZSBzbXYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgiU3RyaW5nVmFsdWUiKTsNCi0JCQkJCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBzbXB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJCQkJCXNtcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInN0cmluZ1BhcmFtIiwgc212KSk7DQotCQkJCQkJDQotCQkJCQkJSUFubm90YXRpb248SU1ldGhvZD4gc21Bbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbk1ldGhvZCIsIHNtcHYsIG1ldGhvZCk7DQotCQkJCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KHNtQW5uLCBtZXRob2QpOw0KLQkJCQkJCUNvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IGFubm90YXRpb25zTSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCQkJCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zTSk7DQotCQkJCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uc00uc2l6ZSgpID09IDIpOw0KLQ0KLQkJCQkJCWFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQkJCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0JCQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAyKTsNCi0NCi0JCQkJCX0NCi0JDQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQ0KLQkJCQl7DQotCQkJCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX07DQotCQkNCi0JCWdldFRlc3RQcm9qZWN0KCkuZ2V0U291cmNlRm9sZGVyKCkuZ2V0UmVzb3VyY2UoKS5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsIG51bGwpOw0KLQ0KLQkJDQotCQkNCi0JCQ0KLQl9DQotCQkNCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpDQotCXsNCi0JCUlWYWx1ZSBxdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZSIpOw0KLQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBxdikpOw0KLQkJDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5uMSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uMSIsIHB2LCBlbmRwb2ludCk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5uMiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uMiIsIHB2LCBlbmRwb2ludCk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5uMyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uMSIsIHB2LCBlbmRwb2ludCk7DQotCQkNCi0JCWFzc2VydFRydWUoYW5uMS5lcXVhbHMoYW5uMSkpOw0KLQkJYXNzZXJ0RmFsc2UoYW5uMS5lcXVhbHMobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2UoYW5uMS5lcXVhbHMocXYpKTsNCi0JCWFzc2VydEZhbHNlKGFubjEuZXF1YWxzKGFubjIpKTsNCi0JCWFzc2VydFRydWUoYW5uMS5lcXVhbHMoYW5uMykpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RGaWVsZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXAoKTsNCi0JCQ0KLQkJSVZhbHVlIHF2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lIik7DQotDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHF2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElGaWVsZD4gYW5uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24iLCBwdiwgZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm4sIGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKSk7DQotCQlhc3NlcnRFcXVhbHMoYW5uLmdldEFwcGxpZWRFbGVtZW50KCksIGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RMb2NhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcFdpdG91dFJlbW92ZTIoKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SVR5cGU+IGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoIm9yZy5lY2xpcHNlLmRlbW8uTXlBbm5vdGF0aW9uIik7DQotCQlhc3NlcnROb3ROdWxsKGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uKTsNCi0JCUlMb2NhdG9yIGxvY2F0b3IgPSBpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbi5nZXRMb2NhdG9yKCk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYW5ub3RhdGlvbiBzdGFydCBwb3NpdGlvbiIsIDE5MSwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGxlbmd0aCIsIDMzLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcm1WYWx1ZXMgPSBpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKTsNCi0JCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWVQYWlyIDogcGFybVZhbHVlcykNCi0JCXsNCi0JCQlpZihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygibXlWYWx1ZSIpKQ0KLQkJCXsNCi0JCQkJbG9jYXRvciA9IHBhcmFtVmFsdWVQYWlyLmdldExvY2F0b3IoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgMjA1LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCAxOCwgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaW5zcGVjdGVkVHlwZUFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgiamF2YXguandzLldlYlNlcnZpY2UiKTsNCi0JCWFzc2VydE5vdE51bGwoaW5zcGVjdGVkVHlwZUFubm90YXRpb24pOw0KLQkJbG9jYXRvciA9IGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uLmdldExvY2F0b3IoKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBAV2ViU2VydmljZSBhbm5vdGF0aW9uIHN0YXJ0IHBvc2l0aW9uIiwgMjI2LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBsZW5ndGgiLCAxMzQsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJcGFybVZhbHVlcyA9IGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpOw0KLQkJZm9yIChJUGFyYW1WYWx1ZVBhaXIgcGFyYW1WYWx1ZVBhaXIgOiBwYXJtVmFsdWVzKQ0KLQkJew0KLQkJCWlmKHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJzZXJ2aWNlTmFtZSIpKQ0KLQkJCXsNCi0JCQkJbG9jYXRvciA9IHBhcmFtVmFsdWVQYWlyLmdldExvY2F0b3IoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHNlcnZpY2VOYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgMjM4LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBzZXJ2aWNlTmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCAzMSwgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQkJfQ0KLQ0KLQkJCWlmKHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJuYW1lIikpDQotCQkJew0KLQkJCQlsb2NhdG9yID0gcGFyYW1WYWx1ZVBhaXIuZ2V0TG9jYXRvcigpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgc2VydmljZU5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCAyNzEsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHNlcnZpY2VOYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDE3LCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotDQotCQkJaWYocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoInRhcmdldE5hbWVzcGFjZSIpKQ0KLQkJCXsNCi0JCQkJbG9jYXRvciA9IHBhcmFtVmFsdWVQYWlyLmdldExvY2F0b3IoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHRhcmdldE5hbWVzcGFjZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDI5MCwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgdGFyZ2V0TmFtZXNwYWNlIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDQyLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotDQotCQkJaWYocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoInBvcnROYW1lIikpDQotCQkJew0KLQkJCQlsb2NhdG9yID0gcGFyYW1WYWx1ZVBhaXIuZ2V0TG9jYXRvcigpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgcG9ydE5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCAzMzQsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHBvcnROYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDI1LCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotCQl9DQotDQotCQlJRmllbGQgZmllbGQgPSBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIik7DQotCQlJQW5ub3RhdGlvbjxJRmllbGQ+IGluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RGaWVsZChmaWVsZCwgIm9yZy5lY2xpcHNlLmRlbW8uTXlGaWVsZEFubm90YXRpb24iKTsNCi0JCWxvY2F0b3IgPSBpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24uZ2V0TG9jYXRvcigpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIE15RmllbGRBbm5vdGF0aW9uIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNDAxLCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgTXlGaWVsZEFubm90YXRpb24gYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMzMsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJcGFybVZhbHVlcyA9IGluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKTsNCi0JCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWVQYWlyIDogcGFybVZhbHVlcykNCi0JCXsNCi0JCQlpZihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygibmFtZSIpKQ0KLQkJCXsNCi0JCQkJbG9jYXRvciA9IHBhcmFtVmFsdWVQYWlyLmdldExvY2F0b3IoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA0MjAsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMTMsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RGaWVsZChmaWVsZCwgImphdmF4Lmp3cy5XZWJGaWVsZCIpOw0KLQkJbG9jYXRvciA9IGluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbi5nZXRMb2NhdG9yKCk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgV2ViRmllbGQgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA0MzcsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBXZWJGaWVsZCBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCAyNSwgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQlwYXJtVmFsdWVzID0gaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpOw0KLQkJZm9yIChJUGFyYW1WYWx1ZVBhaXIgcGFyYW1WYWx1ZVBhaXIgOiBwYXJtVmFsdWVzKQ0KLQkJew0KLQkJCWlmKHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJuYW1lIikpDQotCQkJew0KLQkJCQlsb2NhdG9yID0gcGFyYW1WYWx1ZVBhaXIuZ2V0TG9jYXRvcigpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDQ0NywgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCAxNCwgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2RzKClbMF07DQotCQlJQW5ub3RhdGlvbjxJTWV0aG9kPiBpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QsICJvcmcuZWNsaXBzZS5kZW1vLk15TWV0aG9kQW5ub3RhdGlvbiIpOw0KLQkJbG9jYXRvciA9IGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24uZ2V0TG9jYXRvcigpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIE15TWV0aG9kQW5ub3RhdGlvbiBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDQ5MiwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIE15TWV0aG9kQW5ub3RhdGlvbiBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCA0MywgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQlwYXJtVmFsdWVzID0gaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKTsNCi0JCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWVQYWlyIDogcGFybVZhbHVlcykNCi0JCXsNCi0JCQlpZihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygibmFtZSIpKQ0KLQkJCXsNCi0JCQkJbG9jYXRvciA9IHBhcmFtVmFsdWVQYWlyLmdldExvY2F0b3IoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA1MTIsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMjIsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWluc3BlY3RlZE1ldGhvZEFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCwgImphdmF4Lmp3cy5XZWJNZXRob2QiKTsNCi0JCWxvY2F0b3IgPSBpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uLmdldExvY2F0b3IoKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBXZWJNZXRob2QgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA1MzgsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBXZWJNZXRob2QgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgNDYsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJcGFybVZhbHVlcyA9IGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCk7DQotCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlUGFpciA6IHBhcm1WYWx1ZXMpDQotCQl7DQotCQkJaWYocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoImV4Y2x1ZGUiKSkNCi0JCQl7DQotCQkJCWxvY2F0b3IgPSBwYXJhbVZhbHVlUGFpci5nZXRMb2NhdG9yKCk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBleGNsdWRlIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNTQ5LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBleGNsdWRlIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDEzLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotDQotCQkJaWYocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoIm9wZXJhdGlvbk5hbWUiKSkNCi0JCQl7DQotCQkJCWxvY2F0b3IgPSBwYXJhbVZhbHVlUGFpci5nZXRMb2NhdG9yKCk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBvcGVyYXRpb25OYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNTYzLCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBvcGVyYXRpb25OYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDIwLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotCQl9DQotDQotCQlJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gbWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIoImFubm90YXRlZFBhcmFtIik7DQotCQlJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFBhcmFtKHR5cGVQYXJhbWV0ZXIsICJvcmcuZWNsaXBzZS5kZW1vLk15UGFyYW1Bbm5vdGF0aW9uIik7DQotCQlsb2NhdG9yID0gaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uLmdldExvY2F0b3IoKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBNeVBhcmFtQW5ub3RhdGlvbiBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDY0OSwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIE15UGFyYW1Bbm5vdGF0aW9uIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDQzLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCXBhcm1WYWx1ZXMgPSBpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCk7DQotCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlUGFpciA6IHBhcm1WYWx1ZXMpDQotCQl7DQotCQkJaWYocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoIm5hbWUiKSkNCi0JCQl7DQotCQkJCWxvY2F0b3IgPSBwYXJhbVZhbHVlUGFpci5nZXRMb2NhdG9yKCk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBuYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNjY4LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBuYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDIzLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWluc3BlY3RlZFBhcmFtQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RQYXJhbSh0eXBlUGFyYW1ldGVyLCAiamF2YXguandzLldlYlBhcmFtIik7DQotCQlsb2NhdG9yID0gaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uLmdldExvY2F0b3IoKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBXZWJQYXJhbSBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDYxNiwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIFdlYlBhcmFtIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDMyLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCXBhcm1WYWx1ZXMgPSBpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCk7DQotCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlUGFpciA6IHBhcm1WYWx1ZXMpDQotCQl7DQotCQkJaWYocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoIm5hbWUiKSkNCi0JCQl7DQotCQkJCWxvY2F0b3IgPSBwYXJhbVZhbHVlUGFpci5nZXRMb2NhdG9yKCk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBuYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNjI2LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBuYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDIxLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbnNUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzE0MzNhNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Bbm5vdGF0aW9uSW5zcGVjdG9ySW1wbDsNCi0NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLmRlbW8iOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludC5zcmMiLCAiRW5kcG9pbnQiKTsNCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGVuZHBvaW50KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29tcGxleEFubm90YXRpb25RTlZhbHVlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlJVmFsdWUgcXYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUiKTsNCi0NCi0JCUlQYXJhbVZhbHVlUGFpciBwdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgcXYpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwYXJhbVZhbHVlcy5hZGQocHYpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJqYXZheC5qd3MuV2ViU2VydmljZSIsIHBhcmFtVmFsdWVzLCBlbmRwb2ludCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5ub3RhdGlvbiwgZW5kcG9pbnQpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpLnNpemUoKSA+IDApOw0KLQl9DQotDQotLy8JcHVibGljIHZvaWQgdGVzdEFkZFNpbmdsZUVsZW1lbnRBbm5vdGF0aW9uQXJyYXlWYWx1ZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotLy8Jew0KLS8vCQlJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU2luZ2xlRWxlbWVudEFubm90YXRpb24oImphdmF4Lmp3cy5XZWJTZXJ2aWNlIiwgbmV3IFN0cmluZ1tdIHsgInZhbDEiLCAidmFsMiIgfSk7DQotLy8JCWFubm90YXRpb24uYWRkVG9DbGFzcyhlbmRwb2ludCk7DQotLy8NCi0vLwkJYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uRmFjdG9yeS5nZXRBbm5vdGF0aW9uc0Zyb21DbGFzcyhlbmRwb2ludCkubGVuZ3RoID4gMCk7DQotLy8JfQ0KLS8vDQotLy8JcHVibGljIHZvaWQgdGVzdEFkZFNpbXBsZUFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotLy8Jew0KLS8vCQlJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU2ltcGxlQW5ub3RhdGlvbigiamF2YXguandzLldlYlNlcnZpY2UiKTsNCi0vLwkJYW5ub3RhdGlvbi5hZGRUb0NsYXNzKGVuZHBvaW50KTsNCi0vLw0KLS8vCQlhc3NlcnRUcnVlKEFubm90YXRpb25GYWN0b3J5LmdldEFubm90YXRpb25zRnJvbUNsYXNzKGVuZHBvaW50KS5sZW5ndGggPiAwKTsNCi0vLwl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGNvbXBsZXggYW5ub3RhdGlvbiBhbmQgYWRkcyBpdCB0byBjbGFzcy4gVGhlIGFubm90YXRpb24gaGFzIHRoZSBmb3JtOg0KLQkgKiANCi0JICogPHByZT4NCi0JICogCSBAV2ViU2VydmljZShzZXJ2aWNlTmFtZT0mcXVvdDtzZXJ2aWNlTmFtZSZxdW90OywNCi0JICogCSBuYW1lPSZxdW90O3BvcnRUeXBlTmFtZSZxdW90OywNCi0JICogCSB0YXJnZXROYW1lc3BhY2U9JnF1b3Q7aHR0cDovL2RlbW8uc2FwLmNvbS8mcXVvdDssDQotCSAqIAkgd3NkbExvY2F0aW9uPSZxdW90O2h0dHA6Ly93c2RsL3VybC8mcXVvdDssDQotCSAqIAkgcG9ydE5hbWU9JnF1b3Q7cG9ydE5hbWUmcXVvdDssDQotCSAqIAkgZW5kcG9pbnRJbnRlcmZhY2U9JnF1b3Q7b3JnLmVjbGlwc2UuZGVtby5JU2VpJnF1b3Q7KQ0KLQkgKiA8L3ByZT4NCi0JICogDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbXBsZXhDbGFzc0Fubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVzID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQ0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJzZXJ2aWNlTmFtZSIsICJzZXJ2aWNlTmFtZSIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJuYW1lIiwgInBvcnRUeXBlTmFtZSIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJ0YXJnZXROYW1lc3BhY2UiLCAiaHR0cDovL2RlbW8uc2FwLmNvbS8iKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAid3NkbExvY2F0aW9uIiwgImh0dHA6Ly93c2RsL3VybC8iKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAicG9ydE5hbWUiLCAicG9ydE5hbWUiKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAiZW5kcG9pbnRJbnRlcmZhY2UiLCAib3JnLmVjbGlwc2UuZGVtby5JU2VpIik7DQotDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImphdmF4Lmp3cy5XZWJTZXJ2aWNlIiwgcGFyYW1WYWx1ZXMsIGVuZHBvaW50KTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm5vdGF0aW9uLCBlbmRwb2ludCk7DQotDQotCQlBbm5vdGF0aW9uSW5zcGVjdG9ySW1wbCBhbm5vdGF0aW9uSW5zcGVjdG9yID0gbmV3IEFubm90YXRpb25JbnNwZWN0b3JJbXBsKGVuZHBvaW50KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiB0eXBlQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uSW5zcGVjdG9yLmluc3BlY3RUeXBlKCk7DQotDQotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOw0KLQkJZm9yIChJQW5ub3RhdGlvbjxJVHlwZT4gdHlwZUFubm90YXRpb24gOiB0eXBlQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJaWYodHlwZUFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImphdmF4Lmp3cy5XZWJTZXJ2aWNlIikgfHwgdHlwZUFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoIldlYlNlcnZpY2UiKSkNCi0JCQl7DQotCQkJCWlmKHR5cGVBbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSAhPSA2KQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighdHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgic2VydmljZU5hbWUiKS5lcXVhbHMoInNlcnZpY2VOYW1lIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCF0eXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJuYW1lIikuZXF1YWxzKCJwb3J0VHlwZU5hbWUiKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIXR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInRhcmdldE5hbWVzcGFjZSIpLmVxdWFscygiaHR0cDovL2RlbW8uc2FwLmNvbS8iKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIXR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIndzZGxMb2NhdGlvbiIpLmVxdWFscygiaHR0cDovL3dzZGwvdXJsLyIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighdHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgicG9ydE5hbWUiKS5lcXVhbHMoInBvcnROYW1lIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCF0eXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJlbmRwb2ludEludGVyZmFjZSIpLmVxdWFscygib3JnLmVjbGlwc2UuZGVtby5JU2VpIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkNCi0JCQkJcmVzdWx0ID0gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQlhc3NlcnRUcnVlKCJDbGFzcyBpcyBub3QgYW5ub3RhdGVkIGNvcnJlY3RseSIsIHJlc3VsdCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgY29tcGxleCBhbm5vdGF0aW9uIGFuZCBhZGRzIGl0IHRvIG1ldGhvZCBkZWNsYXJhdGlvbi4gQW5ub3RhdGlvbiBoYXMgdGhlIGZvcm06DQotCSAqIA0KLQkgKiA8cHJlPg0KLQkgKiAgXEBXZWJNZXRob2QoZXhjbHVkZT1mYWxzZSxvcGVyYXRpb25OYW1lPSZxdW90O2Fubm90YXRlZE1ldGhvZCZxdW90OyxhY3Rpb249JnF1b3Q7Z28mcXVvdDspCQ0KLQkgKiA8L3ByZT4NCi0JICogDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbXBsZXhNZXRob2RBbm5vdGF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0NCi0JCUlWYWx1ZSBlbVZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQm9vbGVhblZhbHVlKGZhbHNlKTsNCi0JCXBhcmFtVmFsdWVzLmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJleGNsdWRlIiwgZW1WYWx1ZSkpOw0KLQ0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJvcGVyYXRpb25OYW1lIiwgImFubm90YXRlZE1ldGhvZCIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJhY3Rpb24iLCAiZ28iKTsNCi0NCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJCQkNCi0JCUlBbm5vdGF0aW9uPElNZXRob2Q+IGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJqYXZheC5qd3MuV2ViTWV0aG9kIiwgcGFyYW1WYWx1ZXMsIG1ldGhvZCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5ub3RhdGlvbiwgbWV0aG9kKTsNCi0NCi0JCUFubm90YXRpb25JbnNwZWN0b3JJbXBsIGFubm90YXRpb25JbnNwZWN0b3IgPSBuZXcgQW5ub3RhdGlvbkluc3BlY3RvckltcGwoZW5kcG9pbnQpOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gbWV0aG9kQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uSW5zcGVjdG9yLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCSAJCQ0KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsNCi0JCWZvciAoSUFubm90YXRpb248SU1ldGhvZD4gbWV0aG9kQW5ub3RhdGlvbiA6IG1ldGhvZEFubm90YXRpb25zKQ0KLQkJew0KLQkJCWlmKG1ldGhvZEFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImphdmF4Lmp3cy5XZWJNZXRob2QiKSB8fCBtZXRob2RBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJXZWJNZXRob2QiKSkNCi0JCQl7DQotCQkJCWlmKG1ldGhvZEFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpICE9IDMpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCFtZXRob2RBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImV4Y2x1ZGUiKS5lcXVhbHMoImZhbHNlIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCFtZXRob2RBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm9wZXJhdGlvbk5hbWUiKS5lcXVhbHMoImFubm90YXRlZE1ldGhvZCIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighbWV0aG9kQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhY3Rpb24iKS5lcXVhbHMoImdvIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkNCi0JCQkJcmVzdWx0ID0gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQlhc3NlcnRUcnVlKCJNZXRob2QgaXMgbm90IGFubm90YXRlZCBjb3JyZWN0bHkiLCByZXN1bHQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGNvbXBsZXggYW5ub3RhdGlvbiBhbmQgYWRkcyBpdCB0byBhIG1ldGhvZCBwYXJhbWV0ZXIuIFRoZSBhbm5vdGF0aW9uIGhhcyB0aGUgZm9ybToNCi0JICogDQotCSAqIDxwcmU+DQotCSAqICBcQFdlYlBhcmFtKG9wZXJhdGlvbk5hbWU9JnF1b3Q7YW5ub3RhdGVkUGFyYW0mcXVvdDssIHRhcmdldE5hbWVzcGFjZT0mcXVvdDtodHRwOi8vZGVtby5zYXAuY29tL3BhcmFtcy8mcXVvdDssIHBhcnROYW1lPSZxdW90O3BhcnROYW1lJnF1b3Q7KQ0KLQkgKiA8L3ByZT4NCi0JICogDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbXBsZXhQYXJhbUFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKCJhbm5vdGF0ZWRQYXJhbSIpOw0KLQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotDQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgImFubm90YXRlZFBhcmFtIiwgInBhcmFtIik7DQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgInRhcmdldE5hbWVzcGFjZSIsICJodHRwOi8vZGVtby5zYXAuY29tL3BhcmFtcy8iKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAicGFydE5hbWUiLCAicGFydE5hbWUiKTsNCi0NCi0JCUlBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiamF2YXguandzLldlYlBhcmFtIiwgcGFyYW1WYWx1ZXMsIHR5cGVQYXJhbWV0ZXIpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubm90YXRpb24sIHR5cGVQYXJhbWV0ZXIpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBhZGRTdHJpbmdQcm9wZXJ0eShTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcywgU3RyaW5nIHByb3BlcnR5LCBTdHJpbmcgdmFsdWUpDQotCXsNCi0JCUlWYWx1ZSBwVmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSh2YWx1ZSk7DQotCQlJUGFyYW1WYWx1ZVBhaXIgcGFpciA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUocHJvcGVydHksIHBWYWx1ZSk7DQotCQlwYXJhbVZhbHVlcy5hZGQocGFpcik7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQXJyYXlWYWx1ZUltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9BcnJheVZhbHVlSW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmY1ZTRkZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9BcnJheVZhbHVlSW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5BcnJheVZhbHVlSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuU3RyaW5nVmFsdWVJbXBsOw0KLQ0KLXB1YmxpYyBjbGFzcyBBcnJheVZhbHVlSW1wbFRlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gInNyYyI7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAib3JnLmVjbGlwc2UuZGVtbyI7DQotDQotCXByaXZhdGUgSVR5cGUgZW5kcG9pbnQ7DQotDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsNCi0JCWVuZHBvaW50ID0gY3JlYXRlQ2xhc3MoIkVuZHBvaW50LnNyYyIsICJFbmRwb2ludCIpOw0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZW5kcG9pbnQpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpDQotCXsNCi0JCVNldDxJVmFsdWU+IHZhbHVlczEgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotCQl2YWx1ZXMxLmNsZWFyKCk7DQotCQl2YWx1ZXMxLmFkZChuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWwxIikpOw0KLQkJQXJyYXlWYWx1ZUltcGwgYXYxID0gbmV3IEFycmF5VmFsdWVJbXBsKHZhbHVlczEpOw0KLQkJDQotCQlTZXQ8SVZhbHVlPiB2YWx1ZXMyID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJdmFsdWVzMi5jbGVhcigpOw0KLQkJdmFsdWVzMi5hZGQobmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsMiIpKTsNCi0JCUFycmF5VmFsdWVJbXBsIGF2MiA9IG5ldyBBcnJheVZhbHVlSW1wbCh2YWx1ZXMyKTsNCi0NCi0JCWFzc2VydFRydWUoYXYxLmhhc2hDb2RlKCkgIT0gYXYyLmhhc2hDb2RlKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheVZhbHVlSW1wbCgpDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCW5ldyBBcnJheVZhbHVlSW1wbChudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpDQotCXsNCi0JCVNldDxJVmFsdWU+IHZhbHVlczEgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotCQl2YWx1ZXMxLmNsZWFyKCk7DQotCQl2YWx1ZXMxLmFkZChuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWwxIikpOw0KLQkJQXJyYXlWYWx1ZUltcGwgYXYxID0gbmV3IEFycmF5VmFsdWVJbXBsKHZhbHVlczEpOw0KLQ0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzMiA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCXZhbHVlczIuY2xlYXIoKTsNCi0JCXZhbHVlczIuYWRkKG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbDIiKSk7DQotCQlBcnJheVZhbHVlSW1wbCBhdjIgPSBuZXcgQXJyYXlWYWx1ZUltcGwodmFsdWVzMik7DQotDQotCQlTZXQ8SVZhbHVlPiB2YWx1ZXMzID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJdmFsdWVzMy5jbGVhcigpOw0KLQkJdmFsdWVzMy5hZGQobmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsMSIpKTsNCi0JCUFycmF5VmFsdWVJbXBsIGF2MyA9IG5ldyBBcnJheVZhbHVlSW1wbCh2YWx1ZXMzKTsNCi0NCi0JCWFzc2VydEZhbHNlKGF2MS5lcXVhbHMobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2UoYXYxLmVxdWFscygxMjMpKTsNCi0JCWFzc2VydEZhbHNlKGF2MS5lcXVhbHMoYXYyKSk7DQotDQotCQlhc3NlcnRUcnVlKGF2MS5lcXVhbHMoYXYzKSk7DQotCQlhc3NlcnRUcnVlKGF2MS5lcXVhbHMoYXYxKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheXMoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwKCk7DQotCQkNCi0JCVNldDxJVmFsdWU+IHZhbHVlcyA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCXZhbHVlcy5jbGVhcigpOw0KLQkJdmFsdWVzLmFkZChuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWwxIikpOw0KLQkJdmFsdWVzLmFkZChuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWwyIikpOw0KLQkJQXJyYXlWYWx1ZUltcGwgYXYgPSBuZXcgQXJyYXlWYWx1ZUltcGwodmFsdWVzKTsNCi0JCQkJDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIGF2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uLCBlbmRwb2ludCk7DQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdHRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0dGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0dGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IHJlYWRBbm5vdGF0aW9uID0gYW5ub3RhdHRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJcmVhZEFubm90YXRpb24uZXF1YWxzKGFubik7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkucmVtb3ZlKGFubik7DQotCQlhbm5vdGF0dGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGFubm90YXR0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXR0aW9ucy5zaXplKCkgPT0gMCk7DQotDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQm9vbGVhblZhbHVlSW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Jvb2xlYW5WYWx1ZUltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkYWQ4ZWE4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Jvb2xlYW5WYWx1ZUltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5BcnJheVZhbHVlSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQm9vbGVhblZhbHVlSW1wbDsNCi0NCi1wdWJsaWMgY2xhc3MgQm9vbGVhblZhbHVlSW1wbFRlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gInNyYyI7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAib3JnLmVjbGlwc2UuZGVtbyI7DQotDQotCXByaXZhdGUgSVR5cGUgZW5kcG9pbnQ7DQotDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsNCi0JCWVuZHBvaW50ID0gY3JlYXRlQ2xhc3MoIkVuZHBvaW50LnNyYyIsICJFbmRwb2ludCIpOw0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZW5kcG9pbnQpOw0KLQl9DQotDQotDQotCXB1YmxpYyB2b2lkIHRlc3RCb29sZWFuVmFsdWVJbXBsKCkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJbmV3IEFycmF5VmFsdWVJbXBsKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbnMoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwKCk7DQotCQkNCi0JCUJvb2xlYW5WYWx1ZUltcGwgYnYgPSBuZXcgQm9vbGVhblZhbHVlSW1wbCh0cnVlKTsNCi0JCQkJDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIGJ2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uLCBlbmRwb2ludCk7DQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdHRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0dGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0dGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IHJlYWRBbm5vdGF0aW9uID0gYW5ub3RhdHRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJcmVhZEFubm90YXRpb24uZXF1YWxzKGFubik7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkucmVtb3ZlKGFubik7DQotCQlhbm5vdGF0dGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGFubm90YXR0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXR0aW9ucy5zaXplKCkgPT0gMCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3QoKQ0KLQl7DQotCQlCb29sZWFuVmFsdWVJbXBsIGJ2MSA9IG5ldyBCb29sZWFuVmFsdWVJbXBsKHRydWUpOw0KLQkJQm9vbGVhblZhbHVlSW1wbCBidjIgPSBuZXcgQm9vbGVhblZhbHVlSW1wbChmYWxzZSk7DQotCQlCb29sZWFuVmFsdWVJbXBsIGJ2MyA9IG5ldyBCb29sZWFuVmFsdWVJbXBsKHRydWUpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UoYnYxLmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShidjEuZXF1YWxzKDEyMykpOw0KLQkJYXNzZXJ0RmFsc2UoYnYxLmVxdWFscyhidjIpKTsNCi0NCi0JCWFzc2VydFRydWUoYnYxLmVxdWFscyhidjMpKTsNCi0JCWFzc2VydFRydWUoYnYxLmVxdWFscyhidjEpKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9DbGFzc1ZhbHVlSW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0NsYXNzVmFsdWVJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNDAwYTI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0NsYXNzVmFsdWVJbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuQ2xhc3NMb2FkaW5nVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25Xcml0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQ2xhc3NWYWx1ZUltcGw7DQotDQotcHVibGljIGNsYXNzIENsYXNzVmFsdWVJbXBsVGVzdCBleHRlbmRzIENsYXNzTG9hZGluZ1Rlc3QNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUkMgPSAic3JjIjsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDSyA9ICJvcmcuZWNsaXBzZS5kZW1vIjsNCi0NCi0JcHJpdmF0ZSBJVHlwZSBlbmRwb2ludDsNCi0NCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnQuc3JjIiwgIkVuZHBvaW50Iik7DQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChlbmRwb2ludCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEludGVnZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcCgpOw0KLQkJDQotCQlDbGFzc1ZhbHVlSW1wbCBjdiA9IG5ldyBDbGFzc1ZhbHVlSW1wbChlbmRwb2ludC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCQkJCQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBjdikpOw0KLQkJDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24iLCBwdiwgZW5kcG9pbnQpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubiwgZW5kcG9pbnQpOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXR0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdHRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdHRpb25zLnNpemUoKSA9PSAxKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiByZWFkQW5ub3RhdGlvbiA9IGFubm90YXR0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCXJlYWRBbm5vdGF0aW9uLmVxdWFscyhhbm4pOw0KLQkJYXNzZXJ0RXF1YWxzKGFubi5nZXRQcm9wZXJ0eVZhbHVlKCJwYXJhbSIpLnRvU3RyaW5nKCksIGVuZHBvaW50LmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUoYW5uKTsNCi0JCWFubm90YXR0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdHRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdHRpb25zLnNpemUoKSA9PSAwKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpDQotCXsNCi0JCUNsYXNzVmFsdWVJbXBsIGN2MSA9IG5ldyBDbGFzc1ZhbHVlSW1wbChlbmRwb2ludC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCQlDbGFzc1ZhbHVlSW1wbCBjdjIgPSBuZXcgQ2xhc3NWYWx1ZUltcGwobnVsbCk7DQotCQlDbGFzc1ZhbHVlSW1wbCBjdjMgPSBuZXcgQ2xhc3NWYWx1ZUltcGwoZW5kcG9pbnQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UoY3YxLmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShjdjEuZXF1YWxzKHRydWUpKTsNCi0JCWFzc2VydEZhbHNlKGN2MS5lcXVhbHMoY3YyKSk7DQotDQotCQlhc3NlcnRUcnVlKGN2MS5lcXVhbHMoY3YzKSk7DQotCQlhc3NlcnRUcnVlKGN2MS5lcXVhbHMoY3YxKSk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQ29tcGxleEFubm90YXRpb25JbXBsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQ29tcGxleEFubm90YXRpb25JbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZjU2ZDJkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0NvbXBsZXhBbm5vdGF0aW9uSW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLQ0KLXB1YmxpYyBjbGFzcyBDb21wbGV4QW5ub3RhdGlvbkltcGxUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlDQotewkNCi0JcHJpdmF0ZSBNb2NrPElUeXBlPiB0eXBlRWxlbWVudCA9IG1vY2soSVR5cGUuY2xhc3MpOw0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkNCi0Jew0KLQkJSVZhbHVlIHZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlIik7DQotCQlJUGFyYW1WYWx1ZVBhaXIgcHZwID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCB2YWx1ZSk7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXBhcmFtVmFsdWVzLmFkZChwdnApOw0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24xID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiYW5ub3RhdGlvbk5hbWUiLCBwYXJhbVZhbHVlcywgdHlwZUVsZW1lbnQucHJveHkoKSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbjIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJhbm5vdGF0aW9uTmFtZTIiLCBwYXJhbVZhbHVlcywgdHlwZUVsZW1lbnQucHJveHkoKSk7DQotDQotCQlhc3NlcnRUcnVlKGFubm90YXRpb24xLmhhc2hDb2RlKCkgIT0gYW5ub3RhdGlvbjIuaGFzaENvZGUoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpDQotCXsNCi0JCUlWYWx1ZSB2YWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJ2YWx1ZSIpOw0KLQkJSVBhcmFtVmFsdWVQYWlyIHB2cCA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgdmFsdWUpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwYXJhbVZhbHVlcy5hZGQocHZwKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uMSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImFubm90YXRpb25OYW1lIiwgcGFyYW1WYWx1ZXMsIHR5cGVFbGVtZW50LnByb3h5KCkpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24yID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiYW5ub3RhdGlvbk5hbWUyIiwgcGFyYW1WYWx1ZXMsIHR5cGVFbGVtZW50LnByb3h5KCkpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiYW5ub3RhdGlvbk5hbWUiLCBwYXJhbVZhbHVlcywgdHlwZUVsZW1lbnQucHJveHkoKSk7DQotDQotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uMS5lcXVhbHMoYW5ub3RhdGlvbjIpKTsNCi0JCWFzc2VydEZhbHNlKGFubm90YXRpb24xLmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uMS5lcXVhbHMoMTIzKSk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb24xLmVxdWFscyhhbm5vdGF0aW9uMykpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0VuZHBvaW50LnNyYyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0VuZHBvaW50LnNyYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGI2OTliNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9FbmRwb2ludC5zcmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9IldTSW1wbEJlYW5TZXJ2aWNlIiwgbmFtZT0iV1NJbXBsQmVhbiIsIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RlbW8vZWNsaXBzZS9vcmcvIiwgcG9ydE5hbWU9IldTSW1wbEJlYW5Qb3J0IikNCi1AU3RhdGVsZXNzDQotcHVibGljIGNsYXNzIEVuZHBvaW50DQotew0KLQlATXlBbm5vdGF0aW9uKG5hbWU9ImZpZWxkMSIpDQotCXB1YmxpYyBTdHJpbmcgZmllbGQxOw0KLQkNCi0JQFdlYk1ldGhvZChleGNsdWRlPWZhbHNlLG9wZXJhdGlvbk5hbWU9InRlc3QiKQ0KLQlwdWJsaWMgdm9pZCBhbm5vdGF0ZWRNZXRob2QoIEBXZWJQYXJhbShuYW1lPSJhbm5vdGF0ZWRQYXJhbSIpIFN0cmluZyBhbm5vdGF0ZWRQYXJhbSkgDQotCXsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9FbmRwb2ludEFubkluc3BlY3Rvci5zcmMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9FbmRwb2ludEFubkluc3BlY3Rvci5zcmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQyNTBkNTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvRW5kcG9pbnRBbm5JbnNwZWN0b3Iuc3JjCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXguandzLldlYkZpZWxkOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotDQotQE15QW5ub3RhdGlvbihteVZhbHVlPSJNeVN0cmluZyIpDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9IldTSW1wbEJlYW5TZXJ2aWNlIiwgbmFtZT0iV1NJbXBsQmVhbiIsIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RlbW8vZWNsaXBzZS9vcmcvIiwgcG9ydE5hbWU9IldTSW1wbEJlYW5Qb3J0IikNCi1AU3RhdGVsZXNzDQotcHVibGljIGNsYXNzIEVuZHBvaW50DQotew0KLQlATXlGaWVsZEFubm90YXRpb24obmFtZT0iZmllbGQxIikNCi0JQFdlYkZpZWxkKG5hbWU9Ik15RmllbGQiKQ0KLQlwdWJsaWMgU3RyaW5nIGZpZWxkMTsNCi0JDQotCUBNeU1ldGhvZEFubm90YXRpb24obmFtZT0iYW5ub3RhdGVkTWV0aG9kIikNCi0JQFdlYk1ldGhvZChleGNsdWRlPWZhbHNlLG9wZXJhdGlvbk5hbWU9InRlc3QiKQ0KLQlwdWJsaWMgdm9pZCBhbm5vdGF0ZWRNZXRob2QoIEBXZWJQYXJhbShuYW1lPSJhbm5vdGF0ZWRQYXJhbSIpIEBNeVBhcmFtQW5ub3RhdGlvbihuYW1lPSJhbm5vdGF0ZWRNeVBhcmFtIikgU3RyaW5nIGFubm90YXRlZFBhcmFtKSANCi0Jew0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0ludGVnZXJWYWx1ZUltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9JbnRlZ2VyVmFsdWVJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OGQ4Y2M2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0ludGVnZXJWYWx1ZUltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5JbnRlZ2VyVmFsdWVJbXBsOw0KLQ0KLXB1YmxpYyBjbGFzcyBJbnRlZ2VyVmFsdWVJbXBsVGVzdCBleHRlbmRzIENsYXNzTG9hZGluZ1Rlc3QNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUkMgPSAic3JjIjsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDSyA9ICJvcmcuZWNsaXBzZS5kZW1vIjsNCi0NCi0JcHJpdmF0ZSBJVHlwZSBlbmRwb2ludDsNCi0NCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnQuc3JjIiwgIkVuZHBvaW50Iik7DQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChlbmRwb2ludCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEludGVnZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcCgpOw0KLQkJDQotCQlJbnRlZ2VyVmFsdWVJbXBsIGl2ID0gbmV3IEludGVnZXJWYWx1ZUltcGwoIjEwIik7DQotCQkJCQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBpdikpOw0KLQkJDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24iLCBwdiwgZW5kcG9pbnQpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubiwgZW5kcG9pbnQpOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXR0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdHRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdHRpb25zLnNpemUoKSA9PSAxKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiByZWFkQW5ub3RhdGlvbiA9IGFubm90YXR0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCXJlYWRBbm5vdGF0aW9uLmVxdWFscyhhbm4pOw0KLQkJYXNzZXJ0RXF1YWxzKGFubi5nZXRQcm9wZXJ0eVZhbHVlKCJwYXJhbSIpLnRvU3RyaW5nKCksICIxMCIpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnJlbW92ZShhbm4pOw0KLQkJYW5ub3RhdHRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0dGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0dGlvbnMuc2l6ZSgpID09IDApOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0KCkNCi0Jew0KLQkJSW50ZWdlclZhbHVlSW1wbCBpdjEgPSBuZXcgSW50ZWdlclZhbHVlSW1wbCgiMTAiKTsNCi0JCUludGVnZXJWYWx1ZUltcGwgaXYyID0gbmV3IEludGVnZXJWYWx1ZUltcGwoIjExIik7DQotCQlJbnRlZ2VyVmFsdWVJbXBsIGl2MyA9IG5ldyBJbnRlZ2VyVmFsdWVJbXBsKCIxMCIpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UoaXYxLmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShpdjEuZXF1YWxzKHRydWUpKTsNCi0JCWFzc2VydEZhbHNlKGl2MS5lcXVhbHMoaXYyKSk7DQotDQotCQlhc3NlcnRUcnVlKGl2MS5lcXVhbHMoaXYzKSk7DQotCQlhc3NlcnRUcnVlKGl2MS5lcXVhbHMoaXYxKSk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvUGFyYW1WYWx1ZVBhaXJJbXBsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvUGFyYW1WYWx1ZVBhaXJJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMmViNjI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL1BhcmFtVmFsdWVQYWlySW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLlBhcmFtVmFsdWVQYWlySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuU3RyaW5nVmFsdWVJbXBsOw0KLQ0KLXB1YmxpYyBjbGFzcyBQYXJhbVZhbHVlUGFpckltcGxUZXN0IGV4dGVuZHMgVGVzdENhc2UNCi17DQotDQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpDQotCXsNCi0JCUlWYWx1ZSB2YWx1ZSA9IG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbHVlIik7DQotCQlQYXJhbVZhbHVlUGFpckltcGwgcHZwID0gbmV3IFBhcmFtVmFsdWVQYWlySW1wbCgicGFyYW0iLCB2YWx1ZSk7DQotDQotCQlJVmFsdWUgdmFsdWUxID0gbmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsdWUxIik7DQotCQlQYXJhbVZhbHVlUGFpckltcGwgcHZwMSA9IG5ldyBQYXJhbVZhbHVlUGFpckltcGwoInBhcmFtMSIsIHZhbHVlMSk7DQotDQotCQlhc3NlcnRGYWxzZShwdnAuaGFzaENvZGUoKSA9PSBwdnAxLmhhc2hDb2RlKCkpOw0KLQkJYXNzZXJ0RmFsc2UocHZwLmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShwdnAuZXF1YWxzKDEyMykpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3QoKQ0KLQl7DQotCQlJVmFsdWUgdmFsdWUgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWx1ZSIpOw0KLQkJUGFyYW1WYWx1ZVBhaXJJbXBsIHB2cCA9IG5ldyBQYXJhbVZhbHVlUGFpckltcGwoInBhcmFtIiwgdmFsdWUpOw0KLQ0KLQkJSVZhbHVlIHZhbHVlMSA9IG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbHVlIik7DQotCQlQYXJhbVZhbHVlUGFpckltcGwgcHZwMSA9IG5ldyBQYXJhbVZhbHVlUGFpckltcGwoInBhcmFtIiwgdmFsdWUxKTsNCi0NCi0JCUlWYWx1ZSB2YWx1ZTIgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWx1ZTIiKTsNCi0JCVBhcmFtVmFsdWVQYWlySW1wbCBwdnAyID0gbmV3IFBhcmFtVmFsdWVQYWlySW1wbCgicGFyYW0yIiwgdmFsdWUyKTsNCi0NCi0JCWFzc2VydFRydWUocHZwLmVxdWFscyhwdnAxKSk7DQotCQlhc3NlcnRGYWxzZShwdnAuZXF1YWxzKHB2cDIpKTsNCi0JCWFzc2VydFRydWUocHZwLmVxdWFscyhwdnApKTsNCi0NCi0JCWFzc2VydEZhbHNlKHB2cC5lcXVhbHMobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2UocHZwLmVxdWFscygxMjMpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9RdWFsaWZpZWROYW1lVmFsdWVJbXBsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvUXVhbGlmaWVkTmFtZVZhbHVlSW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDc2MTE5ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9RdWFsaWZpZWROYW1lVmFsdWVJbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLQ0KLXB1YmxpYyBjbGFzcyBRdWFsaWZpZWROYW1lVmFsdWVJbXBsVGVzdCBleHRlbmRzIFRlc3RDYXNlDQotew0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKQ0KLQl7DQotCQlJVmFsdWUgcXYxID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lMSIpOw0KLQkJSVZhbHVlIHF2MiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZSIpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UocXYxLmhhc2hDb2RlKCkgPT0gcXYyLmhhc2hDb2RlKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3QoKQ0KLQl7DQotCQlJVmFsdWUgcXYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUiKTsNCi0JCUlWYWx1ZSBxdjEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUxIik7DQotCQlJVmFsdWUgcXYyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lIik7DQotDQotCQlhc3NlcnRGYWxzZShxdi5lcXVhbHMocXYxKSk7DQotCQlhc3NlcnRUcnVlKHF2LmVxdWFscyhxdjIpKTsNCi0JCWFzc2VydFRydWUocXYuZXF1YWxzKHF2KSk7DQotCQlhc3NlcnRGYWxzZShxdi5lcXVhbHMobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2UocXYuZXF1YWxzKDEyMykpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL1N0cmluZ1ZhbHVlSW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL1N0cmluZ1ZhbHVlSW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWQxOWIwMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9TdHJpbmdWYWx1ZUltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5TdHJpbmdWYWx1ZUltcGw7DQotDQotcHVibGljIGNsYXNzIFN0cmluZ1ZhbHVlSW1wbFRlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gInNyYyI7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAib3JnLmVjbGlwc2UuZGVtbyI7DQotDQotCXByaXZhdGUgSVR5cGUgZW5kcG9pbnQ7DQotDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsNCi0JCWVuZHBvaW50ID0gY3JlYXRlQ2xhc3MoIkVuZHBvaW50LnNyYyIsICJFbmRwb2ludCIpOw0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZW5kcG9pbnQpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VycygpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXAoKTsNCi0JCQ0KLQkJU3RyaW5nVmFsdWVJbXBsIHN2ID0gbmV3IFN0cmluZ1ZhbHVlSW1wbCgiMTAiKTsNCi0JCQkJDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHN2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uLCBlbmRwb2ludCk7DQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdHRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0dGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0dGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IHJlYWRBbm5vdGF0aW9uID0gYW5ub3RhdHRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJcmVhZEFubm90YXRpb24uZXF1YWxzKGFubik7DQotCQlhc3NlcnRFcXVhbHMoYW5uLmdldFByb3BlcnR5VmFsdWUoInBhcmFtIikudG9TdHJpbmcoKSwgIjEwIik7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkucmVtb3ZlKGFubik7DQotCQlhbm5vdGF0dGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGFubm90YXR0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXR0aW9ucy5zaXplKCkgPT0gMCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3QoKQ0KLQl7DQotCQlTdHJpbmdWYWx1ZUltcGwgc3YxID0gbmV3IFN0cmluZ1ZhbHVlSW1wbCgiMTAiKTsNCi0JCVN0cmluZ1ZhbHVlSW1wbCBzdjIgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKCIxMSIpOw0KLQkJU3RyaW5nVmFsdWVJbXBsIHN2MyA9IG5ldyBTdHJpbmdWYWx1ZUltcGwoIjEwIik7DQotDQotCQlhc3NlcnRGYWxzZShzdjEuZXF1YWxzKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKHN2MS5lcXVhbHModHJ1ZSkpOw0KLQkJYXNzZXJ0RmFsc2Uoc3YxLmVxdWFscyhzdjIpKTsNCi0NCi0JCWFzc2VydFRydWUoc3YxLmVxdWFscyhzdjMpKTsNCi0JCWFzc2VydFRydWUoc3YxLmVxdWFscyhzdjEpKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9jbGF6ei9BU1RVdGlsc1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2NsYXp6L0FTVFV0aWxzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjQzOGVlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2NsYXp6L0FTVFV0aWxzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmNsYXp6Ow0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5maWxlcy5UZXN0RmlsZVV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5jbGF6ei5BU1RVdGlsczsNCi0NCi0vKioNCi0gKiBUZXN0cyBmb3Ige0BsaW5rIEFTVFV0aWxzfSBjbGFzcy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEFTVFV0aWxzVGVzdCBleHRlbmRzIFRlc3RDYXNlDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLnRlc3QiOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gDQotCQkJImltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOyIgKyAiXG4iICsNCi0JCQkicHVibGljIGNsYXNzIFRlc3QgeyIgKyAiXG4iICsNCi0JCQkiCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBuYW1lID0gXCJhcmVcIjsiICsgIlxuIiArDQotCQkJIiAgIHB1YmxpYyBUZXN0KCkge30iICsgIlxuIiArDQotCQkJIglwdWJsaWMgaW50IGNyZWF0ZUludCgpIHtyZXR1cm4gMDt9IiArICJcbiIgKw0KLQkJCSJ9IjsJDQotDQotCXByaXZhdGUgVGVzdFByb2plY3QgcHJvamVjdDsNCi0JDQotCXB1YmxpYyB2b2lkIG1hbnVhbFNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlwcm9qZWN0ID0gbmV3IFRlc3RQcm9qZWN0KCJKYXZhUHJval8iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOw0KLQkJcHJvamVjdC5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsNCi0JCQlwcm9qZWN0LmRpc3Bvc2UoKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUFTVEZpbGVOcGUoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRyeSB7DQotCQkJQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVBU1QoKEZpbGUpbnVsbCwgbnVsbCk7DQotCQl9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIF8pIHt9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUFTVEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIEZpbGUgdGVtcEphdmFGaWxlID0gY3JlYXRlVGVtcEphdmFGaWxlKCk7DQotCQlBU1ROb2RlIG5vZGUgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUFTVCh0ZW1wSmF2YUZpbGUsIG51bGwpOw0KLQkJYXNzZXJ0Tm90TnVsbChub2RlKTsNCi0JCWFzc2VydFRydWUobm9kZSBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7CQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBU1RJVHlwZU5wZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJdHJ5IHsNCi0JCQlBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgoSUNvbXBpbGF0aW9uVW5pdCludWxsLCBudWxsKTsNCi0JCX0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gXykge30NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUFTVElUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQltYW51YWxTZXRVcCgpOw0KLQkJZmluYWwgSVR5cGUgc291cmNlVHlwZSA9IHByb2plY3QuY3JlYXRlVHlwZShwcm9qZWN0LmNyZWF0ZVBhY2thZ2UoUENLKSwgIlRlc3QuamF2YSIsIFNSQyk7DQotCQlBU1ROb2RlIG5vZGUgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChzb3VyY2VUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCBudWxsKTsNCi0JCWFzc2VydE5vdE51bGwobm9kZSk7DQotCQlhc3NlcnRUcnVlKG5vZGUgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOw0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGVEZWNsYXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJbWFudWFsU2V0VXAoKTsNCi0JCWZpbmFsIElUeXBlIHNvdXJjZVR5cGUgPSBwcm9qZWN0LmNyZWF0ZVR5cGUocHJvamVjdC5jcmVhdGVQYWNrYWdlKFBDSyksICJUZXN0LmphdmEiLCBTUkMpOw0KLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChzb3VyY2VUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCBudWxsKTsNCi0JCQ0KLQkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gYWJzdHJhY3RUeXBlID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oIlRlc3QiLCB1bml0KTsNCi0JCWFzc2VydE5vdE51bGwoYWJzdHJhY3RUeXBlKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGVEZWNsYXJhdGlvbkZvcklubmVyVHlwZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJbWFudWFsU2V0VXAoKTsNCi0JCVN0cmluZyBzb3VyY2UgPSAicHVibGljIGNsYXNzIFRlc3QgeyIgKw0KLQkJCSJwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtZXRlcnMge30iICsNCi0JCSJ9IjsJCQ0KLQkJDQotCQlmaW5hbCBJVHlwZSBzb3VyY2VUeXBlID0gcHJvamVjdC5jcmVhdGVUeXBlKHByb2plY3QuY3JlYXRlUGFja2FnZShQQ0spLCAiVGVzdC5qYXZhIiwgc291cmNlKTsNCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQoc291cmNlVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgbnVsbCk7DQotCQkNCi0JCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGFic3RyYWN0VHlwZSA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCJQYXJhbWV0ZXJzIiwgdW5pdCk7DQotCQlhc3NlcnROb3ROdWxsKGFic3RyYWN0VHlwZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBGaWxlIGNyZWF0ZVRlbXBKYXZhRmlsZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJRmlsZSBkaXIgPSBUZXN0RmlsZVV0aWxzLmNyZWF0ZVRlbXBEaXJlY3RvcnkoIiIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7DQotCQlGaWxlIHRlbXBDbGFzc0ZpbGUgPSBuZXcgRmlsZShkaXIsICJUZXN0LmphdmEiKTsNCi0JCUZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcih0ZW1wQ2xhc3NGaWxlKTsNCi0JCWZ3LndyaXRlKCJwYWNrYWdlICIgKyBQQ0sgKyAiO1xuIiArIFNSQyk7DQotCQlmdy5jbG9zZSgpOw0KLQkJDQotCQlyZXR1cm4gdGVtcENsYXNzRmlsZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9tb2NrL0VuZHBvaW50Rm9ybWF0LnNyYyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL21vY2svRW5kcG9pbnRGb3JtYXQuc3JjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YmY2ZmI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL21vY2svRW5kcG9pbnRGb3JtYXQuc3JjCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotcHVibGljIGNsYXNzIEVuZHBvaW50e3B1YmxpYyBFbmRwb2ludCgpe31wdWJsaWMgdm9pZCB1c2VWb2lkKCl7fXB1YmxpYyBTdHJpbmcgZWNob1N0cmluZyhTdHJpbmcgcyl7cmV0dXJuIHN9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5qbW9jay8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmptb2NrLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlZTA1MGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmptb2NrLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9ImxpYi9qbW9jay1jb3JlLTEuMi4wLmphciIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuam1vY2svLnByb2plY3QgYi90ZXN0cy9vcmcuam1vY2svLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzZjZiNDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmptb2NrLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuam1vY2s8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuam1vY2svLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmptb2NrLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzYxMTA3OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuam1vY2svLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jVHVlIEp1biAyMyAxODo0MTo1NSBFRVNUIDIwMDkNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5qbW9jay9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5qbW9jay9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzFlMzQ3OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuam1vY2svTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmp1bml0O3Zpc2liaWxpdHk6PXJlZXhwb3J0DQotRXhwb3J0LVBhY2thZ2U6IG9yZy5qbW9jaywNCi0gb3JnLmptb2NrLmJ1aWxkZXIsDQotIG9yZy5qbW9jay5jb3JlLA0KLSBvcmcuam1vY2suY29yZS5jb25zdHJhaW50LA0KLSBvcmcuam1vY2suY29yZS5tYXRjaGVyLA0KLSBvcmcuam1vY2suY29yZS5zdHViLA0KLSBvcmcuam1vY2suZXhwZWN0YXRpb24sDQotIG9yZy5qbW9jay51dGlsDQotQnVuZGxlLVZlbmRvcjogb3JnLmptb2NrDQotQnVuZGxlLUNsYXNzUGF0aDogbGliL2ptb2NrLWNvcmUtMS4yLjAuamFyDQotQnVuZGxlLVZlcnNpb246IDEuMi4wDQotRWNsaXBzZS1CdWRkeVBvbGljeTogZ2xvYmFsDQotQnVuZGxlLU5hbWU6IEpNb2NrDQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5qbW9jaztzaW5nbGV0b246PXRydWUNCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUNCi0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuam1vY2svYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5qbW9jay9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmI3YWNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5qbW9jay9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkF1Z3VzdCAyMCwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5qbW9jay9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmptb2NrL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwMmYxYzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmptb2NrL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGxpYi8sXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcw0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5qbW9jay9saWIvam1vY2stY29yZS0xLjIuMC5qYXIgYi90ZXN0cy9vcmcuam1vY2svbGliL2ptb2NrLWNvcmUtMS4yLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOWQzMTdmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5qbW9jay9saWIvam1vY2stY29yZS0xLjIuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCg==